/*
 * Copyright 2020 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
 *
 *     https://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.
 */
// Generated by the protocol buffer compiler.  DO NOT EDIT!
// source: google/identity/accesscontextmanager/v1/access_level.proto

package com.google.identity.accesscontextmanager.v1;

/**
 *
 *
 * <pre>
 * `DevicePolicy` specifies device specific restrictions necessary to acquire a
 * given access level. A `DevicePolicy` specifies requirements for requests from
 * devices to be granted access levels, it does not do any enforcement on the
 * device. `DevicePolicy` acts as an AND over all specified fields, and each
 * repeated field is an OR over its elements. Any unset fields are ignored. For
 * example, if the proto is { os_type : DESKTOP_WINDOWS, os_type :
 * DESKTOP_LINUX, encryption_status: ENCRYPTED}, then the DevicePolicy will be
 * true for requests originating from encrypted Linux desktops and encrypted
 * Windows desktops.
 * </pre>
 *
 * Protobuf type {@code google.identity.accesscontextmanager.v1.DevicePolicy}
 */
public final class DevicePolicy extends com.google.protobuf.GeneratedMessageV3
    implements
    // @@protoc_insertion_point(message_implements:google.identity.accesscontextmanager.v1.DevicePolicy)
    DevicePolicyOrBuilder {
  private static final long serialVersionUID = 0L;
  // Use DevicePolicy.newBuilder() to construct.
  private DevicePolicy(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
    super(builder);
  }

  private DevicePolicy() {
    allowedEncryptionStatuses_ = java.util.Collections.emptyList();
    osConstraints_ = java.util.Collections.emptyList();
    allowedDeviceManagementLevels_ = java.util.Collections.emptyList();
  }

  @java.lang.Override
  @SuppressWarnings({"unused"})
  protected java.lang.Object newInstance(UnusedPrivateParameter unused) {
    return new DevicePolicy();
  }

  @java.lang.Override
  public final com.google.protobuf.UnknownFieldSet getUnknownFields() {
    return this.unknownFields;
  }

  public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
    return com.google.identity.accesscontextmanager.v1.AccessLevelProto
        .internal_static_google_identity_accesscontextmanager_v1_DevicePolicy_descriptor;
  }

  @java.lang.Override
  protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internalGetFieldAccessorTable() {
    return com.google.identity.accesscontextmanager.v1.AccessLevelProto
        .internal_static_google_identity_accesscontextmanager_v1_DevicePolicy_fieldAccessorTable
        .ensureFieldAccessorsInitialized(
            com.google.identity.accesscontextmanager.v1.DevicePolicy.class,
            com.google.identity.accesscontextmanager.v1.DevicePolicy.Builder.class);
  }

  public static final int REQUIRE_SCREENLOCK_FIELD_NUMBER = 1;
  private boolean requireScreenlock_ = false;
  /**
   *
   *
   * <pre>
   * Whether or not screenlock is required for the DevicePolicy to be true.
   * Defaults to `false`.
   * </pre>
   *
   * <code>bool require_screenlock = 1;</code>
   *
   * @return The requireScreenlock.
   */
  @java.lang.Override
  public boolean getRequireScreenlock() {
    return requireScreenlock_;
  }

  public static final int ALLOWED_ENCRYPTION_STATUSES_FIELD_NUMBER = 2;

  @SuppressWarnings("serial")
  private java.util.List<java.lang.Integer> allowedEncryptionStatuses_;

  private static final com.google.protobuf.Internal.ListAdapter.Converter<
          java.lang.Integer, com.google.identity.accesscontextmanager.type.DeviceEncryptionStatus>
      allowedEncryptionStatuses_converter_ =
          new com.google.protobuf.Internal.ListAdapter.Converter<
              java.lang.Integer,
              com.google.identity.accesscontextmanager.type.DeviceEncryptionStatus>() {
            public com.google.identity.accesscontextmanager.type.DeviceEncryptionStatus convert(
                java.lang.Integer from) {
              com.google.identity.accesscontextmanager.type.DeviceEncryptionStatus result =
                  com.google.identity.accesscontextmanager.type.DeviceEncryptionStatus.forNumber(
                      from);
              return result == null
                  ? com.google.identity.accesscontextmanager.type.DeviceEncryptionStatus
                      .UNRECOGNIZED
                  : result;
            }
          };
  /**
   *
   *
   * <pre>
   * Allowed encryptions statuses, an empty list allows all statuses.
   * </pre>
   *
   * <code>
   * repeated .google.identity.accesscontextmanager.type.DeviceEncryptionStatus allowed_encryption_statuses = 2;
   * </code>
   *
   * @return A list containing the allowedEncryptionStatuses.
   */
  @java.lang.Override
  public java.util.List<com.google.identity.accesscontextmanager.type.DeviceEncryptionStatus>
      getAllowedEncryptionStatusesList() {
    return new com.google.protobuf.Internal.ListAdapter<
        java.lang.Integer, com.google.identity.accesscontextmanager.type.DeviceEncryptionStatus>(
        allowedEncryptionStatuses_, allowedEncryptionStatuses_converter_);
  }
  /**
   *
   *
   * <pre>
   * Allowed encryptions statuses, an empty list allows all statuses.
   * </pre>
   *
   * <code>
   * repeated .google.identity.accesscontextmanager.type.DeviceEncryptionStatus allowed_encryption_statuses = 2;
   * </code>
   *
   * @return The count of allowedEncryptionStatuses.
   */
  @java.lang.Override
  public int getAllowedEncryptionStatusesCount() {
    return allowedEncryptionStatuses_.size();
  }
  /**
   *
   *
   * <pre>
   * Allowed encryptions statuses, an empty list allows all statuses.
   * </pre>
   *
   * <code>
   * repeated .google.identity.accesscontextmanager.type.DeviceEncryptionStatus allowed_encryption_statuses = 2;
   * </code>
   *
   * @param index The index of the element to return.
   * @return The allowedEncryptionStatuses at the given index.
   */
  @java.lang.Override
  public com.google.identity.accesscontextmanager.type.DeviceEncryptionStatus
      getAllowedEncryptionStatuses(int index) {
    return allowedEncryptionStatuses_converter_.convert(allowedEncryptionStatuses_.get(index));
  }
  /**
   *
   *
   * <pre>
   * Allowed encryptions statuses, an empty list allows all statuses.
   * </pre>
   *
   * <code>
   * repeated .google.identity.accesscontextmanager.type.DeviceEncryptionStatus allowed_encryption_statuses = 2;
   * </code>
   *
   * @return A list containing the enum numeric values on the wire for allowedEncryptionStatuses.
   */
  @java.lang.Override
  public java.util.List<java.lang.Integer> getAllowedEncryptionStatusesValueList() {
    return allowedEncryptionStatuses_;
  }
  /**
   *
   *
   * <pre>
   * Allowed encryptions statuses, an empty list allows all statuses.
   * </pre>
   *
   * <code>
   * repeated .google.identity.accesscontextmanager.type.DeviceEncryptionStatus allowed_encryption_statuses = 2;
   * </code>
   *
   * @param index The index of the value to return.
   * @return The enum numeric value on the wire of allowedEncryptionStatuses at the given index.
   */
  @java.lang.Override
  public int getAllowedEncryptionStatusesValue(int index) {
    return allowedEncryptionStatuses_.get(index);
  }

  private int allowedEncryptionStatusesMemoizedSerializedSize;

  public static final int OS_CONSTRAINTS_FIELD_NUMBER = 3;

  @SuppressWarnings("serial")
  private java.util.List<com.google.identity.accesscontextmanager.v1.OsConstraint> osConstraints_;
  /**
   *
   *
   * <pre>
   * Allowed OS versions, an empty list allows all types and all versions.
   * </pre>
   *
   * <code>repeated .google.identity.accesscontextmanager.v1.OsConstraint os_constraints = 3;</code>
   */
  @java.lang.Override
  public java.util.List<com.google.identity.accesscontextmanager.v1.OsConstraint>
      getOsConstraintsList() {
    return osConstraints_;
  }
  /**
   *
   *
   * <pre>
   * Allowed OS versions, an empty list allows all types and all versions.
   * </pre>
   *
   * <code>repeated .google.identity.accesscontextmanager.v1.OsConstraint os_constraints = 3;</code>
   */
  @java.lang.Override
  public java.util.List<? extends com.google.identity.accesscontextmanager.v1.OsConstraintOrBuilder>
      getOsConstraintsOrBuilderList() {
    return osConstraints_;
  }
  /**
   *
   *
   * <pre>
   * Allowed OS versions, an empty list allows all types and all versions.
   * </pre>
   *
   * <code>repeated .google.identity.accesscontextmanager.v1.OsConstraint os_constraints = 3;</code>
   */
  @java.lang.Override
  public int getOsConstraintsCount() {
    return osConstraints_.size();
  }
  /**
   *
   *
   * <pre>
   * Allowed OS versions, an empty list allows all types and all versions.
   * </pre>
   *
   * <code>repeated .google.identity.accesscontextmanager.v1.OsConstraint os_constraints = 3;</code>
   */
  @java.lang.Override
  public com.google.identity.accesscontextmanager.v1.OsConstraint getOsConstraints(int index) {
    return osConstraints_.get(index);
  }
  /**
   *
   *
   * <pre>
   * Allowed OS versions, an empty list allows all types and all versions.
   * </pre>
   *
   * <code>repeated .google.identity.accesscontextmanager.v1.OsConstraint os_constraints = 3;</code>
   */
  @java.lang.Override
  public com.google.identity.accesscontextmanager.v1.OsConstraintOrBuilder
      getOsConstraintsOrBuilder(int index) {
    return osConstraints_.get(index);
  }

  public static final int ALLOWED_DEVICE_MANAGEMENT_LEVELS_FIELD_NUMBER = 6;

  @SuppressWarnings("serial")
  private java.util.List<java.lang.Integer> allowedDeviceManagementLevels_;

  private static final com.google.protobuf.Internal.ListAdapter.Converter<
          java.lang.Integer, com.google.identity.accesscontextmanager.type.DeviceManagementLevel>
      allowedDeviceManagementLevels_converter_ =
          new com.google.protobuf.Internal.ListAdapter.Converter<
              java.lang.Integer,
              com.google.identity.accesscontextmanager.type.DeviceManagementLevel>() {
            public com.google.identity.accesscontextmanager.type.DeviceManagementLevel convert(
                java.lang.Integer from) {
              com.google.identity.accesscontextmanager.type.DeviceManagementLevel result =
                  com.google.identity.accesscontextmanager.type.DeviceManagementLevel.forNumber(
                      from);
              return result == null
                  ? com.google.identity.accesscontextmanager.type.DeviceManagementLevel.UNRECOGNIZED
                  : result;
            }
          };
  /**
   *
   *
   * <pre>
   * Allowed device management levels, an empty list allows all management
   * levels.
   * </pre>
   *
   * <code>
   * repeated .google.identity.accesscontextmanager.type.DeviceManagementLevel allowed_device_management_levels = 6;
   * </code>
   *
   * @return A list containing the allowedDeviceManagementLevels.
   */
  @java.lang.Override
  public java.util.List<com.google.identity.accesscontextmanager.type.DeviceManagementLevel>
      getAllowedDeviceManagementLevelsList() {
    return new com.google.protobuf.Internal.ListAdapter<
        java.lang.Integer, com.google.identity.accesscontextmanager.type.DeviceManagementLevel>(
        allowedDeviceManagementLevels_, allowedDeviceManagementLevels_converter_);
  }
  /**
   *
   *
   * <pre>
   * Allowed device management levels, an empty list allows all management
   * levels.
   * </pre>
   *
   * <code>
   * repeated .google.identity.accesscontextmanager.type.DeviceManagementLevel allowed_device_management_levels = 6;
   * </code>
   *
   * @return The count of allowedDeviceManagementLevels.
   */
  @java.lang.Override
  public int getAllowedDeviceManagementLevelsCount() {
    return allowedDeviceManagementLevels_.size();
  }
  /**
   *
   *
   * <pre>
   * Allowed device management levels, an empty list allows all management
   * levels.
   * </pre>
   *
   * <code>
   * repeated .google.identity.accesscontextmanager.type.DeviceManagementLevel allowed_device_management_levels = 6;
   * </code>
   *
   * @param index The index of the element to return.
   * @return The allowedDeviceManagementLevels at the given index.
   */
  @java.lang.Override
  public com.google.identity.accesscontextmanager.type.DeviceManagementLevel
      getAllowedDeviceManagementLevels(int index) {
    return allowedDeviceManagementLevels_converter_.convert(
        allowedDeviceManagementLevels_.get(index));
  }
  /**
   *
   *
   * <pre>
   * Allowed device management levels, an empty list allows all management
   * levels.
   * </pre>
   *
   * <code>
   * repeated .google.identity.accesscontextmanager.type.DeviceManagementLevel allowed_device_management_levels = 6;
   * </code>
   *
   * @return A list containing the enum numeric values on the wire for
   *     allowedDeviceManagementLevels.
   */
  @java.lang.Override
  public java.util.List<java.lang.Integer> getAllowedDeviceManagementLevelsValueList() {
    return allowedDeviceManagementLevels_;
  }
  /**
   *
   *
   * <pre>
   * Allowed device management levels, an empty list allows all management
   * levels.
   * </pre>
   *
   * <code>
   * repeated .google.identity.accesscontextmanager.type.DeviceManagementLevel allowed_device_management_levels = 6;
   * </code>
   *
   * @param index The index of the value to return.
   * @return The enum numeric value on the wire of allowedDeviceManagementLevels at the given index.
   */
  @java.lang.Override
  public int getAllowedDeviceManagementLevelsValue(int index) {
    return allowedDeviceManagementLevels_.get(index);
  }

  private int allowedDeviceManagementLevelsMemoizedSerializedSize;

  public static final int REQUIRE_ADMIN_APPROVAL_FIELD_NUMBER = 7;
  private boolean requireAdminApproval_ = false;
  /**
   *
   *
   * <pre>
   * Whether the device needs to be approved by the customer admin.
   * </pre>
   *
   * <code>bool require_admin_approval = 7;</code>
   *
   * @return The requireAdminApproval.
   */
  @java.lang.Override
  public boolean getRequireAdminApproval() {
    return requireAdminApproval_;
  }

  public static final int REQUIRE_CORP_OWNED_FIELD_NUMBER = 8;
  private boolean requireCorpOwned_ = false;
  /**
   *
   *
   * <pre>
   * Whether the device needs to be corp owned.
   * </pre>
   *
   * <code>bool require_corp_owned = 8;</code>
   *
   * @return The requireCorpOwned.
   */
  @java.lang.Override
  public boolean getRequireCorpOwned() {
    return requireCorpOwned_;
  }

  private byte memoizedIsInitialized = -1;

  @java.lang.Override
  public final boolean isInitialized() {
    byte isInitialized = memoizedIsInitialized;
    if (isInitialized == 1) return true;
    if (isInitialized == 0) return false;

    memoizedIsInitialized = 1;
    return true;
  }

  @java.lang.Override
  public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
    getSerializedSize();
    if (requireScreenlock_ != false) {
      output.writeBool(1, requireScreenlock_);
    }
    if (getAllowedEncryptionStatusesList().size() > 0) {
      output.writeUInt32NoTag(18);
      output.writeUInt32NoTag(allowedEncryptionStatusesMemoizedSerializedSize);
    }
    for (int i = 0; i < allowedEncryptionStatuses_.size(); i++) {
      output.writeEnumNoTag(allowedEncryptionStatuses_.get(i));
    }
    for (int i = 0; i < osConstraints_.size(); i++) {
      output.writeMessage(3, osConstraints_.get(i));
    }
    if (getAllowedDeviceManagementLevelsList().size() > 0) {
      output.writeUInt32NoTag(50);
      output.writeUInt32NoTag(allowedDeviceManagementLevelsMemoizedSerializedSize);
    }
    for (int i = 0; i < allowedDeviceManagementLevels_.size(); i++) {
      output.writeEnumNoTag(allowedDeviceManagementLevels_.get(i));
    }
    if (requireAdminApproval_ != false) {
      output.writeBool(7, requireAdminApproval_);
    }
    if (requireCorpOwned_ != false) {
      output.writeBool(8, requireCorpOwned_);
    }
    getUnknownFields().writeTo(output);
  }

  @java.lang.Override
  public int getSerializedSize() {
    int size = memoizedSize;
    if (size != -1) return size;

    size = 0;
    if (requireScreenlock_ != false) {
      size += com.google.protobuf.CodedOutputStream.computeBoolSize(1, requireScreenlock_);
    }
    {
      int dataSize = 0;
      for (int i = 0; i < allowedEncryptionStatuses_.size(); i++) {
        dataSize +=
            com.google.protobuf.CodedOutputStream.computeEnumSizeNoTag(
                allowedEncryptionStatuses_.get(i));
      }
      size += dataSize;
      if (!getAllowedEncryptionStatusesList().isEmpty()) {
        size += 1;
        size += com.google.protobuf.CodedOutputStream.computeUInt32SizeNoTag(dataSize);
      }
      allowedEncryptionStatusesMemoizedSerializedSize = dataSize;
    }
    for (int i = 0; i < osConstraints_.size(); i++) {
      size += com.google.protobuf.CodedOutputStream.computeMessageSize(3, osConstraints_.get(i));
    }
    {
      int dataSize = 0;
      for (int i = 0; i < allowedDeviceManagementLevels_.size(); i++) {
        dataSize +=
            com.google.protobuf.CodedOutputStream.computeEnumSizeNoTag(
                allowedDeviceManagementLevels_.get(i));
      }
      size += dataSize;
      if (!getAllowedDeviceManagementLevelsList().isEmpty()) {
        size += 1;
        size += com.google.protobuf.CodedOutputStream.computeUInt32SizeNoTag(dataSize);
      }
      allowedDeviceManagementLevelsMemoizedSerializedSize = dataSize;
    }
    if (requireAdminApproval_ != false) {
      size += com.google.protobuf.CodedOutputStream.computeBoolSize(7, requireAdminApproval_);
    }
    if (requireCorpOwned_ != false) {
      size += com.google.protobuf.CodedOutputStream.computeBoolSize(8, requireCorpOwned_);
    }
    size += getUnknownFields().getSerializedSize();
    memoizedSize = size;
    return size;
  }

  @java.lang.Override
  public boolean equals(final java.lang.Object obj) {
    if (obj == this) {
      return true;
    }
    if (!(obj instanceof com.google.identity.accesscontextmanager.v1.DevicePolicy)) {
      return super.equals(obj);
    }
    com.google.identity.accesscontextmanager.v1.DevicePolicy other =
        (com.google.identity.accesscontextmanager.v1.DevicePolicy) obj;

    if (getRequireScreenlock() != other.getRequireScreenlock()) return false;
    if (!allowedEncryptionStatuses_.equals(other.allowedEncryptionStatuses_)) return false;
    if (!getOsConstraintsList().equals(other.getOsConstraintsList())) return false;
    if (!allowedDeviceManagementLevels_.equals(other.allowedDeviceManagementLevels_)) return false;
    if (getRequireAdminApproval() != other.getRequireAdminApproval()) return false;
    if (getRequireCorpOwned() != other.getRequireCorpOwned()) return false;
    if (!getUnknownFields().equals(other.getUnknownFields())) return false;
    return true;
  }

  @java.lang.Override
  public int hashCode() {
    if (memoizedHashCode != 0) {
      return memoizedHashCode;
    }
    int hash = 41;
    hash = (19 * hash) + getDescriptor().hashCode();
    hash = (37 * hash) + REQUIRE_SCREENLOCK_FIELD_NUMBER;
    hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(getRequireScreenlock());
    if (getAllowedEncryptionStatusesCount() > 0) {
      hash = (37 * hash) + ALLOWED_ENCRYPTION_STATUSES_FIELD_NUMBER;
      hash = (53 * hash) + allowedEncryptionStatuses_.hashCode();
    }
    if (getOsConstraintsCount() > 0) {
      hash = (37 * hash) + OS_CONSTRAINTS_FIELD_NUMBER;
      hash = (53 * hash) + getOsConstraintsList().hashCode();
    }
    if (getAllowedDeviceManagementLevelsCount() > 0) {
      hash = (37 * hash) + ALLOWED_DEVICE_MANAGEMENT_LEVELS_FIELD_NUMBER;
      hash = (53 * hash) + allowedDeviceManagementLevels_.hashCode();
    }
    hash = (37 * hash) + REQUIRE_ADMIN_APPROVAL_FIELD_NUMBER;
    hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(getRequireAdminApproval());
    hash = (37 * hash) + REQUIRE_CORP_OWNED_FIELD_NUMBER;
    hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(getRequireCorpOwned());
    hash = (29 * hash) + getUnknownFields().hashCode();
    memoizedHashCode = hash;
    return hash;
  }

  public static com.google.identity.accesscontextmanager.v1.DevicePolicy parseFrom(
      java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException {
    return PARSER.parseFrom(data);
  }

  public static com.google.identity.accesscontextmanager.v1.DevicePolicy parseFrom(
      java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
      throws com.google.protobuf.InvalidProtocolBufferException {
    return PARSER.parseFrom(data, extensionRegistry);
  }

  public static com.google.identity.accesscontextmanager.v1.DevicePolicy parseFrom(
      com.google.protobuf.ByteString data)
      throws com.google.protobuf.InvalidProtocolBufferException {
    return PARSER.parseFrom(data);
  }

  public static com.google.identity.accesscontextmanager.v1.DevicePolicy parseFrom(
      com.google.protobuf.ByteString data,
      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
      throws com.google.protobuf.InvalidProtocolBufferException {
    return PARSER.parseFrom(data, extensionRegistry);
  }

  public static com.google.identity.accesscontextmanager.v1.DevicePolicy parseFrom(byte[] data)
      throws com.google.protobuf.InvalidProtocolBufferException {
    return PARSER.parseFrom(data);
  }

  public static com.google.identity.accesscontextmanager.v1.DevicePolicy parseFrom(
      byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
      throws com.google.protobuf.InvalidProtocolBufferException {
    return PARSER.parseFrom(data, extensionRegistry);
  }

  public static com.google.identity.accesscontextmanager.v1.DevicePolicy parseFrom(
      java.io.InputStream input) throws java.io.IOException {
    return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
  }

  public static com.google.identity.accesscontextmanager.v1.DevicePolicy parseFrom(
      java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
      throws java.io.IOException {
    return com.google.protobuf.GeneratedMessageV3.parseWithIOException(
        PARSER, input, extensionRegistry);
  }

  public static com.google.identity.accesscontextmanager.v1.DevicePolicy parseDelimitedFrom(
      java.io.InputStream input) throws java.io.IOException {
    return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input);
  }

  public static com.google.identity.accesscontextmanager.v1.DevicePolicy parseDelimitedFrom(
      java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry)
      throws java.io.IOException {
    return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(
        PARSER, input, extensionRegistry);
  }

  public static com.google.identity.accesscontextmanager.v1.DevicePolicy parseFrom(
      com.google.protobuf.CodedInputStream input) throws java.io.IOException {
    return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input);
  }

  public static com.google.identity.accesscontextmanager.v1.DevicePolicy parseFrom(
      com.google.protobuf.CodedInputStream input,
      com.google.protobuf.ExtensionRegistryLite extensionRegistry)
      throws java.io.IOException {
    return com.google.protobuf.GeneratedMessageV3.parseWithIOException(
        PARSER, input, extensionRegistry);
  }

  @java.lang.Override
  public Builder newBuilderForType() {
    return newBuilder();
  }

  public static Builder newBuilder() {
    return DEFAULT_INSTANCE.toBuilder();
  }

  public static Builder newBuilder(
      com.google.identity.accesscontextmanager.v1.DevicePolicy prototype) {
    return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
  }

  @java.lang.Override
  public Builder toBuilder() {
    return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this);
  }

  @java.lang.Override
  protected Builder newBuilderForType(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
    Builder builder = new Builder(parent);
    return builder;
  }
  /**
   *
   *
   * <pre>
   * `DevicePolicy` specifies device specific restrictions necessary to acquire a
   * given access level. A `DevicePolicy` specifies requirements for requests from
   * devices to be granted access levels, it does not do any enforcement on the
   * device. `DevicePolicy` acts as an AND over all specified fields, and each
   * repeated field is an OR over its elements. Any unset fields are ignored. For
   * example, if the proto is { os_type : DESKTOP_WINDOWS, os_type :
   * DESKTOP_LINUX, encryption_status: ENCRYPTED}, then the DevicePolicy will be
   * true for requests originating from encrypted Linux desktops and encrypted
   * Windows desktops.
   * </pre>
   *
   * Protobuf type {@code google.identity.accesscontextmanager.v1.DevicePolicy}
   */
  public static final class Builder extends com.google.protobuf.GeneratedMessageV3.Builder<Builder>
      implements
      // @@protoc_insertion_point(builder_implements:google.identity.accesscontextmanager.v1.DevicePolicy)
      com.google.identity.accesscontextmanager.v1.DevicePolicyOrBuilder {
    public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
      return com.google.identity.accesscontextmanager.v1.AccessLevelProto
          .internal_static_google_identity_accesscontextmanager_v1_DevicePolicy_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.google.identity.accesscontextmanager.v1.AccessLevelProto
          .internal_static_google_identity_accesscontextmanager_v1_DevicePolicy_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.google.identity.accesscontextmanager.v1.DevicePolicy.class,
              com.google.identity.accesscontextmanager.v1.DevicePolicy.Builder.class);
    }

    // Construct using com.google.identity.accesscontextmanager.v1.DevicePolicy.newBuilder()
    private Builder() {}

    private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
      super(parent);
    }

    @java.lang.Override
    public Builder clear() {
      super.clear();
      bitField0_ = 0;
      requireScreenlock_ = false;
      allowedEncryptionStatuses_ = java.util.Collections.emptyList();
      bitField0_ = (bitField0_ & ~0x00000002);
      if (osConstraintsBuilder_ == null) {
        osConstraints_ = java.util.Collections.emptyList();
      } else {
        osConstraints_ = null;
        osConstraintsBuilder_.clear();
      }
      bitField0_ = (bitField0_ & ~0x00000004);
      allowedDeviceManagementLevels_ = java.util.Collections.emptyList();
      bitField0_ = (bitField0_ & ~0x00000008);
      requireAdminApproval_ = false;
      requireCorpOwned_ = false;
      return this;
    }

    @java.lang.Override
    public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
      return com.google.identity.accesscontextmanager.v1.AccessLevelProto
          .internal_static_google_identity_accesscontextmanager_v1_DevicePolicy_descriptor;
    }

    @java.lang.Override
    public com.google.identity.accesscontextmanager.v1.DevicePolicy getDefaultInstanceForType() {
      return com.google.identity.accesscontextmanager.v1.DevicePolicy.getDefaultInstance();
    }

    @java.lang.Override
    public com.google.identity.accesscontextmanager.v1.DevicePolicy build() {
      com.google.identity.accesscontextmanager.v1.DevicePolicy result = buildPartial();
      if (!result.isInitialized()) {
        throw newUninitializedMessageException(result);
      }
      return result;
    }

    @java.lang.Override
    public com.google.identity.accesscontextmanager.v1.DevicePolicy buildPartial() {
      com.google.identity.accesscontextmanager.v1.DevicePolicy result =
          new com.google.identity.accesscontextmanager.v1.DevicePolicy(this);
      buildPartialRepeatedFields(result);
      if (bitField0_ != 0) {
        buildPartial0(result);
      }
      onBuilt();
      return result;
    }

    private void buildPartialRepeatedFields(
        com.google.identity.accesscontextmanager.v1.DevicePolicy result) {
      if (((bitField0_ & 0x00000002) != 0)) {
        allowedEncryptionStatuses_ =
            java.util.Collections.unmodifiableList(allowedEncryptionStatuses_);
        bitField0_ = (bitField0_ & ~0x00000002);
      }
      result.allowedEncryptionStatuses_ = allowedEncryptionStatuses_;
      if (osConstraintsBuilder_ == null) {
        if (((bitField0_ & 0x00000004) != 0)) {
          osConstraints_ = java.util.Collections.unmodifiableList(osConstraints_);
          bitField0_ = (bitField0_ & ~0x00000004);
        }
        result.osConstraints_ = osConstraints_;
      } else {
        result.osConstraints_ = osConstraintsBuilder_.build();
      }
      if (((bitField0_ & 0x00000008) != 0)) {
        allowedDeviceManagementLevels_ =
            java.util.Collections.unmodifiableList(allowedDeviceManagementLevels_);
        bitField0_ = (bitField0_ & ~0x00000008);
      }
      result.allowedDeviceManagementLevels_ = allowedDeviceManagementLevels_;
    }

    private void buildPartial0(com.google.identity.accesscontextmanager.v1.DevicePolicy result) {
      int from_bitField0_ = bitField0_;
      if (((from_bitField0_ & 0x00000001) != 0)) {
        result.requireScreenlock_ = requireScreenlock_;
      }
      if (((from_bitField0_ & 0x00000010) != 0)) {
        result.requireAdminApproval_ = requireAdminApproval_;
      }
      if (((from_bitField0_ & 0x00000020) != 0)) {
        result.requireCorpOwned_ = requireCorpOwned_;
      }
    }

    @java.lang.Override
    public Builder clone() {
      return super.clone();
    }

    @java.lang.Override
    public Builder setField(
        com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
      return super.setField(field, value);
    }

    @java.lang.Override
    public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) {
      return super.clearField(field);
    }

    @java.lang.Override
    public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) {
      return super.clearOneof(oneof);
    }

    @java.lang.Override
    public Builder setRepeatedField(
        com.google.protobuf.Descriptors.FieldDescriptor field, int index, java.lang.Object value) {
      return super.setRepeatedField(field, index, value);
    }

    @java.lang.Override
    public Builder addRepeatedField(
        com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) {
      return super.addRepeatedField(field, value);
    }

    @java.lang.Override
    public Builder mergeFrom(com.google.protobuf.Message other) {
      if (other instanceof com.google.identity.accesscontextmanager.v1.DevicePolicy) {
        return mergeFrom((com.google.identity.accesscontextmanager.v1.DevicePolicy) other);
      } else {
        super.mergeFrom(other);
        return this;
      }
    }

    public Builder mergeFrom(com.google.identity.accesscontextmanager.v1.DevicePolicy other) {
      if (other == com.google.identity.accesscontextmanager.v1.DevicePolicy.getDefaultInstance())
        return this;
      if (other.getRequireScreenlock() != false) {
        setRequireScreenlock(other.getRequireScreenlock());
      }
      if (!other.allowedEncryptionStatuses_.isEmpty()) {
        if (allowedEncryptionStatuses_.isEmpty()) {
          allowedEncryptionStatuses_ = other.allowedEncryptionStatuses_;
          bitField0_ = (bitField0_ & ~0x00000002);
        } else {
          ensureAllowedEncryptionStatusesIsMutable();
          allowedEncryptionStatuses_.addAll(other.allowedEncryptionStatuses_);
        }
        onChanged();
      }
      if (osConstraintsBuilder_ == null) {
        if (!other.osConstraints_.isEmpty()) {
          if (osConstraints_.isEmpty()) {
            osConstraints_ = other.osConstraints_;
            bitField0_ = (bitField0_ & ~0x00000004);
          } else {
            ensureOsConstraintsIsMutable();
            osConstraints_.addAll(other.osConstraints_);
          }
          onChanged();
        }
      } else {
        if (!other.osConstraints_.isEmpty()) {
          if (osConstraintsBuilder_.isEmpty()) {
            osConstraintsBuilder_.dispose();
            osConstraintsBuilder_ = null;
            osConstraints_ = other.osConstraints_;
            bitField0_ = (bitField0_ & ~0x00000004);
            osConstraintsBuilder_ =
                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders
                    ? getOsConstraintsFieldBuilder()
                    : null;
          } else {
            osConstraintsBuilder_.addAllMessages(other.osConstraints_);
          }
        }
      }
      if (!other.allowedDeviceManagementLevels_.isEmpty()) {
        if (allowedDeviceManagementLevels_.isEmpty()) {
          allowedDeviceManagementLevels_ = other.allowedDeviceManagementLevels_;
          bitField0_ = (bitField0_ & ~0x00000008);
        } else {
          ensureAllowedDeviceManagementLevelsIsMutable();
          allowedDeviceManagementLevels_.addAll(other.allowedDeviceManagementLevels_);
        }
        onChanged();
      }
      if (other.getRequireAdminApproval() != false) {
        setRequireAdminApproval(other.getRequireAdminApproval());
      }
      if (other.getRequireCorpOwned() != false) {
        setRequireCorpOwned(other.getRequireCorpOwned());
      }
      this.mergeUnknownFields(other.getUnknownFields());
      onChanged();
      return this;
    }

    @java.lang.Override
    public final boolean isInitialized() {
      return true;
    }

    @java.lang.Override
    public Builder mergeFrom(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws java.io.IOException {
      if (extensionRegistry == null) {
        throw new java.lang.NullPointerException();
      }
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            case 8:
              {
                requireScreenlock_ = input.readBool();
                bitField0_ |= 0x00000001;
                break;
              } // case 8
            case 16:
              {
                int tmpRaw = input.readEnum();
                ensureAllowedEncryptionStatusesIsMutable();
                allowedEncryptionStatuses_.add(tmpRaw);
                break;
              } // case 16
            case 18:
              {
                int length = input.readRawVarint32();
                int oldLimit = input.pushLimit(length);
                while (input.getBytesUntilLimit() > 0) {
                  int tmpRaw = input.readEnum();
                  ensureAllowedEncryptionStatusesIsMutable();
                  allowedEncryptionStatuses_.add(tmpRaw);
                }
                input.popLimit(oldLimit);
                break;
              } // case 18
            case 26:
              {
                com.google.identity.accesscontextmanager.v1.OsConstraint m =
                    input.readMessage(
                        com.google.identity.accesscontextmanager.v1.OsConstraint.parser(),
                        extensionRegistry);
                if (osConstraintsBuilder_ == null) {
                  ensureOsConstraintsIsMutable();
                  osConstraints_.add(m);
                } else {
                  osConstraintsBuilder_.addMessage(m);
                }
                break;
              } // case 26
            case 48:
              {
                int tmpRaw = input.readEnum();
                ensureAllowedDeviceManagementLevelsIsMutable();
                allowedDeviceManagementLevels_.add(tmpRaw);
                break;
              } // case 48
            case 50:
              {
                int length = input.readRawVarint32();
                int oldLimit = input.pushLimit(length);
                while (input.getBytesUntilLimit() > 0) {
                  int tmpRaw = input.readEnum();
                  ensureAllowedDeviceManagementLevelsIsMutable();
                  allowedDeviceManagementLevels_.add(tmpRaw);
                }
                input.popLimit(oldLimit);
                break;
              } // case 50
            case 56:
              {
                requireAdminApproval_ = input.readBool();
                bitField0_ |= 0x00000010;
                break;
              } // case 56
            case 64:
              {
                requireCorpOwned_ = input.readBool();
                bitField0_ |= 0x00000020;
                break;
              } // case 64
            default:
              {
                if (!super.parseUnknownField(input, extensionRegistry, tag)) {
                  done = true; // was an endgroup tag
                }
                break;
              } // default:
          } // switch (tag)
        } // while (!done)
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.unwrapIOException();
      } finally {
        onChanged();
      } // finally
      return this;
    }

    private int bitField0_;

    private boolean requireScreenlock_;
    /**
     *
     *
     * <pre>
     * Whether or not screenlock is required for the DevicePolicy to be true.
     * Defaults to `false`.
     * </pre>
     *
     * <code>bool require_screenlock = 1;</code>
     *
     * @return The requireScreenlock.
     */
    @java.lang.Override
    public boolean getRequireScreenlock() {
      return requireScreenlock_;
    }
    /**
     *
     *
     * <pre>
     * Whether or not screenlock is required for the DevicePolicy to be true.
     * Defaults to `false`.
     * </pre>
     *
     * <code>bool require_screenlock = 1;</code>
     *
     * @param value The requireScreenlock to set.
     * @return This builder for chaining.
     */
    public Builder setRequireScreenlock(boolean value) {

      requireScreenlock_ = value;
      bitField0_ |= 0x00000001;
      onChanged();
      return this;
    }
    /**
     *
     *
     * <pre>
     * Whether or not screenlock is required for the DevicePolicy to be true.
     * Defaults to `false`.
     * </pre>
     *
     * <code>bool require_screenlock = 1;</code>
     *
     * @return This builder for chaining.
     */
    public Builder clearRequireScreenlock() {
      bitField0_ = (bitField0_ & ~0x00000001);
      requireScreenlock_ = false;
      onChanged();
      return this;
    }

    private java.util.List<java.lang.Integer> allowedEncryptionStatuses_ =
        java.util.Collections.emptyList();

    private void ensureAllowedEncryptionStatusesIsMutable() {
      if (!((bitField0_ & 0x00000002) != 0)) {
        allowedEncryptionStatuses_ =
            new java.util.ArrayList<java.lang.Integer>(allowedEncryptionStatuses_);
        bitField0_ |= 0x00000002;
      }
    }
    /**
     *
     *
     * <pre>
     * Allowed encryptions statuses, an empty list allows all statuses.
     * </pre>
     *
     * <code>
     * repeated .google.identity.accesscontextmanager.type.DeviceEncryptionStatus allowed_encryption_statuses = 2;
     * </code>
     *
     * @return A list containing the allowedEncryptionStatuses.
     */
    public java.util.List<com.google.identity.accesscontextmanager.type.DeviceEncryptionStatus>
        getAllowedEncryptionStatusesList() {
      return new com.google.protobuf.Internal.ListAdapter<
          java.lang.Integer, com.google.identity.accesscontextmanager.type.DeviceEncryptionStatus>(
          allowedEncryptionStatuses_, allowedEncryptionStatuses_converter_);
    }
    /**
     *
     *
     * <pre>
     * Allowed encryptions statuses, an empty list allows all statuses.
     * </pre>
     *
     * <code>
     * repeated .google.identity.accesscontextmanager.type.DeviceEncryptionStatus allowed_encryption_statuses = 2;
     * </code>
     *
     * @return The count of allowedEncryptionStatuses.
     */
    public int getAllowedEncryptionStatusesCount() {
      return allowedEncryptionStatuses_.size();
    }
    /**
     *
     *
     * <pre>
     * Allowed encryptions statuses, an empty list allows all statuses.
     * </pre>
     *
     * <code>
     * repeated .google.identity.accesscontextmanager.type.DeviceEncryptionStatus allowed_encryption_statuses = 2;
     * </code>
     *
     * @param index The index of the element to return.
     * @return The allowedEncryptionStatuses at the given index.
     */
    public com.google.identity.accesscontextmanager.type.DeviceEncryptionStatus
        getAllowedEncryptionStatuses(int index) {
      return allowedEncryptionStatuses_converter_.convert(allowedEncryptionStatuses_.get(index));
    }
    /**
     *
     *
     * <pre>
     * Allowed encryptions statuses, an empty list allows all statuses.
     * </pre>
     *
     * <code>
     * repeated .google.identity.accesscontextmanager.type.DeviceEncryptionStatus allowed_encryption_statuses = 2;
     * </code>
     *
     * @param index The index to set the value at.
     * @param value The allowedEncryptionStatuses to set.
     * @return This builder for chaining.
     */
    public Builder setAllowedEncryptionStatuses(
        int index, com.google.identity.accesscontextmanager.type.DeviceEncryptionStatus value) {
      if (value == null) {
        throw new NullPointerException();
      }
      ensureAllowedEncryptionStatusesIsMutable();
      allowedEncryptionStatuses_.set(index, value.getNumber());
      onChanged();
      return this;
    }
    /**
     *
     *
     * <pre>
     * Allowed encryptions statuses, an empty list allows all statuses.
     * </pre>
     *
     * <code>
     * repeated .google.identity.accesscontextmanager.type.DeviceEncryptionStatus allowed_encryption_statuses = 2;
     * </code>
     *
     * @param value The allowedEncryptionStatuses to add.
     * @return This builder for chaining.
     */
    public Builder addAllowedEncryptionStatuses(
        com.google.identity.accesscontextmanager.type.DeviceEncryptionStatus value) {
      if (value == null) {
        throw new NullPointerException();
      }
      ensureAllowedEncryptionStatusesIsMutable();
      allowedEncryptionStatuses_.add(value.getNumber());
      onChanged();
      return this;
    }
    /**
     *
     *
     * <pre>
     * Allowed encryptions statuses, an empty list allows all statuses.
     * </pre>
     *
     * <code>
     * repeated .google.identity.accesscontextmanager.type.DeviceEncryptionStatus allowed_encryption_statuses = 2;
     * </code>
     *
     * @param values The allowedEncryptionStatuses to add.
     * @return This builder for chaining.
     */
    public Builder addAllAllowedEncryptionStatuses(
        java.lang.Iterable<
                ? extends com.google.identity.accesscontextmanager.type.DeviceEncryptionStatus>
            values) {
      ensureAllowedEncryptionStatusesIsMutable();
      for (com.google.identity.accesscontextmanager.type.DeviceEncryptionStatus value : values) {
        allowedEncryptionStatuses_.add(value.getNumber());
      }
      onChanged();
      return this;
    }
    /**
     *
     *
     * <pre>
     * Allowed encryptions statuses, an empty list allows all statuses.
     * </pre>
     *
     * <code>
     * repeated .google.identity.accesscontextmanager.type.DeviceEncryptionStatus allowed_encryption_statuses = 2;
     * </code>
     *
     * @return This builder for chaining.
     */
    public Builder clearAllowedEncryptionStatuses() {
      allowedEncryptionStatuses_ = java.util.Collections.emptyList();
      bitField0_ = (bitField0_ & ~0x00000002);
      onChanged();
      return this;
    }
    /**
     *
     *
     * <pre>
     * Allowed encryptions statuses, an empty list allows all statuses.
     * </pre>
     *
     * <code>
     * repeated .google.identity.accesscontextmanager.type.DeviceEncryptionStatus allowed_encryption_statuses = 2;
     * </code>
     *
     * @return A list containing the enum numeric values on the wire for allowedEncryptionStatuses.
     */
    public java.util.List<java.lang.Integer> getAllowedEncryptionStatusesValueList() {
      return java.util.Collections.unmodifiableList(allowedEncryptionStatuses_);
    }
    /**
     *
     *
     * <pre>
     * Allowed encryptions statuses, an empty list allows all statuses.
     * </pre>
     *
     * <code>
     * repeated .google.identity.accesscontextmanager.type.DeviceEncryptionStatus allowed_encryption_statuses = 2;
     * </code>
     *
     * @param index The index of the value to return.
     * @return The enum numeric value on the wire of allowedEncryptionStatuses at the given index.
     */
    public int getAllowedEncryptionStatusesValue(int index) {
      return allowedEncryptionStatuses_.get(index);
    }
    /**
     *
     *
     * <pre>
     * Allowed encryptions statuses, an empty list allows all statuses.
     * </pre>
     *
     * <code>
     * repeated .google.identity.accesscontextmanager.type.DeviceEncryptionStatus allowed_encryption_statuses = 2;
     * </code>
     *
     * @param index The index to set the value at.
     * @param value The enum numeric value on the wire for allowedEncryptionStatuses to set.
     * @return This builder for chaining.
     */
    public Builder setAllowedEncryptionStatusesValue(int index, int value) {
      ensureAllowedEncryptionStatusesIsMutable();
      allowedEncryptionStatuses_.set(index, value);
      onChanged();
      return this;
    }
    /**
     *
     *
     * <pre>
     * Allowed encryptions statuses, an empty list allows all statuses.
     * </pre>
     *
     * <code>
     * repeated .google.identity.accesscontextmanager.type.DeviceEncryptionStatus allowed_encryption_statuses = 2;
     * </code>
     *
     * @param value The enum numeric value on the wire for allowedEncryptionStatuses to add.
     * @return This builder for chaining.
     */
    public Builder addAllowedEncryptionStatusesValue(int value) {
      ensureAllowedEncryptionStatusesIsMutable();
      allowedEncryptionStatuses_.add(value);
      onChanged();
      return this;
    }
    /**
     *
     *
     * <pre>
     * Allowed encryptions statuses, an empty list allows all statuses.
     * </pre>
     *
     * <code>
     * repeated .google.identity.accesscontextmanager.type.DeviceEncryptionStatus allowed_encryption_statuses = 2;
     * </code>
     *
     * @param values The enum numeric values on the wire for allowedEncryptionStatuses to add.
     * @return This builder for chaining.
     */
    public Builder addAllAllowedEncryptionStatusesValue(
        java.lang.Iterable<java.lang.Integer> values) {
      ensureAllowedEncryptionStatusesIsMutable();
      for (int value : values) {
        allowedEncryptionStatuses_.add(value);
      }
      onChanged();
      return this;
    }

    private java.util.List<com.google.identity.accesscontextmanager.v1.OsConstraint>
        osConstraints_ = java.util.Collections.emptyList();

    private void ensureOsConstraintsIsMutable() {
      if (!((bitField0_ & 0x00000004) != 0)) {
        osConstraints_ =
            new java.util.ArrayList<com.google.identity.accesscontextmanager.v1.OsConstraint>(
                osConstraints_);
        bitField0_ |= 0x00000004;
      }
    }

    private com.google.protobuf.RepeatedFieldBuilderV3<
            com.google.identity.accesscontextmanager.v1.OsConstraint,
            com.google.identity.accesscontextmanager.v1.OsConstraint.Builder,
            com.google.identity.accesscontextmanager.v1.OsConstraintOrBuilder>
        osConstraintsBuilder_;

    /**
     *
     *
     * <pre>
     * Allowed OS versions, an empty list allows all types and all versions.
     * </pre>
     *
     * <code>repeated .google.identity.accesscontextmanager.v1.OsConstraint os_constraints = 3;
     * </code>
     */
    public java.util.List<com.google.identity.accesscontextmanager.v1.OsConstraint>
        getOsConstraintsList() {
      if (osConstraintsBuilder_ == null) {
        return java.util.Collections.unmodifiableList(osConstraints_);
      } else {
        return osConstraintsBuilder_.getMessageList();
      }
    }
    /**
     *
     *
     * <pre>
     * Allowed OS versions, an empty list allows all types and all versions.
     * </pre>
     *
     * <code>repeated .google.identity.accesscontextmanager.v1.OsConstraint os_constraints = 3;
     * </code>
     */
    public int getOsConstraintsCount() {
      if (osConstraintsBuilder_ == null) {
        return osConstraints_.size();
      } else {
        return osConstraintsBuilder_.getCount();
      }
    }
    /**
     *
     *
     * <pre>
     * Allowed OS versions, an empty list allows all types and all versions.
     * </pre>
     *
     * <code>repeated .google.identity.accesscontextmanager.v1.OsConstraint os_constraints = 3;
     * </code>
     */
    public com.google.identity.accesscontextmanager.v1.OsConstraint getOsConstraints(int index) {
      if (osConstraintsBuilder_ == null) {
        return osConstraints_.get(index);
      } else {
        return osConstraintsBuilder_.getMessage(index);
      }
    }
    /**
     *
     *
     * <pre>
     * Allowed OS versions, an empty list allows all types and all versions.
     * </pre>
     *
     * <code>repeated .google.identity.accesscontextmanager.v1.OsConstraint os_constraints = 3;
     * </code>
     */
    public Builder setOsConstraints(
        int index, com.google.identity.accesscontextmanager.v1.OsConstraint value) {
      if (osConstraintsBuilder_ == null) {
        if (value == null) {
          throw new NullPointerException();
        }
        ensureOsConstraintsIsMutable();
        osConstraints_.set(index, value);
        onChanged();
      } else {
        osConstraintsBuilder_.setMessage(index, value);
      }
      return this;
    }
    /**
     *
     *
     * <pre>
     * Allowed OS versions, an empty list allows all types and all versions.
     * </pre>
     *
     * <code>repeated .google.identity.accesscontextmanager.v1.OsConstraint os_constraints = 3;
     * </code>
     */
    public Builder setOsConstraints(
        int index,
        com.google.identity.accesscontextmanager.v1.OsConstraint.Builder builderForValue) {
      if (osConstraintsBuilder_ == null) {
        ensureOsConstraintsIsMutable();
        osConstraints_.set(index, builderForValue.build());
        onChanged();
      } else {
        osConstraintsBuilder_.setMessage(index, builderForValue.build());
      }
      return this;
    }
    /**
     *
     *
     * <pre>
     * Allowed OS versions, an empty list allows all types and all versions.
     * </pre>
     *
     * <code>repeated .google.identity.accesscontextmanager.v1.OsConstraint os_constraints = 3;
     * </code>
     */
    public Builder addOsConstraints(
        com.google.identity.accesscontextmanager.v1.OsConstraint value) {
      if (osConstraintsBuilder_ == null) {
        if (value == null) {
          throw new NullPointerException();
        }
        ensureOsConstraintsIsMutable();
        osConstraints_.add(value);
        onChanged();
      } else {
        osConstraintsBuilder_.addMessage(value);
      }
      return this;
    }
    /**
     *
     *
     * <pre>
     * Allowed OS versions, an empty list allows all types and all versions.
     * </pre>
     *
     * <code>repeated .google.identity.accesscontextmanager.v1.OsConstraint os_constraints = 3;
     * </code>
     */
    public Builder addOsConstraints(
        int index, com.google.identity.accesscontextmanager.v1.OsConstraint value) {
      if (osConstraintsBuilder_ == null) {
        if (value == null) {
          throw new NullPointerException();
        }
        ensureOsConstraintsIsMutable();
        osConstraints_.add(index, value);
        onChanged();
      } else {
        osConstraintsBuilder_.addMessage(index, value);
      }
      return this;
    }
    /**
     *
     *
     * <pre>
     * Allowed OS versions, an empty list allows all types and all versions.
     * </pre>
     *
     * <code>repeated .google.identity.accesscontextmanager.v1.OsConstraint os_constraints = 3;
     * </code>
     */
    public Builder addOsConstraints(
        com.google.identity.accesscontextmanager.v1.OsConstraint.Builder builderForValue) {
      if (osConstraintsBuilder_ == null) {
        ensureOsConstraintsIsMutable();
        osConstraints_.add(builderForValue.build());
        onChanged();
      } else {
        osConstraintsBuilder_.addMessage(builderForValue.build());
      }
      return this;
    }
    /**
     *
     *
     * <pre>
     * Allowed OS versions, an empty list allows all types and all versions.
     * </pre>
     *
     * <code>repeated .google.identity.accesscontextmanager.v1.OsConstraint os_constraints = 3;
     * </code>
     */
    public Builder addOsConstraints(
        int index,
        com.google.identity.accesscontextmanager.v1.OsConstraint.Builder builderForValue) {
      if (osConstraintsBuilder_ == null) {
        ensureOsConstraintsIsMutable();
        osConstraints_.add(index, builderForValue.build());
        onChanged();
      } else {
        osConstraintsBuilder_.addMessage(index, builderForValue.build());
      }
      return this;
    }
    /**
     *
     *
     * <pre>
     * Allowed OS versions, an empty list allows all types and all versions.
     * </pre>
     *
     * <code>repeated .google.identity.accesscontextmanager.v1.OsConstraint os_constraints = 3;
     * </code>
     */
    public Builder addAllOsConstraints(
        java.lang.Iterable<? extends com.google.identity.accesscontextmanager.v1.OsConstraint>
            values) {
      if (osConstraintsBuilder_ == null) {
        ensureOsConstraintsIsMutable();
        com.google.protobuf.AbstractMessageLite.Builder.addAll(values, osConstraints_);
        onChanged();
      } else {
        osConstraintsBuilder_.addAllMessages(values);
      }
      return this;
    }
    /**
     *
     *
     * <pre>
     * Allowed OS versions, an empty list allows all types and all versions.
     * </pre>
     *
     * <code>repeated .google.identity.accesscontextmanager.v1.OsConstraint os_constraints = 3;
     * </code>
     */
    public Builder clearOsConstraints() {
      if (osConstraintsBuilder_ == null) {
        osConstraints_ = java.util.Collections.emptyList();
        bitField0_ = (bitField0_ & ~0x00000004);
        onChanged();
      } else {
        osConstraintsBuilder_.clear();
      }
      return this;
    }
    /**
     *
     *
     * <pre>
     * Allowed OS versions, an empty list allows all types and all versions.
     * </pre>
     *
     * <code>repeated .google.identity.accesscontextmanager.v1.OsConstraint os_constraints = 3;
     * </code>
     */
    public Builder removeOsConstraints(int index) {
      if (osConstraintsBuilder_ == null) {
        ensureOsConstraintsIsMutable();
        osConstraints_.remove(index);
        onChanged();
      } else {
        osConstraintsBuilder_.remove(index);
      }
      return this;
    }
    /**
     *
     *
     * <pre>
     * Allowed OS versions, an empty list allows all types and all versions.
     * </pre>
     *
     * <code>repeated .google.identity.accesscontextmanager.v1.OsConstraint os_constraints = 3;
     * </code>
     */
    public com.google.identity.accesscontextmanager.v1.OsConstraint.Builder getOsConstraintsBuilder(
        int index) {
      return getOsConstraintsFieldBuilder().getBuilder(index);
    }
    /**
     *
     *
     * <pre>
     * Allowed OS versions, an empty list allows all types and all versions.
     * </pre>
     *
     * <code>repeated .google.identity.accesscontextmanager.v1.OsConstraint os_constraints = 3;
     * </code>
     */
    public com.google.identity.accesscontextmanager.v1.OsConstraintOrBuilder
        getOsConstraintsOrBuilder(int index) {
      if (osConstraintsBuilder_ == null) {
        return osConstraints_.get(index);
      } else {
        return osConstraintsBuilder_.getMessageOrBuilder(index);
      }
    }
    /**
     *
     *
     * <pre>
     * Allowed OS versions, an empty list allows all types and all versions.
     * </pre>
     *
     * <code>repeated .google.identity.accesscontextmanager.v1.OsConstraint os_constraints = 3;
     * </code>
     */
    public java.util.List<
            ? extends com.google.identity.accesscontextmanager.v1.OsConstraintOrBuilder>
        getOsConstraintsOrBuilderList() {
      if (osConstraintsBuilder_ != null) {
        return osConstraintsBuilder_.getMessageOrBuilderList();
      } else {
        return java.util.Collections.unmodifiableList(osConstraints_);
      }
    }
    /**
     *
     *
     * <pre>
     * Allowed OS versions, an empty list allows all types and all versions.
     * </pre>
     *
     * <code>repeated .google.identity.accesscontextmanager.v1.OsConstraint os_constraints = 3;
     * </code>
     */
    public com.google.identity.accesscontextmanager.v1.OsConstraint.Builder
        addOsConstraintsBuilder() {
      return getOsConstraintsFieldBuilder()
          .addBuilder(
              com.google.identity.accesscontextmanager.v1.OsConstraint.getDefaultInstance());
    }
    /**
     *
     *
     * <pre>
     * Allowed OS versions, an empty list allows all types and all versions.
     * </pre>
     *
     * <code>repeated .google.identity.accesscontextmanager.v1.OsConstraint os_constraints = 3;
     * </code>
     */
    public com.google.identity.accesscontextmanager.v1.OsConstraint.Builder addOsConstraintsBuilder(
        int index) {
      return getOsConstraintsFieldBuilder()
          .addBuilder(
              index, com.google.identity.accesscontextmanager.v1.OsConstraint.getDefaultInstance());
    }
    /**
     *
     *
     * <pre>
     * Allowed OS versions, an empty list allows all types and all versions.
     * </pre>
     *
     * <code>repeated .google.identity.accesscontextmanager.v1.OsConstraint os_constraints = 3;
     * </code>
     */
    public java.util.List<com.google.identity.accesscontextmanager.v1.OsConstraint.Builder>
        getOsConstraintsBuilderList() {
      return getOsConstraintsFieldBuilder().getBuilderList();
    }

    private com.google.protobuf.RepeatedFieldBuilderV3<
            com.google.identity.accesscontextmanager.v1.OsConstraint,
            com.google.identity.accesscontextmanager.v1.OsConstraint.Builder,
            com.google.identity.accesscontextmanager.v1.OsConstraintOrBuilder>
        getOsConstraintsFieldBuilder() {
      if (osConstraintsBuilder_ == null) {
        osConstraintsBuilder_ =
            new com.google.protobuf.RepeatedFieldBuilderV3<
                com.google.identity.accesscontextmanager.v1.OsConstraint,
                com.google.identity.accesscontextmanager.v1.OsConstraint.Builder,
                com.google.identity.accesscontextmanager.v1.OsConstraintOrBuilder>(
                osConstraints_,
                ((bitField0_ & 0x00000004) != 0),
                getParentForChildren(),
                isClean());
        osConstraints_ = null;
      }
      return osConstraintsBuilder_;
    }

    private java.util.List<java.lang.Integer> allowedDeviceManagementLevels_ =
        java.util.Collections.emptyList();

    private void ensureAllowedDeviceManagementLevelsIsMutable() {
      if (!((bitField0_ & 0x00000008) != 0)) {
        allowedDeviceManagementLevels_ =
            new java.util.ArrayList<java.lang.Integer>(allowedDeviceManagementLevels_);
        bitField0_ |= 0x00000008;
      }
    }
    /**
     *
     *
     * <pre>
     * Allowed device management levels, an empty list allows all management
     * levels.
     * </pre>
     *
     * <code>
     * repeated .google.identity.accesscontextmanager.type.DeviceManagementLevel allowed_device_management_levels = 6;
     * </code>
     *
     * @return A list containing the allowedDeviceManagementLevels.
     */
    public java.util.List<com.google.identity.accesscontextmanager.type.DeviceManagementLevel>
        getAllowedDeviceManagementLevelsList() {
      return new com.google.protobuf.Internal.ListAdapter<
          java.lang.Integer, com.google.identity.accesscontextmanager.type.DeviceManagementLevel>(
          allowedDeviceManagementLevels_, allowedDeviceManagementLevels_converter_);
    }
    /**
     *
     *
     * <pre>
     * Allowed device management levels, an empty list allows all management
     * levels.
     * </pre>
     *
     * <code>
     * repeated .google.identity.accesscontextmanager.type.DeviceManagementLevel allowed_device_management_levels = 6;
     * </code>
     *
     * @return The count of allowedDeviceManagementLevels.
     */
    public int getAllowedDeviceManagementLevelsCount() {
      return allowedDeviceManagementLevels_.size();
    }
    /**
     *
     *
     * <pre>
     * Allowed device management levels, an empty list allows all management
     * levels.
     * </pre>
     *
     * <code>
     * repeated .google.identity.accesscontextmanager.type.DeviceManagementLevel allowed_device_management_levels = 6;
     * </code>
     *
     * @param index The index of the element to return.
     * @return The allowedDeviceManagementLevels at the given index.
     */
    public com.google.identity.accesscontextmanager.type.DeviceManagementLevel
        getAllowedDeviceManagementLevels(int index) {
      return allowedDeviceManagementLevels_converter_.convert(
          allowedDeviceManagementLevels_.get(index));
    }
    /**
     *
     *
     * <pre>
     * Allowed device management levels, an empty list allows all management
     * levels.
     * </pre>
     *
     * <code>
     * repeated .google.identity.accesscontextmanager.type.DeviceManagementLevel allowed_device_management_levels = 6;
     * </code>
     *
     * @param index The index to set the value at.
     * @param value The allowedDeviceManagementLevels to set.
     * @return This builder for chaining.
     */
    public Builder setAllowedDeviceManagementLevels(
        int index, com.google.identity.accesscontextmanager.type.DeviceManagementLevel value) {
      if (value == null) {
        throw new NullPointerException();
      }
      ensureAllowedDeviceManagementLevelsIsMutable();
      allowedDeviceManagementLevels_.set(index, value.getNumber());
      onChanged();
      return this;
    }
    /**
     *
     *
     * <pre>
     * Allowed device management levels, an empty list allows all management
     * levels.
     * </pre>
     *
     * <code>
     * repeated .google.identity.accesscontextmanager.type.DeviceManagementLevel allowed_device_management_levels = 6;
     * </code>
     *
     * @param value The allowedDeviceManagementLevels to add.
     * @return This builder for chaining.
     */
    public Builder addAllowedDeviceManagementLevels(
        com.google.identity.accesscontextmanager.type.DeviceManagementLevel value) {
      if (value == null) {
        throw new NullPointerException();
      }
      ensureAllowedDeviceManagementLevelsIsMutable();
      allowedDeviceManagementLevels_.add(value.getNumber());
      onChanged();
      return this;
    }
    /**
     *
     *
     * <pre>
     * Allowed device management levels, an empty list allows all management
     * levels.
     * </pre>
     *
     * <code>
     * repeated .google.identity.accesscontextmanager.type.DeviceManagementLevel allowed_device_management_levels = 6;
     * </code>
     *
     * @param values The allowedDeviceManagementLevels to add.
     * @return This builder for chaining.
     */
    public Builder addAllAllowedDeviceManagementLevels(
        java.lang.Iterable<
                ? extends com.google.identity.accesscontextmanager.type.DeviceManagementLevel>
            values) {
      ensureAllowedDeviceManagementLevelsIsMutable();
      for (com.google.identity.accesscontextmanager.type.DeviceManagementLevel value : values) {
        allowedDeviceManagementLevels_.add(value.getNumber());
      }
      onChanged();
      return this;
    }
    /**
     *
     *
     * <pre>
     * Allowed device management levels, an empty list allows all management
     * levels.
     * </pre>
     *
     * <code>
     * repeated .google.identity.accesscontextmanager.type.DeviceManagementLevel allowed_device_management_levels = 6;
     * </code>
     *
     * @return This builder for chaining.
     */
    public Builder clearAllowedDeviceManagementLevels() {
      allowedDeviceManagementLevels_ = java.util.Collections.emptyList();
      bitField0_ = (bitField0_ & ~0x00000008);
      onChanged();
      return this;
    }
    /**
     *
     *
     * <pre>
     * Allowed device management levels, an empty list allows all management
     * levels.
     * </pre>
     *
     * <code>
     * repeated .google.identity.accesscontextmanager.type.DeviceManagementLevel allowed_device_management_levels = 6;
     * </code>
     *
     * @return A list containing the enum numeric values on the wire for
     *     allowedDeviceManagementLevels.
     */
    public java.util.List<java.lang.Integer> getAllowedDeviceManagementLevelsValueList() {
      return java.util.Collections.unmodifiableList(allowedDeviceManagementLevels_);
    }
    /**
     *
     *
     * <pre>
     * Allowed device management levels, an empty list allows all management
     * levels.
     * </pre>
     *
     * <code>
     * repeated .google.identity.accesscontextmanager.type.DeviceManagementLevel allowed_device_management_levels = 6;
     * </code>
     *
     * @param index The index of the value to return.
     * @return The enum numeric value on the wire of allowedDeviceManagementLevels at the given
     *     index.
     */
    public int getAllowedDeviceManagementLevelsValue(int index) {
      return allowedDeviceManagementLevels_.get(index);
    }
    /**
     *
     *
     * <pre>
     * Allowed device management levels, an empty list allows all management
     * levels.
     * </pre>
     *
     * <code>
     * repeated .google.identity.accesscontextmanager.type.DeviceManagementLevel allowed_device_management_levels = 6;
     * </code>
     *
     * @param index The index to set the value at.
     * @param value The enum numeric value on the wire for allowedDeviceManagementLevels to set.
     * @return This builder for chaining.
     */
    public Builder setAllowedDeviceManagementLevelsValue(int index, int value) {
      ensureAllowedDeviceManagementLevelsIsMutable();
      allowedDeviceManagementLevels_.set(index, value);
      onChanged();
      return this;
    }
    /**
     *
     *
     * <pre>
     * Allowed device management levels, an empty list allows all management
     * levels.
     * </pre>
     *
     * <code>
     * repeated .google.identity.accesscontextmanager.type.DeviceManagementLevel allowed_device_management_levels = 6;
     * </code>
     *
     * @param value The enum numeric value on the wire for allowedDeviceManagementLevels to add.
     * @return This builder for chaining.
     */
    public Builder addAllowedDeviceManagementLevelsValue(int value) {
      ensureAllowedDeviceManagementLevelsIsMutable();
      allowedDeviceManagementLevels_.add(value);
      onChanged();
      return this;
    }
    /**
     *
     *
     * <pre>
     * Allowed device management levels, an empty list allows all management
     * levels.
     * </pre>
     *
     * <code>
     * repeated .google.identity.accesscontextmanager.type.DeviceManagementLevel allowed_device_management_levels = 6;
     * </code>
     *
     * @param values The enum numeric values on the wire for allowedDeviceManagementLevels to add.
     * @return This builder for chaining.
     */
    public Builder addAllAllowedDeviceManagementLevelsValue(
        java.lang.Iterable<java.lang.Integer> values) {
      ensureAllowedDeviceManagementLevelsIsMutable();
      for (int value : values) {
        allowedDeviceManagementLevels_.add(value);
      }
      onChanged();
      return this;
    }

    private boolean requireAdminApproval_;
    /**
     *
     *
     * <pre>
     * Whether the device needs to be approved by the customer admin.
     * </pre>
     *
     * <code>bool require_admin_approval = 7;</code>
     *
     * @return The requireAdminApproval.
     */
    @java.lang.Override
    public boolean getRequireAdminApproval() {
      return requireAdminApproval_;
    }
    /**
     *
     *
     * <pre>
     * Whether the device needs to be approved by the customer admin.
     * </pre>
     *
     * <code>bool require_admin_approval = 7;</code>
     *
     * @param value The requireAdminApproval to set.
     * @return This builder for chaining.
     */
    public Builder setRequireAdminApproval(boolean value) {

      requireAdminApproval_ = value;
      bitField0_ |= 0x00000010;
      onChanged();
      return this;
    }
    /**
     *
     *
     * <pre>
     * Whether the device needs to be approved by the customer admin.
     * </pre>
     *
     * <code>bool require_admin_approval = 7;</code>
     *
     * @return This builder for chaining.
     */
    public Builder clearRequireAdminApproval() {
      bitField0_ = (bitField0_ & ~0x00000010);
      requireAdminApproval_ = false;
      onChanged();
      return this;
    }

    private boolean requireCorpOwned_;
    /**
     *
     *
     * <pre>
     * Whether the device needs to be corp owned.
     * </pre>
     *
     * <code>bool require_corp_owned = 8;</code>
     *
     * @return The requireCorpOwned.
     */
    @java.lang.Override
    public boolean getRequireCorpOwned() {
      return requireCorpOwned_;
    }
    /**
     *
     *
     * <pre>
     * Whether the device needs to be corp owned.
     * </pre>
     *
     * <code>bool require_corp_owned = 8;</code>
     *
     * @param value The requireCorpOwned to set.
     * @return This builder for chaining.
     */
    public Builder setRequireCorpOwned(boolean value) {

      requireCorpOwned_ = value;
      bitField0_ |= 0x00000020;
      onChanged();
      return this;
    }
    /**
     *
     *
     * <pre>
     * Whether the device needs to be corp owned.
     * </pre>
     *
     * <code>bool require_corp_owned = 8;</code>
     *
     * @return This builder for chaining.
     */
    public Builder clearRequireCorpOwned() {
      bitField0_ = (bitField0_ & ~0x00000020);
      requireCorpOwned_ = false;
      onChanged();
      return this;
    }

    @java.lang.Override
    public final Builder setUnknownFields(final com.google.protobuf.UnknownFieldSet unknownFields) {
      return super.setUnknownFields(unknownFields);
    }

    @java.lang.Override
    public final Builder mergeUnknownFields(
        final com.google.protobuf.UnknownFieldSet unknownFields) {
      return super.mergeUnknownFields(unknownFields);
    }

    // @@protoc_insertion_point(builder_scope:google.identity.accesscontextmanager.v1.DevicePolicy)
  }

  // @@protoc_insertion_point(class_scope:google.identity.accesscontextmanager.v1.DevicePolicy)
  private static final com.google.identity.accesscontextmanager.v1.DevicePolicy DEFAULT_INSTANCE;

  static {
    DEFAULT_INSTANCE = new com.google.identity.accesscontextmanager.v1.DevicePolicy();
  }

  public static com.google.identity.accesscontextmanager.v1.DevicePolicy getDefaultInstance() {
    return DEFAULT_INSTANCE;
  }

  private static final com.google.protobuf.Parser<DevicePolicy> PARSER =
      new com.google.protobuf.AbstractParser<DevicePolicy>() {
        @java.lang.Override
        public DevicePolicy parsePartialFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          Builder builder = newBuilder();
          try {
            builder.mergeFrom(input, extensionRegistry);
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            throw e.setUnfinishedMessage(builder.buildPartial());
          } catch (com.google.protobuf.UninitializedMessageException e) {
            throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
          } catch (java.io.IOException e) {
            throw new com.google.protobuf.InvalidProtocolBufferException(e)
                .setUnfinishedMessage(builder.buildPartial());
          }
          return builder.buildPartial();
        }
      };

  public static com.google.protobuf.Parser<DevicePolicy> parser() {
    return PARSER;
  }

  @java.lang.Override
  public com.google.protobuf.Parser<DevicePolicy> getParserForType() {
    return PARSER;
  }

  @java.lang.Override
  public com.google.identity.accesscontextmanager.v1.DevicePolicy getDefaultInstanceForType() {
    return DEFAULT_INSTANCE;
  }
}
