// Generated by the protocol buffer compiler.  DO NOT EDIT!
// source: openrtb.proto

package com.iabtechlab.openrtb.v2;

public final class OpenRtb {
  private OpenRtb() {}
  public static void registerAllExtensions(
      com.google.protobuf.ExtensionRegistryLite registry) {
  }

  public static void registerAllExtensions(
      com.google.protobuf.ExtensionRegistry registry) {
    registerAllExtensions(
        (com.google.protobuf.ExtensionRegistryLite) registry);
  }
  /**
   * <pre>
   * OpenRTB 2.0: types of ads that can be accepted by the exchange unless
   * restricted by publisher site settings.
   * </pre>
   *
   * Protobuf enum {@code com.iabtechlab.openrtb.v2.BannerAdType}
   */
  public enum BannerAdType
      implements com.google.protobuf.ProtocolMessageEnum {
    /**
     * <pre>
     * "Usually mobile".
     * </pre>
     *
     * <code>XHTML_TEXT_AD = 1;</code>
     */
    XHTML_TEXT_AD(1),
    /**
     * <pre>
     * "Usually mobile".
     * </pre>
     *
     * <code>XHTML_BANNER_AD = 2;</code>
     */
    XHTML_BANNER_AD(2),
    /**
     * <pre>
     * Javascript must be valid XHTML (ie, script tags included).
     * </pre>
     *
     * <code>JAVASCRIPT_AD = 3;</code>
     */
    JAVASCRIPT_AD(3),
    /**
     * <pre>
     * Iframe.
     * </pre>
     *
     * <code>IFRAME = 4;</code>
     */
    IFRAME(4),
    ;

    /**
     * <pre>
     * "Usually mobile".
     * </pre>
     *
     * <code>XHTML_TEXT_AD = 1;</code>
     */
    public static final int XHTML_TEXT_AD_VALUE = 1;
    /**
     * <pre>
     * "Usually mobile".
     * </pre>
     *
     * <code>XHTML_BANNER_AD = 2;</code>
     */
    public static final int XHTML_BANNER_AD_VALUE = 2;
    /**
     * <pre>
     * Javascript must be valid XHTML (ie, script tags included).
     * </pre>
     *
     * <code>JAVASCRIPT_AD = 3;</code>
     */
    public static final int JAVASCRIPT_AD_VALUE = 3;
    /**
     * <pre>
     * Iframe.
     * </pre>
     *
     * <code>IFRAME = 4;</code>
     */
    public static final int IFRAME_VALUE = 4;


    public final int getNumber() {
      return value;
    }

    /**
     * @param value The numeric wire value of the corresponding enum entry.
     * @return The enum associated with the given numeric wire value.
     * @deprecated Use {@link #forNumber(int)} instead.
     */
    @java.lang.Deprecated
    public static BannerAdType valueOf(int value) {
      return forNumber(value);
    }

    /**
     * @param value The numeric wire value of the corresponding enum entry.
     * @return The enum associated with the given numeric wire value.
     */
    public static BannerAdType forNumber(int value) {
      switch (value) {
        case 1: return XHTML_TEXT_AD;
        case 2: return XHTML_BANNER_AD;
        case 3: return JAVASCRIPT_AD;
        case 4: return IFRAME;
        default: return null;
      }
    }

    public static com.google.protobuf.Internal.EnumLiteMap<BannerAdType>
        internalGetValueMap() {
      return internalValueMap;
    }
    private static final com.google.protobuf.Internal.EnumLiteMap<
        BannerAdType> internalValueMap =
          new com.google.protobuf.Internal.EnumLiteMap<BannerAdType>() {
            public BannerAdType findValueByNumber(int number) {
              return BannerAdType.forNumber(number);
            }
          };

    public final com.google.protobuf.Descriptors.EnumValueDescriptor
        getValueDescriptor() {
      return getDescriptor().getValues().get(ordinal());
    }
    public final com.google.protobuf.Descriptors.EnumDescriptor
        getDescriptorForType() {
      return getDescriptor();
    }
    public static final com.google.protobuf.Descriptors.EnumDescriptor
        getDescriptor() {
      return com.iabtechlab.openrtb.v2.OpenRtb.getDescriptor().getEnumTypes().get(0);
    }

    private static final BannerAdType[] VALUES = values();

    public static BannerAdType valueOf(
        com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
      if (desc.getType() != getDescriptor()) {
        throw new java.lang.IllegalArgumentException(
          "EnumValueDescriptor is not for this type.");
      }
      return VALUES[desc.getIndex()];
    }

    private final int value;

    private BannerAdType(int value) {
      this.value = value;
    }

    // @@protoc_insertion_point(enum_scope:com.iabtechlab.openrtb.v2.BannerAdType)
  }

  /**
   * <pre>
   * OpenRTB Native 1.0: Core layouts. An implementing exchange may not
   * support all asset variants or introduce new ones unique to that system.
   * To be deprecated.
   * </pre>
   *
   * Protobuf enum {@code com.iabtechlab.openrtb.v2.LayoutId}
   */
  public enum LayoutId
      implements com.google.protobuf.ProtocolMessageEnum {
    /**
     * <code>CONTENT_WALL = 1;</code>
     */
    CONTENT_WALL(1),
    /**
     * <code>APP_WALL = 2;</code>
     */
    APP_WALL(2),
    /**
     * <code>NEWS_FEED = 3;</code>
     */
    NEWS_FEED(3),
    /**
     * <code>CHAT_LIST = 4;</code>
     */
    CHAT_LIST(4),
    /**
     * <code>CAROUSEL = 5;</code>
     */
    CAROUSEL(5),
    /**
     * <code>CONTENT_STREAM = 6;</code>
     */
    CONTENT_STREAM(6),
    /**
     * <pre>
     * Exchange-specific values above 500.
     * </pre>
     *
     * <code>GRID = 7;</code>
     */
    GRID(7),
    ;

    /**
     * <code>CONTENT_WALL = 1;</code>
     */
    public static final int CONTENT_WALL_VALUE = 1;
    /**
     * <code>APP_WALL = 2;</code>
     */
    public static final int APP_WALL_VALUE = 2;
    /**
     * <code>NEWS_FEED = 3;</code>
     */
    public static final int NEWS_FEED_VALUE = 3;
    /**
     * <code>CHAT_LIST = 4;</code>
     */
    public static final int CHAT_LIST_VALUE = 4;
    /**
     * <code>CAROUSEL = 5;</code>
     */
    public static final int CAROUSEL_VALUE = 5;
    /**
     * <code>CONTENT_STREAM = 6;</code>
     */
    public static final int CONTENT_STREAM_VALUE = 6;
    /**
     * <pre>
     * Exchange-specific values above 500.
     * </pre>
     *
     * <code>GRID = 7;</code>
     */
    public static final int GRID_VALUE = 7;


    public final int getNumber() {
      return value;
    }

    /**
     * @param value The numeric wire value of the corresponding enum entry.
     * @return The enum associated with the given numeric wire value.
     * @deprecated Use {@link #forNumber(int)} instead.
     */
    @java.lang.Deprecated
    public static LayoutId valueOf(int value) {
      return forNumber(value);
    }

    /**
     * @param value The numeric wire value of the corresponding enum entry.
     * @return The enum associated with the given numeric wire value.
     */
    public static LayoutId forNumber(int value) {
      switch (value) {
        case 1: return CONTENT_WALL;
        case 2: return APP_WALL;
        case 3: return NEWS_FEED;
        case 4: return CHAT_LIST;
        case 5: return CAROUSEL;
        case 6: return CONTENT_STREAM;
        case 7: return GRID;
        default: return null;
      }
    }

    public static com.google.protobuf.Internal.EnumLiteMap<LayoutId>
        internalGetValueMap() {
      return internalValueMap;
    }
    private static final com.google.protobuf.Internal.EnumLiteMap<
        LayoutId> internalValueMap =
          new com.google.protobuf.Internal.EnumLiteMap<LayoutId>() {
            public LayoutId findValueByNumber(int number) {
              return LayoutId.forNumber(number);
            }
          };

    public final com.google.protobuf.Descriptors.EnumValueDescriptor
        getValueDescriptor() {
      return getDescriptor().getValues().get(ordinal());
    }
    public final com.google.protobuf.Descriptors.EnumDescriptor
        getDescriptorForType() {
      return getDescriptor();
    }
    public static final com.google.protobuf.Descriptors.EnumDescriptor
        getDescriptor() {
      return com.iabtechlab.openrtb.v2.OpenRtb.getDescriptor().getEnumTypes().get(1);
    }

    private static final LayoutId[] VALUES = values();

    public static LayoutId valueOf(
        com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
      if (desc.getType() != getDescriptor()) {
        throw new java.lang.IllegalArgumentException(
          "EnumValueDescriptor is not for this type.");
      }
      return VALUES[desc.getIndex()];
    }

    private final int value;

    private LayoutId(int value) {
      this.value = value;
    }

    // @@protoc_insertion_point(enum_scope:com.iabtechlab.openrtb.v2.LayoutId)
  }

  /**
   * <pre>
   * OpenRTB Native 1.0: Below is a list of the core ad unit ids described by
   * IAB: http://www.iab.net/media/file/IABNativeAdvertisingPlaybook120413.pdf
   * In feed unit is essentially a layout, it has been removed from the list.
   * In feed units can be identified via the layout parameter on the request.
   * An implementing exchange may not support all asset variants or introduce
   * new ones unique to that system.
   * To be deprecated.
   * </pre>
   *
   * Protobuf enum {@code com.iabtechlab.openrtb.v2.AdUnitId}
   */
  public enum AdUnitId
      implements com.google.protobuf.ProtocolMessageEnum {
    /**
     * <code>PAID_SEARCH_UNIT = 1;</code>
     */
    PAID_SEARCH_UNIT(1),
    /**
     * <code>RECOMMENDATION_WIDGET = 2;</code>
     */
    RECOMMENDATION_WIDGET(2),
    /**
     * <code>PROMOTED_LISTING = 3;</code>
     */
    PROMOTED_LISTING(3),
    /**
     * <code>IAB_IN_AD_NATIVE = 4;</code>
     */
    IAB_IN_AD_NATIVE(4),
    /**
     * <pre>
     * Exchange-specific values above 500.
     * </pre>
     *
     * <code>ADUNITID_CUSTOM = 5;</code>
     */
    ADUNITID_CUSTOM(5),
    ;

    /**
     * <code>PAID_SEARCH_UNIT = 1;</code>
     */
    public static final int PAID_SEARCH_UNIT_VALUE = 1;
    /**
     * <code>RECOMMENDATION_WIDGET = 2;</code>
     */
    public static final int RECOMMENDATION_WIDGET_VALUE = 2;
    /**
     * <code>PROMOTED_LISTING = 3;</code>
     */
    public static final int PROMOTED_LISTING_VALUE = 3;
    /**
     * <code>IAB_IN_AD_NATIVE = 4;</code>
     */
    public static final int IAB_IN_AD_NATIVE_VALUE = 4;
    /**
     * <pre>
     * Exchange-specific values above 500.
     * </pre>
     *
     * <code>ADUNITID_CUSTOM = 5;</code>
     */
    public static final int ADUNITID_CUSTOM_VALUE = 5;


    public final int getNumber() {
      return value;
    }

    /**
     * @param value The numeric wire value of the corresponding enum entry.
     * @return The enum associated with the given numeric wire value.
     * @deprecated Use {@link #forNumber(int)} instead.
     */
    @java.lang.Deprecated
    public static AdUnitId valueOf(int value) {
      return forNumber(value);
    }

    /**
     * @param value The numeric wire value of the corresponding enum entry.
     * @return The enum associated with the given numeric wire value.
     */
    public static AdUnitId forNumber(int value) {
      switch (value) {
        case 1: return PAID_SEARCH_UNIT;
        case 2: return RECOMMENDATION_WIDGET;
        case 3: return PROMOTED_LISTING;
        case 4: return IAB_IN_AD_NATIVE;
        case 5: return ADUNITID_CUSTOM;
        default: return null;
      }
    }

    public static com.google.protobuf.Internal.EnumLiteMap<AdUnitId>
        internalGetValueMap() {
      return internalValueMap;
    }
    private static final com.google.protobuf.Internal.EnumLiteMap<
        AdUnitId> internalValueMap =
          new com.google.protobuf.Internal.EnumLiteMap<AdUnitId>() {
            public AdUnitId findValueByNumber(int number) {
              return AdUnitId.forNumber(number);
            }
          };

    public final com.google.protobuf.Descriptors.EnumValueDescriptor
        getValueDescriptor() {
      return getDescriptor().getValues().get(ordinal());
    }
    public final com.google.protobuf.Descriptors.EnumDescriptor
        getDescriptorForType() {
      return getDescriptor();
    }
    public static final com.google.protobuf.Descriptors.EnumDescriptor
        getDescriptor() {
      return com.iabtechlab.openrtb.v2.OpenRtb.getDescriptor().getEnumTypes().get(2);
    }

    private static final AdUnitId[] VALUES = values();

    public static AdUnitId valueOf(
        com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
      if (desc.getType() != getDescriptor()) {
        throw new java.lang.IllegalArgumentException(
          "EnumValueDescriptor is not for this type.");
      }
      return VALUES[desc.getIndex()];
    }

    private final int value;

    private AdUnitId(int value) {
      this.value = value;
    }

    // @@protoc_insertion_point(enum_scope:com.iabtechlab.openrtb.v2.AdUnitId)
  }

  /**
   * <pre>
   * OpenRTB Native 1.1: The context in which the ad appears - what type
   * of content is surrounding the ad on the page at a high level.
   * This maps directly to the new Deep Dive on In-Feed Ad Units.
   * This denotes the primary context, but does not imply other content
   * may not exist on the page - for example it's expected that most
   * content platforms have some social components, etc.
   * </pre>
   *
   * Protobuf enum {@code com.iabtechlab.openrtb.v2.ContextType}
   */
  public enum ContextType
      implements com.google.protobuf.ProtocolMessageEnum {
    /**
     * <pre>
     * Content-centric context such as newsfeed, article, image gallery,
     * video gallery, or similar.
     * </pre>
     *
     * <code>CONTENT = 1;</code>
     */
    CONTENT(1),
    /**
     * <pre>
     * Social-centric context such as social network feed, email,
     * chat, or similar.
     * </pre>
     *
     * <code>SOCIAL = 2;</code>
     */
    SOCIAL(2),
    /**
     * <pre>
     * Product context such as product listings, details, recommendations,
     * reviews, or similar.
     * </pre>
     *
     * <code>PRODUCT = 3;</code>
     */
    PRODUCT(3),
    ;

    /**
     * <pre>
     * Content-centric context such as newsfeed, article, image gallery,
     * video gallery, or similar.
     * </pre>
     *
     * <code>CONTENT = 1;</code>
     */
    public static final int CONTENT_VALUE = 1;
    /**
     * <pre>
     * Social-centric context such as social network feed, email,
     * chat, or similar.
     * </pre>
     *
     * <code>SOCIAL = 2;</code>
     */
    public static final int SOCIAL_VALUE = 2;
    /**
     * <pre>
     * Product context such as product listings, details, recommendations,
     * reviews, or similar.
     * </pre>
     *
     * <code>PRODUCT = 3;</code>
     */
    public static final int PRODUCT_VALUE = 3;


    public final int getNumber() {
      return value;
    }

    /**
     * @param value The numeric wire value of the corresponding enum entry.
     * @return The enum associated with the given numeric wire value.
     * @deprecated Use {@link #forNumber(int)} instead.
     */
    @java.lang.Deprecated
    public static ContextType valueOf(int value) {
      return forNumber(value);
    }

    /**
     * @param value The numeric wire value of the corresponding enum entry.
     * @return The enum associated with the given numeric wire value.
     */
    public static ContextType forNumber(int value) {
      switch (value) {
        case 1: return CONTENT;
        case 2: return SOCIAL;
        case 3: return PRODUCT;
        default: return null;
      }
    }

    public static com.google.protobuf.Internal.EnumLiteMap<ContextType>
        internalGetValueMap() {
      return internalValueMap;
    }
    private static final com.google.protobuf.Internal.EnumLiteMap<
        ContextType> internalValueMap =
          new com.google.protobuf.Internal.EnumLiteMap<ContextType>() {
            public ContextType findValueByNumber(int number) {
              return ContextType.forNumber(number);
            }
          };

    public final com.google.protobuf.Descriptors.EnumValueDescriptor
        getValueDescriptor() {
      return getDescriptor().getValues().get(ordinal());
    }
    public final com.google.protobuf.Descriptors.EnumDescriptor
        getDescriptorForType() {
      return getDescriptor();
    }
    public static final com.google.protobuf.Descriptors.EnumDescriptor
        getDescriptor() {
      return com.iabtechlab.openrtb.v2.OpenRtb.getDescriptor().getEnumTypes().get(3);
    }

    private static final ContextType[] VALUES = values();

    public static ContextType valueOf(
        com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
      if (desc.getType() != getDescriptor()) {
        throw new java.lang.IllegalArgumentException(
          "EnumValueDescriptor is not for this type.");
      }
      return VALUES[desc.getIndex()];
    }

    private final int value;

    private ContextType(int value) {
      this.value = value;
    }

    // @@protoc_insertion_point(enum_scope:com.iabtechlab.openrtb.v2.ContextType)
  }

  public interface BidRequestOrBuilder extends
      // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.BidRequest)
      com.google.protobuf.GeneratedMessageV3.
          ExtendableMessageOrBuilder<BidRequest> {

    /**
     * <pre>
     * Unique ID of the bid request, provided by the exchange.
     * REQUIRED by the OpenRTB specification.
     * </pre>
     *
     * <code>required string id = 1;</code>
     * @return Whether the id field is set.
     */
    boolean hasId();
    /**
     * <pre>
     * Unique ID of the bid request, provided by the exchange.
     * REQUIRED by the OpenRTB specification.
     * </pre>
     *
     * <code>required string id = 1;</code>
     * @return The id.
     */
    java.lang.String getId();
    /**
     * <pre>
     * Unique ID of the bid request, provided by the exchange.
     * REQUIRED by the OpenRTB specification.
     * </pre>
     *
     * <code>required string id = 1;</code>
     * @return The bytes for id.
     */
    com.google.protobuf.ByteString
        getIdBytes();

    /**
     * <pre>
     * Array of Imp objects (Section 3.2.2) representing the impressions offered.
     * At least 1 Imp object is required.
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp imp = 2;</code>
     */
    java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp> 
        getImpList();
    /**
     * <pre>
     * Array of Imp objects (Section 3.2.2) representing the impressions offered.
     * At least 1 Imp object is required.
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp imp = 2;</code>
     */
    com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp getImp(int index);
    /**
     * <pre>
     * Array of Imp objects (Section 3.2.2) representing the impressions offered.
     * At least 1 Imp object is required.
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp imp = 2;</code>
     */
    int getImpCount();
    /**
     * <pre>
     * Array of Imp objects (Section 3.2.2) representing the impressions offered.
     * At least 1 Imp object is required.
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp imp = 2;</code>
     */
    java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.ImpOrBuilder> 
        getImpOrBuilderList();
    /**
     * <pre>
     * Array of Imp objects (Section 3.2.2) representing the impressions offered.
     * At least 1 Imp object is required.
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp imp = 2;</code>
     */
    com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.ImpOrBuilder getImpOrBuilder(
        int index);

    /**
     * <pre>
     * Details via a Site object (Section 3.2.6) about the publisher's website.
     * Only applicable and recommended for websites.
     * </pre>
     *
     * <code>.com.iabtechlab.openrtb.v2.BidRequest.Site site = 3;</code>
     * @return Whether the site field is set.
     */
    boolean hasSite();
    /**
     * <pre>
     * Details via a Site object (Section 3.2.6) about the publisher's website.
     * Only applicable and recommended for websites.
     * </pre>
     *
     * <code>.com.iabtechlab.openrtb.v2.BidRequest.Site site = 3;</code>
     * @return The site.
     */
    com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site getSite();
    /**
     * <pre>
     * Details via a Site object (Section 3.2.6) about the publisher's website.
     * Only applicable and recommended for websites.
     * </pre>
     *
     * <code>.com.iabtechlab.openrtb.v2.BidRequest.Site site = 3;</code>
     */
    com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.SiteOrBuilder getSiteOrBuilder();

    /**
     * <pre>
     * Details via an App object (Section 3.2.7) about the publisher's app
     * (non-browser applications). Only applicable and recommended for apps.
     * </pre>
     *
     * <code>.com.iabtechlab.openrtb.v2.BidRequest.App app = 4;</code>
     * @return Whether the app field is set.
     */
    boolean hasApp();
    /**
     * <pre>
     * Details via an App object (Section 3.2.7) about the publisher's app
     * (non-browser applications). Only applicable and recommended for apps.
     * </pre>
     *
     * <code>.com.iabtechlab.openrtb.v2.BidRequest.App app = 4;</code>
     * @return The app.
     */
    com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App getApp();
    /**
     * <pre>
     * Details via an App object (Section 3.2.7) about the publisher's app
     * (non-browser applications). Only applicable and recommended for apps.
     * </pre>
     *
     * <code>.com.iabtechlab.openrtb.v2.BidRequest.App app = 4;</code>
     */
    com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.AppOrBuilder getAppOrBuilder();

    /**
     * <pre>
     * This object should be included if the ad supported content is a Digital
     * Out-Of-Home screen. A bid request with a DOOH object must not contain a
     * site or app object.
     * </pre>
     *
     * <code>.com.iabtechlab.openrtb.v2.BidRequest.Dooh dooh = 22;</code>
     * @return Whether the dooh field is set.
     */
    boolean hasDooh();
    /**
     * <pre>
     * This object should be included if the ad supported content is a Digital
     * Out-Of-Home screen. A bid request with a DOOH object must not contain a
     * site or app object.
     * </pre>
     *
     * <code>.com.iabtechlab.openrtb.v2.BidRequest.Dooh dooh = 22;</code>
     * @return The dooh.
     */
    com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh getDooh();
    /**
     * <pre>
     * This object should be included if the ad supported content is a Digital
     * Out-Of-Home screen. A bid request with a DOOH object must not contain a
     * site or app object.
     * </pre>
     *
     * <code>.com.iabtechlab.openrtb.v2.BidRequest.Dooh dooh = 22;</code>
     */
    com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.DoohOrBuilder getDoohOrBuilder();

    /**
     * <pre>
     * Details via a Device object (Section 3.2.11) about the user's
     * device to which the impression will be delivered.
     * </pre>
     *
     * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Device device = 5;</code>
     * @return Whether the device field is set.
     */
    boolean hasDevice();
    /**
     * <pre>
     * Details via a Device object (Section 3.2.11) about the user's
     * device to which the impression will be delivered.
     * </pre>
     *
     * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Device device = 5;</code>
     * @return The device.
     */
    com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device getDevice();
    /**
     * <pre>
     * Details via a Device object (Section 3.2.11) about the user's
     * device to which the impression will be delivered.
     * </pre>
     *
     * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Device device = 5;</code>
     */
    com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.DeviceOrBuilder getDeviceOrBuilder();

    /**
     * <pre>
     * A Regs object (Section 3.2.16) that specifies any industry, legal,
     * or governmental regulations in force for this request.
     * </pre>
     *
     * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Regs regs = 14;</code>
     * @return Whether the regs field is set.
     */
    boolean hasRegs();
    /**
     * <pre>
     * A Regs object (Section 3.2.16) that specifies any industry, legal,
     * or governmental regulations in force for this request.
     * </pre>
     *
     * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Regs regs = 14;</code>
     * @return The regs.
     */
    com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs getRegs();
    /**
     * <pre>
     * A Regs object (Section 3.2.16) that specifies any industry, legal,
     * or governmental regulations in force for this request.
     * </pre>
     *
     * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Regs regs = 14;</code>
     */
    com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.RegsOrBuilder getRegsOrBuilder();

    /**
     * <pre>
     * Details via a User object (Section 3.2.13) about the human
     * user of the device; the advertising audience.
     * </pre>
     *
     * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.User user = 6;</code>
     * @return Whether the user field is set.
     */
    boolean hasUser();
    /**
     * <pre>
     * Details via a User object (Section 3.2.13) about the human
     * user of the device; the advertising audience.
     * </pre>
     *
     * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.User user = 6;</code>
     * @return The user.
     */
    com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User getUser();
    /**
     * <pre>
     * Details via a User object (Section 3.2.13) about the human
     * user of the device; the advertising audience.
     * </pre>
     *
     * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.User user = 6;</code>
     */
    com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserOrBuilder getUserOrBuilder();

    /**
     * <pre>
     * Auction type, where 1 = First Price, 2 = Second Price Plus.
     * Refer to enum com.iabtechlab.openrtb.v3.AuctionType for generic values.
     * Exchange-specific auction types can be defined using values &gt; 500.
     * </pre>
     *
     * <code>optional int32 at = 7 [default = 2];</code>
     * @return Whether the at field is set.
     */
    boolean hasAt();
    /**
     * <pre>
     * Auction type, where 1 = First Price, 2 = Second Price Plus.
     * Refer to enum com.iabtechlab.openrtb.v3.AuctionType for generic values.
     * Exchange-specific auction types can be defined using values &gt; 500.
     * </pre>
     *
     * <code>optional int32 at = 7 [default = 2];</code>
     * @return The at.
     */
    int getAt();

    /**
     * <pre>
     * Maximum time in milliseconds to submit a bid to avoid timeout.
     * This value is commonly communicated offline.
     * </pre>
     *
     * <code>optional int32 tmax = 8;</code>
     * @return Whether the tmax field is set.
     */
    boolean hasTmax();
    /**
     * <pre>
     * Maximum time in milliseconds to submit a bid to avoid timeout.
     * This value is commonly communicated offline.
     * </pre>
     *
     * <code>optional int32 tmax = 8;</code>
     * @return The tmax.
     */
    int getTmax();

    /**
     * <pre>
     * Whitelist of buyer seats (e.g., advertisers, agencies) allowed to
     * bid on this impression. IDs of seats and knowledge of the
     * buyer's customers to which they refer must be coordinated
     * between bidders and the exchange a priori.
     * Omission implies no seat restrictions.
     * </pre>
     *
     * <code>repeated string wseat = 9;</code>
     * @return A list containing the wseat.
     */
    java.util.List<java.lang.String>
        getWseatList();
    /**
     * <pre>
     * Whitelist of buyer seats (e.g., advertisers, agencies) allowed to
     * bid on this impression. IDs of seats and knowledge of the
     * buyer's customers to which they refer must be coordinated
     * between bidders and the exchange a priori.
     * Omission implies no seat restrictions.
     * </pre>
     *
     * <code>repeated string wseat = 9;</code>
     * @return The count of wseat.
     */
    int getWseatCount();
    /**
     * <pre>
     * Whitelist of buyer seats (e.g., advertisers, agencies) allowed to
     * bid on this impression. IDs of seats and knowledge of the
     * buyer's customers to which they refer must be coordinated
     * between bidders and the exchange a priori.
     * Omission implies no seat restrictions.
     * </pre>
     *
     * <code>repeated string wseat = 9;</code>
     * @param index The index of the element to return.
     * @return The wseat at the given index.
     */
    java.lang.String getWseat(int index);
    /**
     * <pre>
     * Whitelist of buyer seats (e.g., advertisers, agencies) allowed to
     * bid on this impression. IDs of seats and knowledge of the
     * buyer's customers to which they refer must be coordinated
     * between bidders and the exchange a priori.
     * Omission implies no seat restrictions.
     * </pre>
     *
     * <code>repeated string wseat = 9;</code>
     * @param index The index of the value to return.
     * @return The bytes of the wseat at the given index.
     */
    com.google.protobuf.ByteString
        getWseatBytes(int index);

    /**
     * <pre>
     * Flag to indicate if Exchange can verify that the impressions offered
     * represent all of the impressions available in context (e.g., all on the
     * web page, all video spots such as pre/mid/post roll) to support
     * road-blocking. 0 = no or unknown, 1 = yes, the impressions offered
     * represent all that are available.
     * </pre>
     *
     * <code>optional bool allimps = 10 [default = false];</code>
     * @return Whether the allimps field is set.
     */
    boolean hasAllimps();
    /**
     * <pre>
     * Flag to indicate if Exchange can verify that the impressions offered
     * represent all of the impressions available in context (e.g., all on the
     * web page, all video spots such as pre/mid/post roll) to support
     * road-blocking. 0 = no or unknown, 1 = yes, the impressions offered
     * represent all that are available.
     * </pre>
     *
     * <code>optional bool allimps = 10 [default = false];</code>
     * @return The allimps.
     */
    boolean getAllimps();

    /**
     * <pre>
     * Array of allowed currencies for bids on this bid request using ISO-4217
     * alpha codes. Recommended only if the exchange accepts multiple currencies.
     * </pre>
     *
     * <code>repeated string cur = 11;</code>
     * @return A list containing the cur.
     */
    java.util.List<java.lang.String>
        getCurList();
    /**
     * <pre>
     * Array of allowed currencies for bids on this bid request using ISO-4217
     * alpha codes. Recommended only if the exchange accepts multiple currencies.
     * </pre>
     *
     * <code>repeated string cur = 11;</code>
     * @return The count of cur.
     */
    int getCurCount();
    /**
     * <pre>
     * Array of allowed currencies for bids on this bid request using ISO-4217
     * alpha codes. Recommended only if the exchange accepts multiple currencies.
     * </pre>
     *
     * <code>repeated string cur = 11;</code>
     * @param index The index of the element to return.
     * @return The cur at the given index.
     */
    java.lang.String getCur(int index);
    /**
     * <pre>
     * Array of allowed currencies for bids on this bid request using ISO-4217
     * alpha codes. Recommended only if the exchange accepts multiple currencies.
     * </pre>
     *
     * <code>repeated string cur = 11;</code>
     * @param index The index of the value to return.
     * @return The bytes of the cur at the given index.
     */
    com.google.protobuf.ByteString
        getCurBytes(int index);

    /**
     * <pre>
     * Blocked advertiser categories using the IAB content categories.
     * </pre>
     *
     * <code>repeated string bcat = 12;</code>
     * @return A list containing the bcat.
     */
    java.util.List<java.lang.String>
        getBcatList();
    /**
     * <pre>
     * Blocked advertiser categories using the IAB content categories.
     * </pre>
     *
     * <code>repeated string bcat = 12;</code>
     * @return The count of bcat.
     */
    int getBcatCount();
    /**
     * <pre>
     * Blocked advertiser categories using the IAB content categories.
     * </pre>
     *
     * <code>repeated string bcat = 12;</code>
     * @param index The index of the element to return.
     * @return The bcat at the given index.
     */
    java.lang.String getBcat(int index);
    /**
     * <pre>
     * Blocked advertiser categories using the IAB content categories.
     * </pre>
     *
     * <code>repeated string bcat = 12;</code>
     * @param index The index of the value to return.
     * @return The bytes of the bcat at the given index.
     */
    com.google.protobuf.ByteString
        getBcatBytes(int index);

    /**
     * <pre>
     * The taxonomy in use for bcat.
     * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
     * </pre>
     *
     * <code>optional int32 cattax = 21 [default = 1];</code>
     * @return Whether the cattax field is set.
     */
    boolean hasCattax();
    /**
     * <pre>
     * The taxonomy in use for bcat.
     * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
     * </pre>
     *
     * <code>optional int32 cattax = 21 [default = 1];</code>
     * @return The cattax.
     */
    int getCattax();

    /**
     * <pre>
     * Block list of advertisers by their domains (e.g., "ford.com").
     * </pre>
     *
     * <code>repeated string badv = 13;</code>
     * @return A list containing the badv.
     */
    java.util.List<java.lang.String>
        getBadvList();
    /**
     * <pre>
     * Block list of advertisers by their domains (e.g., "ford.com").
     * </pre>
     *
     * <code>repeated string badv = 13;</code>
     * @return The count of badv.
     */
    int getBadvCount();
    /**
     * <pre>
     * Block list of advertisers by their domains (e.g., "ford.com").
     * </pre>
     *
     * <code>repeated string badv = 13;</code>
     * @param index The index of the element to return.
     * @return The badv at the given index.
     */
    java.lang.String getBadv(int index);
    /**
     * <pre>
     * Block list of advertisers by their domains (e.g., "ford.com").
     * </pre>
     *
     * <code>repeated string badv = 13;</code>
     * @param index The index of the value to return.
     * @return The bytes of the badv at the given index.
     */
    com.google.protobuf.ByteString
        getBadvBytes(int index);

    /**
     * <pre>
     * Block list of applications by their platform-specific exchange
     * independent application identifiers. On Android, these should
     * be bundle or package names (e.g., com.foo.mygame).
     * On iOS, these are numeric IDs.
     * </pre>
     *
     * <code>repeated string bapp = 16;</code>
     * @return A list containing the bapp.
     */
    java.util.List<java.lang.String>
        getBappList();
    /**
     * <pre>
     * Block list of applications by their platform-specific exchange
     * independent application identifiers. On Android, these should
     * be bundle or package names (e.g., com.foo.mygame).
     * On iOS, these are numeric IDs.
     * </pre>
     *
     * <code>repeated string bapp = 16;</code>
     * @return The count of bapp.
     */
    int getBappCount();
    /**
     * <pre>
     * Block list of applications by their platform-specific exchange
     * independent application identifiers. On Android, these should
     * be bundle or package names (e.g., com.foo.mygame).
     * On iOS, these are numeric IDs.
     * </pre>
     *
     * <code>repeated string bapp = 16;</code>
     * @param index The index of the element to return.
     * @return The bapp at the given index.
     */
    java.lang.String getBapp(int index);
    /**
     * <pre>
     * Block list of applications by their platform-specific exchange
     * independent application identifiers. On Android, these should
     * be bundle or package names (e.g., com.foo.mygame).
     * On iOS, these are numeric IDs.
     * </pre>
     *
     * <code>repeated string bapp = 16;</code>
     * @param index The index of the value to return.
     * @return The bytes of the bapp at the given index.
     */
    com.google.protobuf.ByteString
        getBappBytes(int index);

    /**
     * <pre>
     * Indicator of test mode in which auctions are not billable,
     * where 0 = live mode, 1 = test mode.
     * </pre>
     *
     * <code>optional bool test = 15 [default = false];</code>
     * @return Whether the test field is set.
     */
    boolean hasTest();
    /**
     * <pre>
     * Indicator of test mode in which auctions are not billable,
     * where 0 = live mode, 1 = test mode.
     * </pre>
     *
     * <code>optional bool test = 15 [default = false];</code>
     * @return The test.
     */
    boolean getTest();

    /**
     * <pre>
     * Block list of buyer seats (e.g., advertisers, agencies) restricted
     * from bidding on this impression. IDs of seats and knowledge
     * of the buyer's customers to which they refer must be
     * coordinated between bidders and the exchange a priori.
     * At most, only one of wseat and bseat should be used in the
     * same request. Omission of both implies no seat restrictions.
     * </pre>
     *
     * <code>repeated string bseat = 17;</code>
     * @return A list containing the bseat.
     */
    java.util.List<java.lang.String>
        getBseatList();
    /**
     * <pre>
     * Block list of buyer seats (e.g., advertisers, agencies) restricted
     * from bidding on this impression. IDs of seats and knowledge
     * of the buyer's customers to which they refer must be
     * coordinated between bidders and the exchange a priori.
     * At most, only one of wseat and bseat should be used in the
     * same request. Omission of both implies no seat restrictions.
     * </pre>
     *
     * <code>repeated string bseat = 17;</code>
     * @return The count of bseat.
     */
    int getBseatCount();
    /**
     * <pre>
     * Block list of buyer seats (e.g., advertisers, agencies) restricted
     * from bidding on this impression. IDs of seats and knowledge
     * of the buyer's customers to which they refer must be
     * coordinated between bidders and the exchange a priori.
     * At most, only one of wseat and bseat should be used in the
     * same request. Omission of both implies no seat restrictions.
     * </pre>
     *
     * <code>repeated string bseat = 17;</code>
     * @param index The index of the element to return.
     * @return The bseat at the given index.
     */
    java.lang.String getBseat(int index);
    /**
     * <pre>
     * Block list of buyer seats (e.g., advertisers, agencies) restricted
     * from bidding on this impression. IDs of seats and knowledge
     * of the buyer's customers to which they refer must be
     * coordinated between bidders and the exchange a priori.
     * At most, only one of wseat and bseat should be used in the
     * same request. Omission of both implies no seat restrictions.
     * </pre>
     *
     * <code>repeated string bseat = 17;</code>
     * @param index The index of the value to return.
     * @return The bytes of the bseat at the given index.
     */
    com.google.protobuf.ByteString
        getBseatBytes(int index);

    /**
     * <pre>
     * White list of languages for creatives using ISO-639-1-alpha-2.
     * Omission implies no specific restrictions, but buyers would be
     * advised to consider language attribute in the Device and/or
     * Content objects if available.
     * </pre>
     *
     * <code>repeated string wlang = 18;</code>
     * @return A list containing the wlang.
     */
    java.util.List<java.lang.String>
        getWlangList();
    /**
     * <pre>
     * White list of languages for creatives using ISO-639-1-alpha-2.
     * Omission implies no specific restrictions, but buyers would be
     * advised to consider language attribute in the Device and/or
     * Content objects if available.
     * </pre>
     *
     * <code>repeated string wlang = 18;</code>
     * @return The count of wlang.
     */
    int getWlangCount();
    /**
     * <pre>
     * White list of languages for creatives using ISO-639-1-alpha-2.
     * Omission implies no specific restrictions, but buyers would be
     * advised to consider language attribute in the Device and/or
     * Content objects if available.
     * </pre>
     *
     * <code>repeated string wlang = 18;</code>
     * @param index The index of the element to return.
     * @return The wlang at the given index.
     */
    java.lang.String getWlang(int index);
    /**
     * <pre>
     * White list of languages for creatives using ISO-639-1-alpha-2.
     * Omission implies no specific restrictions, but buyers would be
     * advised to consider language attribute in the Device and/or
     * Content objects if available.
     * </pre>
     *
     * <code>repeated string wlang = 18;</code>
     * @param index The index of the value to return.
     * @return The bytes of the wlang at the given index.
     */
    com.google.protobuf.ByteString
        getWlangBytes(int index);

    /**
     * <pre>
     * Allowed list of languages for creatives using IETF BCP 47I. Omission
     * implies no specific restrictions, but buyers would be advised to consider
     * language attribute in the Device and/or Content objects if available. Only
     * one of wlang or wlangb should be present.
     * </pre>
     *
     * <code>repeated string wlangb = 20;</code>
     * @return A list containing the wlangb.
     */
    java.util.List<java.lang.String>
        getWlangbList();
    /**
     * <pre>
     * Allowed list of languages for creatives using IETF BCP 47I. Omission
     * implies no specific restrictions, but buyers would be advised to consider
     * language attribute in the Device and/or Content objects if available. Only
     * one of wlang or wlangb should be present.
     * </pre>
     *
     * <code>repeated string wlangb = 20;</code>
     * @return The count of wlangb.
     */
    int getWlangbCount();
    /**
     * <pre>
     * Allowed list of languages for creatives using IETF BCP 47I. Omission
     * implies no specific restrictions, but buyers would be advised to consider
     * language attribute in the Device and/or Content objects if available. Only
     * one of wlang or wlangb should be present.
     * </pre>
     *
     * <code>repeated string wlangb = 20;</code>
     * @param index The index of the element to return.
     * @return The wlangb at the given index.
     */
    java.lang.String getWlangb(int index);
    /**
     * <pre>
     * Allowed list of languages for creatives using IETF BCP 47I. Omission
     * implies no specific restrictions, but buyers would be advised to consider
     * language attribute in the Device and/or Content objects if available. Only
     * one of wlang or wlangb should be present.
     * </pre>
     *
     * <code>repeated string wlangb = 20;</code>
     * @param index The index of the value to return.
     * @return The bytes of the wlangb at the given index.
     */
    com.google.protobuf.ByteString
        getWlangbBytes(int index);

    /**
     * <pre>
     * A Source object (Section 3.2.2) that provides data about the
     * inventory source and which entity makes the final decision.
     * </pre>
     *
     * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Source source = 19;</code>
     * @return Whether the source field is set.
     */
    boolean hasSource();
    /**
     * <pre>
     * A Source object (Section 3.2.2) that provides data about the
     * inventory source and which entity makes the final decision.
     * </pre>
     *
     * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Source source = 19;</code>
     * @return The source.
     */
    com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source getSource();
    /**
     * <pre>
     * A Source object (Section 3.2.2) that provides data about the
     * inventory source and which entity makes the final decision.
     * </pre>
     *
     * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Source source = 19;</code>
     */
    com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.SourceOrBuilder getSourceOrBuilder();

    public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.DistributionchannelOneofCase getDistributionchannelOneofCase();
  }
  /**
   * <pre>
   * OpenRTB 2.0: The top-level bid request object contains a globally unique
   * bid request or auction ID. This id attribute is required as is at least one
   * impression object (Section 3.2.2). Other attributes in this top-level object
   * establish rules and restrictions that apply to all impressions being offered.
   * There are also several subordinate objects that provide detailed data to
   * potential buyers. Among these are the Site and App objects, which describe
   * the type of published media in which the impression(s) appear.
   * These objects are highly recommended, but only one applies to a given
   * bid request depending on whether the media is browser-based web content
   * or a non-browser application, respectively.
   * </pre>
   *
   * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest}
   */
  public static final class BidRequest extends
      com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
        BidRequest> implements
      // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.BidRequest)
      BidRequestOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use BidRequest.newBuilder() to construct.
    private BidRequest(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest, ?> builder) {
      super(builder);
    }
    private BidRequest() {
      id_ = "";
      imp_ = java.util.Collections.emptyList();
      at_ = 2;
      wseat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
      cur_ = com.google.protobuf.LazyStringArrayList.EMPTY;
      bcat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
      cattax_ = 1;
      badv_ = com.google.protobuf.LazyStringArrayList.EMPTY;
      bapp_ = com.google.protobuf.LazyStringArrayList.EMPTY;
      bseat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
      wlang_ = com.google.protobuf.LazyStringArrayList.EMPTY;
      wlangb_ = com.google.protobuf.LazyStringArrayList.EMPTY;
    }

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

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    private BidRequest(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      this();
      if (extensionRegistry == null) {
        throw new java.lang.NullPointerException();
      }
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            case 10: {
              com.google.protobuf.ByteString bs = input.readBytes();
              bitField0_ |= 0x00000001;
              id_ = bs;
              break;
            }
            case 18: {
              if (!((mutable_bitField0_ & 0x00000002) != 0)) {
                imp_ = new java.util.ArrayList<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp>();
                mutable_bitField0_ |= 0x00000002;
              }
              imp_.add(
                  input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.PARSER, extensionRegistry));
              break;
            }
            case 26: {
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site.Builder subBuilder = null;
              if (distributionchannelOneofCase_ == 3) {
                subBuilder = ((com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site) distributionchannelOneof_).toBuilder();
              }
              distributionchannelOneof_ =
                  input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site) distributionchannelOneof_);
                distributionchannelOneof_ = subBuilder.buildPartial();
              }
              distributionchannelOneofCase_ = 3;
              break;
            }
            case 34: {
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App.Builder subBuilder = null;
              if (distributionchannelOneofCase_ == 4) {
                subBuilder = ((com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App) distributionchannelOneof_).toBuilder();
              }
              distributionchannelOneof_ =
                  input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App) distributionchannelOneof_);
                distributionchannelOneof_ = subBuilder.buildPartial();
              }
              distributionchannelOneofCase_ = 4;
              break;
            }
            case 42: {
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device.Builder subBuilder = null;
              if (((bitField0_ & 0x00000010) != 0)) {
                subBuilder = device_.toBuilder();
              }
              device_ = input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(device_);
                device_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000010;
              break;
            }
            case 50: {
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User.Builder subBuilder = null;
              if (((bitField0_ & 0x00000040) != 0)) {
                subBuilder = user_.toBuilder();
              }
              user_ = input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(user_);
                user_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000040;
              break;
            }
            case 56: {
              bitField0_ |= 0x00000080;
              at_ = input.readInt32();
              break;
            }
            case 64: {
              bitField0_ |= 0x00000100;
              tmax_ = input.readInt32();
              break;
            }
            case 74: {
              com.google.protobuf.ByteString bs = input.readBytes();
              if (!((mutable_bitField0_ & 0x00000400) != 0)) {
                wseat_ = new com.google.protobuf.LazyStringArrayList();
                mutable_bitField0_ |= 0x00000400;
              }
              wseat_.add(bs);
              break;
            }
            case 80: {
              bitField0_ |= 0x00000200;
              allimps_ = input.readBool();
              break;
            }
            case 90: {
              com.google.protobuf.ByteString bs = input.readBytes();
              if (!((mutable_bitField0_ & 0x00001000) != 0)) {
                cur_ = new com.google.protobuf.LazyStringArrayList();
                mutable_bitField0_ |= 0x00001000;
              }
              cur_.add(bs);
              break;
            }
            case 98: {
              com.google.protobuf.ByteString bs = input.readBytes();
              if (!((mutable_bitField0_ & 0x00002000) != 0)) {
                bcat_ = new com.google.protobuf.LazyStringArrayList();
                mutable_bitField0_ |= 0x00002000;
              }
              bcat_.add(bs);
              break;
            }
            case 106: {
              com.google.protobuf.ByteString bs = input.readBytes();
              if (!((mutable_bitField0_ & 0x00008000) != 0)) {
                badv_ = new com.google.protobuf.LazyStringArrayList();
                mutable_bitField0_ |= 0x00008000;
              }
              badv_.add(bs);
              break;
            }
            case 114: {
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs.Builder subBuilder = null;
              if (((bitField0_ & 0x00000020) != 0)) {
                subBuilder = regs_.toBuilder();
              }
              regs_ = input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(regs_);
                regs_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000020;
              break;
            }
            case 120: {
              bitField0_ |= 0x00000800;
              test_ = input.readBool();
              break;
            }
            case 130: {
              com.google.protobuf.ByteString bs = input.readBytes();
              if (!((mutable_bitField0_ & 0x00010000) != 0)) {
                bapp_ = new com.google.protobuf.LazyStringArrayList();
                mutable_bitField0_ |= 0x00010000;
              }
              bapp_.add(bs);
              break;
            }
            case 138: {
              com.google.protobuf.ByteString bs = input.readBytes();
              if (!((mutable_bitField0_ & 0x00040000) != 0)) {
                bseat_ = new com.google.protobuf.LazyStringArrayList();
                mutable_bitField0_ |= 0x00040000;
              }
              bseat_.add(bs);
              break;
            }
            case 146: {
              com.google.protobuf.ByteString bs = input.readBytes();
              if (!((mutable_bitField0_ & 0x00080000) != 0)) {
                wlang_ = new com.google.protobuf.LazyStringArrayList();
                mutable_bitField0_ |= 0x00080000;
              }
              wlang_.add(bs);
              break;
            }
            case 154: {
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source.Builder subBuilder = null;
              if (((bitField0_ & 0x00001000) != 0)) {
                subBuilder = source_.toBuilder();
              }
              source_ = input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(source_);
                source_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00001000;
              break;
            }
            case 162: {
              com.google.protobuf.ByteString bs = input.readBytes();
              if (!((mutable_bitField0_ & 0x00100000) != 0)) {
                wlangb_ = new com.google.protobuf.LazyStringArrayList();
                mutable_bitField0_ |= 0x00100000;
              }
              wlangb_.add(bs);
              break;
            }
            case 168: {
              bitField0_ |= 0x00000400;
              cattax_ = input.readInt32();
              break;
            }
            case 178: {
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh.Builder subBuilder = null;
              if (distributionchannelOneofCase_ == 22) {
                subBuilder = ((com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh) distributionchannelOneof_).toBuilder();
              }
              distributionchannelOneof_ =
                  input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh) distributionchannelOneof_);
                distributionchannelOneof_ = subBuilder.buildPartial();
              }
              distributionchannelOneofCase_ = 22;
              break;
            }
            default: {
              if (!parseUnknownField(
                  input, unknownFields, extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e).setUnfinishedMessage(this);
      } finally {
        if (((mutable_bitField0_ & 0x00000002) != 0)) {
          imp_ = java.util.Collections.unmodifiableList(imp_);
        }
        if (((mutable_bitField0_ & 0x00000400) != 0)) {
          wseat_ = wseat_.getUnmodifiableView();
        }
        if (((mutable_bitField0_ & 0x00001000) != 0)) {
          cur_ = cur_.getUnmodifiableView();
        }
        if (((mutable_bitField0_ & 0x00002000) != 0)) {
          bcat_ = bcat_.getUnmodifiableView();
        }
        if (((mutable_bitField0_ & 0x00008000) != 0)) {
          badv_ = badv_.getUnmodifiableView();
        }
        if (((mutable_bitField0_ & 0x00010000) != 0)) {
          bapp_ = bapp_.getUnmodifiableView();
        }
        if (((mutable_bitField0_ & 0x00040000) != 0)) {
          bseat_ = bseat_.getUnmodifiableView();
        }
        if (((mutable_bitField0_ & 0x00080000) != 0)) {
          wlang_ = wlang_.getUnmodifiableView();
        }
        if (((mutable_bitField0_ & 0x00100000) != 0)) {
          wlangb_ = wlangb_.getUnmodifiableView();
        }
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Builder.class);
    }

    public interface SourceOrBuilder extends
        // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.BidRequest.Source)
        com.google.protobuf.GeneratedMessageV3.
            ExtendableMessageOrBuilder<Source> {

      /**
       * <pre>
       * Entity responsible for the final impression sale decision,
       * where 0 = exchange, 1 = upstream source
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional bool fd = 1;</code>
       * @return Whether the fd field is set.
       */
      boolean hasFd();
      /**
       * <pre>
       * Entity responsible for the final impression sale decision,
       * where 0 = exchange, 1 = upstream source
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional bool fd = 1;</code>
       * @return The fd.
       */
      boolean getFd();

      /**
       * <pre>
       * Transaction ID that must be common across all participants in
       * this bid request (e.g., potentially multiple exchanges).
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional string tid = 2;</code>
       * @return Whether the tid field is set.
       */
      boolean hasTid();
      /**
       * <pre>
       * Transaction ID that must be common across all participants in
       * this bid request (e.g., potentially multiple exchanges).
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional string tid = 2;</code>
       * @return The tid.
       */
      java.lang.String getTid();
      /**
       * <pre>
       * Transaction ID that must be common across all participants in
       * this bid request (e.g., potentially multiple exchanges).
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional string tid = 2;</code>
       * @return The bytes for tid.
       */
      com.google.protobuf.ByteString
          getTidBytes();

      /**
       * <pre>
       * Payment ID chain string containing embedded syntax
       * described in the TAG Payment ID Protocol v1.0.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional string pchain = 3;</code>
       * @return Whether the pchain field is set.
       */
      boolean hasPchain();
      /**
       * <pre>
       * Payment ID chain string containing embedded syntax
       * described in the TAG Payment ID Protocol v1.0.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional string pchain = 3;</code>
       * @return The pchain.
       */
      java.lang.String getPchain();
      /**
       * <pre>
       * Payment ID chain string containing embedded syntax
       * described in the TAG Payment ID Protocol v1.0.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional string pchain = 3;</code>
       * @return The bytes for pchain.
       */
      com.google.protobuf.ByteString
          getPchainBytes();
    }
    /**
     * <pre>
     * OpenRTB 2.5: This object describes the nature and behavior of the entity
     * that is the source of the bid request upstream from the exchange.
     * The primary purpose of this object is to define post-auction or upstream
     * decisioning when the exchange itself does not control the final decision.
     * A common example of this is header bidding, but it can also apply to
     * upstream server entities such as another RTB exchange, a mediation
     * platform, or an ad server combines direct campaigns with 3rd party
     * demand in decisioning.
     * </pre>
     *
     * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Source}
     */
    public static final class Source extends
        com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
          Source> implements
        // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.BidRequest.Source)
        SourceOrBuilder {
    private static final long serialVersionUID = 0L;
      // Use Source.newBuilder() to construct.
      private Source(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source, ?> builder) {
        super(builder);
      }
      private Source() {
        tid_ = "";
        pchain_ = "";
      }

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

      @java.lang.Override
      public final com.google.protobuf.UnknownFieldSet
      getUnknownFields() {
        return this.unknownFields;
      }
      private Source(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        this();
        if (extensionRegistry == null) {
          throw new java.lang.NullPointerException();
        }
        int mutable_bitField0_ = 0;
        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
            com.google.protobuf.UnknownFieldSet.newBuilder();
        try {
          boolean done = false;
          while (!done) {
            int tag = input.readTag();
            switch (tag) {
              case 0:
                done = true;
                break;
              case 8: {
                bitField0_ |= 0x00000001;
                fd_ = input.readBool();
                break;
              }
              case 18: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000002;
                tid_ = bs;
                break;
              }
              case 26: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000004;
                pchain_ = bs;
                break;
              }
              default: {
                if (!parseUnknownField(
                    input, unknownFields, extensionRegistry, tag)) {
                  done = true;
                }
                break;
              }
            }
          }
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          throw e.setUnfinishedMessage(this);
        } catch (java.io.IOException e) {
          throw new com.google.protobuf.InvalidProtocolBufferException(
              e).setUnfinishedMessage(this);
        } finally {
          this.unknownFields = unknownFields.build();
          makeExtensionsImmutable();
        }
      }
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Source_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Source_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source.Builder.class);
      }

      private int bitField0_;
      public static final int FD_FIELD_NUMBER = 1;
      private boolean fd_;
      /**
       * <pre>
       * Entity responsible for the final impression sale decision,
       * where 0 = exchange, 1 = upstream source
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional bool fd = 1;</code>
       * @return Whether the fd field is set.
       */
      @java.lang.Override
      public boolean hasFd() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <pre>
       * Entity responsible for the final impression sale decision,
       * where 0 = exchange, 1 = upstream source
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional bool fd = 1;</code>
       * @return The fd.
       */
      @java.lang.Override
      public boolean getFd() {
        return fd_;
      }

      public static final int TID_FIELD_NUMBER = 2;
      private volatile java.lang.Object tid_;
      /**
       * <pre>
       * Transaction ID that must be common across all participants in
       * this bid request (e.g., potentially multiple exchanges).
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional string tid = 2;</code>
       * @return Whether the tid field is set.
       */
      @java.lang.Override
      public boolean hasTid() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <pre>
       * Transaction ID that must be common across all participants in
       * this bid request (e.g., potentially multiple exchanges).
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional string tid = 2;</code>
       * @return The tid.
       */
      @java.lang.Override
      public java.lang.String getTid() {
        java.lang.Object ref = tid_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            tid_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Transaction ID that must be common across all participants in
       * this bid request (e.g., potentially multiple exchanges).
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional string tid = 2;</code>
       * @return The bytes for tid.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getTidBytes() {
        java.lang.Object ref = tid_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          tid_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int PCHAIN_FIELD_NUMBER = 3;
      private volatile java.lang.Object pchain_;
      /**
       * <pre>
       * Payment ID chain string containing embedded syntax
       * described in the TAG Payment ID Protocol v1.0.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional string pchain = 3;</code>
       * @return Whether the pchain field is set.
       */
      @java.lang.Override
      public boolean hasPchain() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <pre>
       * Payment ID chain string containing embedded syntax
       * described in the TAG Payment ID Protocol v1.0.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional string pchain = 3;</code>
       * @return The pchain.
       */
      @java.lang.Override
      public java.lang.String getPchain() {
        java.lang.Object ref = pchain_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            pchain_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Payment ID chain string containing embedded syntax
       * described in the TAG Payment ID Protocol v1.0.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional string pchain = 3;</code>
       * @return The bytes for pchain.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getPchainBytes() {
        java.lang.Object ref = pchain_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          pchain_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

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

        if (!extensionsAreInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
        memoizedIsInitialized = 1;
        return true;
      }

      @java.lang.Override
      public void writeTo(com.google.protobuf.CodedOutputStream output)
                          throws java.io.IOException {
        com.google.protobuf.GeneratedMessageV3
          .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source>.ExtensionWriter
            extensionWriter = newExtensionWriter();
        if (((bitField0_ & 0x00000001) != 0)) {
          output.writeBool(1, fd_);
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 2, tid_);
        }
        if (((bitField0_ & 0x00000004) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 3, pchain_);
        }
        extensionWriter.writeUntil(10000, output);
        unknownFields.writeTo(output);
      }

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

        size = 0;
        if (((bitField0_ & 0x00000001) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeBoolSize(1, fd_);
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, tid_);
        }
        if (((bitField0_ & 0x00000004) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, pchain_);
        }
        size += extensionsSerializedSize();
        size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source)) {
          return super.equals(obj);
        }
        com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source other = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source) obj;

        if (hasFd() != other.hasFd()) return false;
        if (hasFd()) {
          if (getFd()
              != other.getFd()) return false;
        }
        if (hasTid() != other.hasTid()) return false;
        if (hasTid()) {
          if (!getTid()
              .equals(other.getTid())) return false;
        }
        if (hasPchain() != other.hasPchain()) return false;
        if (hasPchain()) {
          if (!getPchain()
              .equals(other.getPchain())) return false;
        }
        if (!unknownFields.equals(other.unknownFields)) return false;
        if (!getExtensionFields().equals(other.getExtensionFields()))
          return false;
        return true;
      }

      @java.lang.Override
      public int hashCode() {
        if (memoizedHashCode != 0) {
          return memoizedHashCode;
        }
        int hash = 41;
        hash = (19 * hash) + getDescriptor().hashCode();
        if (hasFd()) {
          hash = (37 * hash) + FD_FIELD_NUMBER;
          hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
              getFd());
        }
        if (hasTid()) {
          hash = (37 * hash) + TID_FIELD_NUMBER;
          hash = (53 * hash) + getTid().hashCode();
        }
        if (hasPchain()) {
          hash = (37 * hash) + PCHAIN_FIELD_NUMBER;
          hash = (53 * hash) + getPchain().hashCode();
        }
        hash = hashFields(hash, getExtensionFields());
        hash = (29 * hash) + unknownFields.hashCode();
        memoizedHashCode = hash;
        return hash;
      }

      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source parseFrom(
          java.nio.ByteBuffer data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source parseFrom(
          java.nio.ByteBuffer data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source parseFrom(
          com.google.protobuf.ByteString data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source parseFrom(
          com.google.protobuf.ByteString data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source parseFrom(byte[] data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source parseFrom(
          byte[] data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source parseFrom(java.io.InputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source parseDelimitedFrom(java.io.InputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseDelimitedWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source parseFrom(
          com.google.protobuf.CodedInputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source 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>
       * OpenRTB 2.5: This object describes the nature and behavior of the entity
       * that is the source of the bid request upstream from the exchange.
       * The primary purpose of this object is to define post-auction or upstream
       * decisioning when the exchange itself does not control the final decision.
       * A common example of this is header bidding, but it can also apply to
       * upstream server entities such as another RTB exchange, a mediation
       * platform, or an ad server combines direct campaigns with 3rd party
       * demand in decisioning.
       * </pre>
       *
       * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Source}
       */
      public static final class Builder extends
          com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source, Builder> implements
          // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.BidRequest.Source)
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.SourceOrBuilder {
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Source_descriptor;
        }

        @java.lang.Override
        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Source_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source.Builder.class);
        }

        // Construct using com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source.newBuilder()
        private Builder() {
          maybeForceBuilderInitialization();
        }

        private Builder(
            com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
          super(parent);
          maybeForceBuilderInitialization();
        }
        private void maybeForceBuilderInitialization() {
          if (com.google.protobuf.GeneratedMessageV3
                  .alwaysUseFieldBuilders) {
          }
        }
        @java.lang.Override
        public Builder clear() {
          super.clear();
          fd_ = false;
          bitField0_ = (bitField0_ & ~0x00000001);
          tid_ = "";
          bitField0_ = (bitField0_ & ~0x00000002);
          pchain_ = "";
          bitField0_ = (bitField0_ & ~0x00000004);
          return this;
        }

        @java.lang.Override
        public com.google.protobuf.Descriptors.Descriptor
            getDescriptorForType() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Source_descriptor;
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source getDefaultInstanceForType() {
          return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source.getDefaultInstance();
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source build() {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source result = buildPartial();
          if (!result.isInitialized()) {
            throw newUninitializedMessageException(result);
          }
          return result;
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source buildPartial() {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source result = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source(this);
          int from_bitField0_ = bitField0_;
          int to_bitField0_ = 0;
          if (((from_bitField0_ & 0x00000001) != 0)) {
            result.fd_ = fd_;
            to_bitField0_ |= 0x00000001;
          }
          if (((from_bitField0_ & 0x00000002) != 0)) {
            to_bitField0_ |= 0x00000002;
          }
          result.tid_ = tid_;
          if (((from_bitField0_ & 0x00000004) != 0)) {
            to_bitField0_ |= 0x00000004;
          }
          result.pchain_ = pchain_;
          result.bitField0_ = to_bitField0_;
          onBuilt();
          return result;
        }

        @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 <Type> Builder setExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source, Type> extension,
            Type value) {
          return super.setExtension(extension, value);
        }
        @java.lang.Override
        public <Type> Builder setExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source, java.util.List<Type>> extension,
            int index, Type value) {
          return super.setExtension(extension, index, value);
        }
        @java.lang.Override
        public <Type> Builder addExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source, java.util.List<Type>> extension,
            Type value) {
          return super.addExtension(extension, value);
        }
        @java.lang.Override
        public <Type> Builder clearExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source, ?> extension) {
          return super.clearExtension(extension);
        }
        @java.lang.Override
        public Builder mergeFrom(com.google.protobuf.Message other) {
          if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source) {
            return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source)other);
          } else {
            super.mergeFrom(other);
            return this;
          }
        }

        public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source other) {
          if (other == com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source.getDefaultInstance()) return this;
          if (other.hasFd()) {
            setFd(other.getFd());
          }
          if (other.hasTid()) {
            bitField0_ |= 0x00000002;
            tid_ = other.tid_;
            onChanged();
          }
          if (other.hasPchain()) {
            bitField0_ |= 0x00000004;
            pchain_ = other.pchain_;
            onChanged();
          }
          this.mergeExtensionFields(other);
          this.mergeUnknownFields(other.unknownFields);
          onChanged();
          return this;
        }

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

        @java.lang.Override
        public Builder mergeFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws java.io.IOException {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source parsedMessage = null;
          try {
            parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source) e.getUnfinishedMessage();
            throw e.unwrapIOException();
          } finally {
            if (parsedMessage != null) {
              mergeFrom(parsedMessage);
            }
          }
          return this;
        }
        private int bitField0_;

        private boolean fd_ ;
        /**
         * <pre>
         * Entity responsible for the final impression sale decision,
         * where 0 = exchange, 1 = upstream source
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional bool fd = 1;</code>
         * @return Whether the fd field is set.
         */
        @java.lang.Override
        public boolean hasFd() {
          return ((bitField0_ & 0x00000001) != 0);
        }
        /**
         * <pre>
         * Entity responsible for the final impression sale decision,
         * where 0 = exchange, 1 = upstream source
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional bool fd = 1;</code>
         * @return The fd.
         */
        @java.lang.Override
        public boolean getFd() {
          return fd_;
        }
        /**
         * <pre>
         * Entity responsible for the final impression sale decision,
         * where 0 = exchange, 1 = upstream source
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional bool fd = 1;</code>
         * @param value The fd to set.
         * @return This builder for chaining.
         */
        public Builder setFd(boolean value) {
          bitField0_ |= 0x00000001;
          fd_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Entity responsible for the final impression sale decision,
         * where 0 = exchange, 1 = upstream source
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional bool fd = 1;</code>
         * @return This builder for chaining.
         */
        public Builder clearFd() {
          bitField0_ = (bitField0_ & ~0x00000001);
          fd_ = false;
          onChanged();
          return this;
        }

        private java.lang.Object tid_ = "";
        /**
         * <pre>
         * Transaction ID that must be common across all participants in
         * this bid request (e.g., potentially multiple exchanges).
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string tid = 2;</code>
         * @return Whether the tid field is set.
         */
        public boolean hasTid() {
          return ((bitField0_ & 0x00000002) != 0);
        }
        /**
         * <pre>
         * Transaction ID that must be common across all participants in
         * this bid request (e.g., potentially multiple exchanges).
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string tid = 2;</code>
         * @return The tid.
         */
        public java.lang.String getTid() {
          java.lang.Object ref = tid_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              tid_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Transaction ID that must be common across all participants in
         * this bid request (e.g., potentially multiple exchanges).
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string tid = 2;</code>
         * @return The bytes for tid.
         */
        public com.google.protobuf.ByteString
            getTidBytes() {
          java.lang.Object ref = tid_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            tid_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Transaction ID that must be common across all participants in
         * this bid request (e.g., potentially multiple exchanges).
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string tid = 2;</code>
         * @param value The tid to set.
         * @return This builder for chaining.
         */
        public Builder setTid(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
          tid_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Transaction ID that must be common across all participants in
         * this bid request (e.g., potentially multiple exchanges).
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string tid = 2;</code>
         * @return This builder for chaining.
         */
        public Builder clearTid() {
          bitField0_ = (bitField0_ & ~0x00000002);
          tid_ = getDefaultInstance().getTid();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Transaction ID that must be common across all participants in
         * this bid request (e.g., potentially multiple exchanges).
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string tid = 2;</code>
         * @param value The bytes for tid to set.
         * @return This builder for chaining.
         */
        public Builder setTidBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
          tid_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object pchain_ = "";
        /**
         * <pre>
         * Payment ID chain string containing embedded syntax
         * described in the TAG Payment ID Protocol v1.0.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string pchain = 3;</code>
         * @return Whether the pchain field is set.
         */
        public boolean hasPchain() {
          return ((bitField0_ & 0x00000004) != 0);
        }
        /**
         * <pre>
         * Payment ID chain string containing embedded syntax
         * described in the TAG Payment ID Protocol v1.0.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string pchain = 3;</code>
         * @return The pchain.
         */
        public java.lang.String getPchain() {
          java.lang.Object ref = pchain_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              pchain_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Payment ID chain string containing embedded syntax
         * described in the TAG Payment ID Protocol v1.0.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string pchain = 3;</code>
         * @return The bytes for pchain.
         */
        public com.google.protobuf.ByteString
            getPchainBytes() {
          java.lang.Object ref = pchain_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            pchain_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Payment ID chain string containing embedded syntax
         * described in the TAG Payment ID Protocol v1.0.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string pchain = 3;</code>
         * @param value The pchain to set.
         * @return This builder for chaining.
         */
        public Builder setPchain(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
          pchain_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Payment ID chain string containing embedded syntax
         * described in the TAG Payment ID Protocol v1.0.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string pchain = 3;</code>
         * @return This builder for chaining.
         */
        public Builder clearPchain() {
          bitField0_ = (bitField0_ & ~0x00000004);
          pchain_ = getDefaultInstance().getPchain();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Payment ID chain string containing embedded syntax
         * described in the TAG Payment ID Protocol v1.0.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string pchain = 3;</code>
         * @param value The bytes for pchain to set.
         * @return This builder for chaining.
         */
        public Builder setPchainBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
          pchain_ = value;
          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:com.iabtechlab.openrtb.v2.BidRequest.Source)
      }

      // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.BidRequest.Source)
      private static final com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source DEFAULT_INSTANCE;
      static {
        DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source();
      }

      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source getDefaultInstance() {
        return DEFAULT_INSTANCE;
      }

      @java.lang.Deprecated public static final com.google.protobuf.Parser<Source>
          PARSER = new com.google.protobuf.AbstractParser<Source>() {
        @java.lang.Override
        public Source parsePartialFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return new Source(input, extensionRegistry);
        }
      };

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

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

      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source getDefaultInstanceForType() {
        return DEFAULT_INSTANCE;
      }

    }

    public interface ImpOrBuilder extends
        // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.BidRequest.Imp)
        com.google.protobuf.GeneratedMessageV3.
            ExtendableMessageOrBuilder<Imp> {

      /**
       * <pre>
       * A unique identifier for this impression within the context of the bid
       * request (typically, value starts with 1, and increments up to n
       * for n impressions).
       * </pre>
       *
       * <code>required string id = 1;</code>
       * @return Whether the id field is set.
       */
      boolean hasId();
      /**
       * <pre>
       * A unique identifier for this impression within the context of the bid
       * request (typically, value starts with 1, and increments up to n
       * for n impressions).
       * </pre>
       *
       * <code>required string id = 1;</code>
       * @return The id.
       */
      java.lang.String getId();
      /**
       * <pre>
       * A unique identifier for this impression within the context of the bid
       * request (typically, value starts with 1, and increments up to n
       * for n impressions).
       * </pre>
       *
       * <code>required string id = 1;</code>
       * @return The bytes for id.
       */
      com.google.protobuf.ByteString
          getIdBytes();

      /**
       * <pre>
       * A Banner object (Section 3.2.3); required if this impression is
       * offered as a banner ad opportunity.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner banner = 2;</code>
       * @return Whether the banner field is set.
       */
      boolean hasBanner();
      /**
       * <pre>
       * A Banner object (Section 3.2.3); required if this impression is
       * offered as a banner ad opportunity.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner banner = 2;</code>
       * @return The banner.
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner getBanner();
      /**
       * <pre>
       * A Banner object (Section 3.2.3); required if this impression is
       * offered as a banner ad opportunity.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner banner = 2;</code>
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.BannerOrBuilder getBannerOrBuilder();

      /**
       * <pre>
       * A Video object (Section 3.2.4); required if this impression is
       * offered as a video ad opportunity.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Video video = 3;</code>
       * @return Whether the video field is set.
       */
      boolean hasVideo();
      /**
       * <pre>
       * A Video object (Section 3.2.4); required if this impression is
       * offered as a video ad opportunity.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Video video = 3;</code>
       * @return The video.
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video getVideo();
      /**
       * <pre>
       * A Video object (Section 3.2.4); required if this impression is
       * offered as a video ad opportunity.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Video video = 3;</code>
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.VideoOrBuilder getVideoOrBuilder();

      /**
       * <pre>
       * An Audio object; required if this impression is offered
       * as an audio ad opportunity.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Audio audio = 15;</code>
       * @return Whether the audio field is set.
       */
      boolean hasAudio();
      /**
       * <pre>
       * An Audio object; required if this impression is offered
       * as an audio ad opportunity.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Audio audio = 15;</code>
       * @return The audio.
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio getAudio();
      /**
       * <pre>
       * An Audio object; required if this impression is offered
       * as an audio ad opportunity.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Audio audio = 15;</code>
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.AudioOrBuilder getAudioOrBuilder();

      /**
       * <pre>
       * Name of ad mediation partner, SDK technology, or player responsible
       * for rendering ad (typically video or mobile). Used by some ad servers
       * to customize ad code by partner. Recommended for video and/or apps.
       * </pre>
       *
       * <code>optional string displaymanager = 4;</code>
       * @return Whether the displaymanager field is set.
       */
      boolean hasDisplaymanager();
      /**
       * <pre>
       * Name of ad mediation partner, SDK technology, or player responsible
       * for rendering ad (typically video or mobile). Used by some ad servers
       * to customize ad code by partner. Recommended for video and/or apps.
       * </pre>
       *
       * <code>optional string displaymanager = 4;</code>
       * @return The displaymanager.
       */
      java.lang.String getDisplaymanager();
      /**
       * <pre>
       * Name of ad mediation partner, SDK technology, or player responsible
       * for rendering ad (typically video or mobile). Used by some ad servers
       * to customize ad code by partner. Recommended for video and/or apps.
       * </pre>
       *
       * <code>optional string displaymanager = 4;</code>
       * @return The bytes for displaymanager.
       */
      com.google.protobuf.ByteString
          getDisplaymanagerBytes();

      /**
       * <pre>
       * Version of ad mediation partner, SDK technology, or player responsible
       * for rendering ad (typically video or mobile). Used by some ad servers
       * to customize ad code by partner. Recommended for video and/or apps.
       * </pre>
       *
       * <code>optional string displaymanagerver = 5;</code>
       * @return Whether the displaymanagerver field is set.
       */
      boolean hasDisplaymanagerver();
      /**
       * <pre>
       * Version of ad mediation partner, SDK technology, or player responsible
       * for rendering ad (typically video or mobile). Used by some ad servers
       * to customize ad code by partner. Recommended for video and/or apps.
       * </pre>
       *
       * <code>optional string displaymanagerver = 5;</code>
       * @return The displaymanagerver.
       */
      java.lang.String getDisplaymanagerver();
      /**
       * <pre>
       * Version of ad mediation partner, SDK technology, or player responsible
       * for rendering ad (typically video or mobile). Used by some ad servers
       * to customize ad code by partner. Recommended for video and/or apps.
       * </pre>
       *
       * <code>optional string displaymanagerver = 5;</code>
       * @return The bytes for displaymanagerver.
       */
      com.google.protobuf.ByteString
          getDisplaymanagerverBytes();

      /**
       * <pre>
       * 1 = the ad is interstitial or full screen, 0 = not interstitial.
       * </pre>
       *
       * <code>optional bool instl = 6;</code>
       * @return Whether the instl field is set.
       */
      boolean hasInstl();
      /**
       * <pre>
       * 1 = the ad is interstitial or full screen, 0 = not interstitial.
       * </pre>
       *
       * <code>optional bool instl = 6;</code>
       * @return The instl.
       */
      boolean getInstl();

      /**
       * <pre>
       * Identifier for specific ad placement or ad tag that was used to
       * initiate the auction. This can be useful for debugging of any issues,
       * or for optimization by the buyer.
       * </pre>
       *
       * <code>optional string tagid = 7;</code>
       * @return Whether the tagid field is set.
       */
      boolean hasTagid();
      /**
       * <pre>
       * Identifier for specific ad placement or ad tag that was used to
       * initiate the auction. This can be useful for debugging of any issues,
       * or for optimization by the buyer.
       * </pre>
       *
       * <code>optional string tagid = 7;</code>
       * @return The tagid.
       */
      java.lang.String getTagid();
      /**
       * <pre>
       * Identifier for specific ad placement or ad tag that was used to
       * initiate the auction. This can be useful for debugging of any issues,
       * or for optimization by the buyer.
       * </pre>
       *
       * <code>optional string tagid = 7;</code>
       * @return The bytes for tagid.
       */
      com.google.protobuf.ByteString
          getTagidBytes();

      /**
       * <pre>
       * Minimum bid for this impression expressed in CPM.
       * </pre>
       *
       * <code>optional double bidfloor = 8 [default = 0];</code>
       * @return Whether the bidfloor field is set.
       */
      boolean hasBidfloor();
      /**
       * <pre>
       * Minimum bid for this impression expressed in CPM.
       * </pre>
       *
       * <code>optional double bidfloor = 8 [default = 0];</code>
       * @return The bidfloor.
       */
      double getBidfloor();

      /**
       * <pre>
       * Currency specified using ISO-4217 alpha codes. This may be different
       * from bid currency returned by bidder if this is allowed by the exchange.
       * </pre>
       *
       * <code>optional string bidfloorcur = 9 [default = "USD"];</code>
       * @return Whether the bidfloorcur field is set.
       */
      boolean hasBidfloorcur();
      /**
       * <pre>
       * Currency specified using ISO-4217 alpha codes. This may be different
       * from bid currency returned by bidder if this is allowed by the exchange.
       * </pre>
       *
       * <code>optional string bidfloorcur = 9 [default = "USD"];</code>
       * @return The bidfloorcur.
       */
      java.lang.String getBidfloorcur();
      /**
       * <pre>
       * Currency specified using ISO-4217 alpha codes. This may be different
       * from bid currency returned by bidder if this is allowed by the exchange.
       * </pre>
       *
       * <code>optional string bidfloorcur = 9 [default = "USD"];</code>
       * @return The bytes for bidfloorcur.
       */
      com.google.protobuf.ByteString
          getBidfloorcurBytes();

      /**
       * <pre>
       * Indicates the type of browser opened upon clicking the
       * creative in an app, where 0 = embedded, 1 = native.
       * Note that the Safari View Controller in iOS 9.x devices is considered
       * a native browser for purposes of this attribute.
       * </pre>
       *
       * <code>optional bool clickbrowser = 16;</code>
       * @return Whether the clickbrowser field is set.
       */
      boolean hasClickbrowser();
      /**
       * <pre>
       * Indicates the type of browser opened upon clicking the
       * creative in an app, where 0 = embedded, 1 = native.
       * Note that the Safari View Controller in iOS 9.x devices is considered
       * a native browser for purposes of this attribute.
       * </pre>
       *
       * <code>optional bool clickbrowser = 16;</code>
       * @return The clickbrowser.
       */
      boolean getClickbrowser();

      /**
       * <pre>
       * Flag to indicate if the impression requires secure HTTPS URL creative
       * assets and markup, where 0 = non-secure, 1 = secure.  If omitted,
       * the secure state is unknown, but non-secure HTTP support can be assumed.
       * </pre>
       *
       * <code>optional bool secure = 12;</code>
       * @return Whether the secure field is set.
       */
      boolean hasSecure();
      /**
       * <pre>
       * Flag to indicate if the impression requires secure HTTPS URL creative
       * assets and markup, where 0 = non-secure, 1 = secure.  If omitted,
       * the secure state is unknown, but non-secure HTTP support can be assumed.
       * </pre>
       *
       * <code>optional bool secure = 12;</code>
       * @return The secure.
       */
      boolean getSecure();

      /**
       * <pre>
       * Array of exchange-specific names of supported iframe busters.
       * </pre>
       *
       * <code>repeated string iframebuster = 10;</code>
       * @return A list containing the iframebuster.
       */
      java.util.List<java.lang.String>
          getIframebusterList();
      /**
       * <pre>
       * Array of exchange-specific names of supported iframe busters.
       * </pre>
       *
       * <code>repeated string iframebuster = 10;</code>
       * @return The count of iframebuster.
       */
      int getIframebusterCount();
      /**
       * <pre>
       * Array of exchange-specific names of supported iframe busters.
       * </pre>
       *
       * <code>repeated string iframebuster = 10;</code>
       * @param index The index of the element to return.
       * @return The iframebuster at the given index.
       */
      java.lang.String getIframebuster(int index);
      /**
       * <pre>
       * Array of exchange-specific names of supported iframe busters.
       * </pre>
       *
       * <code>repeated string iframebuster = 10;</code>
       * @param index The index of the value to return.
       * @return The bytes of the iframebuster at the given index.
       */
      com.google.protobuf.ByteString
          getIframebusterBytes(int index);

      /**
       * <pre>
       * Indicates whether the user receives a reward for viewing the ad, where 0
       * = no, 1 = yes. Typically video ad implementations allow users to read an
       * additional news article for free, receive an extra life in a game, or get
       * a sponsored ad-free music session. The reward is typically distributed
       * after the video ad is completed.
       * </pre>
       *
       * <code>optional bool rwdd = 18 [default = false];</code>
       * @return Whether the rwdd field is set.
       */
      boolean hasRwdd();
      /**
       * <pre>
       * Indicates whether the user receives a reward for viewing the ad, where 0
       * = no, 1 = yes. Typically video ad implementations allow users to read an
       * additional news article for free, receive an extra life in a game, or get
       * a sponsored ad-free music session. The reward is typically distributed
       * after the video ad is completed.
       * </pre>
       *
       * <code>optional bool rwdd = 18 [default = false];</code>
       * @return The rwdd.
       */
      boolean getRwdd();

      /**
       * <pre>
       * Indicates if server-side ad insertion (e.g., stitching an ad into an
       * audio or video stream) is in use and the impact of this on asset and
       * tracker retrieval, where 0 = status unknown, 1 = all client-side (i.e.,
       * not server-side), 2 = assets stitched server-side but tracking pixels
       * fired client-side, 3 = all server-side.
       * </pre>
       *
       * <code>optional int32 ssai = 19 [default = 0];</code>
       * @return Whether the ssai field is set.
       */
      boolean hasSsai();
      /**
       * <pre>
       * Indicates if server-side ad insertion (e.g., stitching an ad into an
       * audio or video stream) is in use and the impact of this on asset and
       * tracker retrieval, where 0 = status unknown, 1 = all client-side (i.e.,
       * not server-side), 2 = assets stitched server-side but tracking pixels
       * fired client-side, 3 = all server-side.
       * </pre>
       *
       * <code>optional int32 ssai = 19 [default = 0];</code>
       * @return The ssai.
       */
      int getSsai();

      /**
       * <pre>
       * A Pmp object (Section 3.2.17) containing any private marketplace deals
       * in effect for this impression.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp pmp = 11;</code>
       * @return Whether the pmp field is set.
       */
      boolean hasPmp();
      /**
       * <pre>
       * A Pmp object (Section 3.2.17) containing any private marketplace deals
       * in effect for this impression.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp pmp = 11;</code>
       * @return The pmp.
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp getPmp();
      /**
       * <pre>
       * A Pmp object (Section 3.2.17) containing any private marketplace deals
       * in effect for this impression.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp pmp = 11;</code>
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.PmpOrBuilder getPmpOrBuilder();

      /**
       * <pre>
       * A Native object (Section 3.2.5); required if this impression is
       * offered as a native ad opportunity.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Native native = 13;</code>
       * @return Whether the native field is set.
       */
      boolean hasNative();
      /**
       * <pre>
       * A Native object (Section 3.2.5); required if this impression is
       * offered as a native ad opportunity.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Native native = 13;</code>
       * @return The native.
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native getNative();
      /**
       * <pre>
       * A Native object (Section 3.2.5); required if this impression is
       * offered as a native ad opportunity.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Native native = 13;</code>
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.NativeOrBuilder getNativeOrBuilder();

      /**
       * <pre>
       * Advisory as to the number of seconds that may elapse
       * between the auction and the actual impression.
       * </pre>
       *
       * <code>optional int32 exp = 14;</code>
       * @return Whether the exp field is set.
       */
      boolean hasExp();
      /**
       * <pre>
       * Advisory as to the number of seconds that may elapse
       * between the auction and the actual impression.
       * </pre>
       *
       * <code>optional int32 exp = 14;</code>
       * @return The exp.
       */
      int getExp();

      /**
       * <pre>
       * An array of Metric object (Section 3.2.5).
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Metric metric = 17;</code>
       */
      java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric> 
          getMetricList();
      /**
       * <pre>
       * An array of Metric object (Section 3.2.5).
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Metric metric = 17;</code>
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric getMetric(int index);
      /**
       * <pre>
       * An array of Metric object (Section 3.2.5).
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Metric metric = 17;</code>
       */
      int getMetricCount();
      /**
       * <pre>
       * An array of Metric object (Section 3.2.5).
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Metric metric = 17;</code>
       */
      java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.MetricOrBuilder> 
          getMetricOrBuilderList();
      /**
       * <pre>
       * An array of Metric object (Section 3.2.5).
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Metric metric = 17;</code>
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.MetricOrBuilder getMetricOrBuilder(
          int index);

      /**
       * <pre>
       * A means of passing a multiplier in the bid request, representing the
       * total quantity of impressions for adverts that display to more than one
       * person.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Qty qty = 20;</code>
       * @return Whether the qty field is set.
       */
      boolean hasQty();
      /**
       * <pre>
       * A means of passing a multiplier in the bid request, representing the
       * total quantity of impressions for adverts that display to more than one
       * person.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Qty qty = 20;</code>
       * @return The qty.
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty getQty();
      /**
       * <pre>
       * A means of passing a multiplier in the bid request, representing the
       * total quantity of impressions for adverts that display to more than one
       * person.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Qty qty = 20;</code>
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.QtyOrBuilder getQtyOrBuilder();

      /**
       * <pre>
       * Timestamp when the item is estimated to be fulfilled (e.g. when a DOOH
       * impression will be displayed) in Unix format (i.e., milliseconds since
       * the epoch).
       * </pre>
       *
       * <code>optional double dt = 21;</code>
       * @return Whether the dt field is set.
       */
      boolean hasDt();
      /**
       * <pre>
       * Timestamp when the item is estimated to be fulfilled (e.g. when a DOOH
       * impression will be displayed) in Unix format (i.e., milliseconds since
       * the epoch).
       * </pre>
       *
       * <code>optional double dt = 21;</code>
       * @return The dt.
       */
      double getDt();

      /**
       * <pre>
       * Details about ad slots being refreshed automatically.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh refresh = 22;</code>
       * @return Whether the refresh field is set.
       */
      boolean hasRefresh();
      /**
       * <pre>
       * Details about ad slots being refreshed automatically.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh refresh = 22;</code>
       * @return The refresh.
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh getRefresh();
      /**
       * <pre>
       * Details about ad slots being refreshed automatically.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh refresh = 22;</code>
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.RefreshOrBuilder getRefreshOrBuilder();
    }
    /**
     * <pre>
     * OpenRTB 2.0: This object describes an ad placement or impression
     * being auctioned.  A single bid request can include multiple Imp objects,
     * a use case for which might be an exchange that supports selling all
     * ad positions on a given page.  Each Imp object has a required ID so that
     * bids can reference them individually.
     * The presence of Banner (Section 3.2.3), Video (Section 3.2.4),
     * and/or Native (Section 3.2.5) objects subordinate to the Imp object
     * indicates the type of impression being offered. The publisher can choose
     * one such type which is the typical case or mix them at their discretion.
     * Any given bid for the impression must conform to one of the offered types.
     * </pre>
     *
     * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Imp}
     */
    public static final class Imp extends
        com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
          Imp> implements
        // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.BidRequest.Imp)
        ImpOrBuilder {
    private static final long serialVersionUID = 0L;
      // Use Imp.newBuilder() to construct.
      private Imp(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp, ?> builder) {
        super(builder);
      }
      private Imp() {
        id_ = "";
        displaymanager_ = "";
        displaymanagerver_ = "";
        tagid_ = "";
        bidfloorcur_ = "USD";
        iframebuster_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        metric_ = java.util.Collections.emptyList();
      }

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

      @java.lang.Override
      public final com.google.protobuf.UnknownFieldSet
      getUnknownFields() {
        return this.unknownFields;
      }
      private Imp(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        this();
        if (extensionRegistry == null) {
          throw new java.lang.NullPointerException();
        }
        int mutable_bitField0_ = 0;
        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
            com.google.protobuf.UnknownFieldSet.newBuilder();
        try {
          boolean done = false;
          while (!done) {
            int tag = input.readTag();
            switch (tag) {
              case 0:
                done = true;
                break;
              case 10: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000001;
                id_ = bs;
                break;
              }
              case 18: {
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Builder subBuilder = null;
                if (((bitField0_ & 0x00000002) != 0)) {
                  subBuilder = banner_.toBuilder();
                }
                banner_ = input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.PARSER, extensionRegistry);
                if (subBuilder != null) {
                  subBuilder.mergeFrom(banner_);
                  banner_ = subBuilder.buildPartial();
                }
                bitField0_ |= 0x00000002;
                break;
              }
              case 26: {
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.Builder subBuilder = null;
                if (((bitField0_ & 0x00000004) != 0)) {
                  subBuilder = video_.toBuilder();
                }
                video_ = input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.PARSER, extensionRegistry);
                if (subBuilder != null) {
                  subBuilder.mergeFrom(video_);
                  video_ = subBuilder.buildPartial();
                }
                bitField0_ |= 0x00000004;
                break;
              }
              case 34: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000010;
                displaymanager_ = bs;
                break;
              }
              case 42: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000020;
                displaymanagerver_ = bs;
                break;
              }
              case 48: {
                bitField0_ |= 0x00000040;
                instl_ = input.readBool();
                break;
              }
              case 58: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000080;
                tagid_ = bs;
                break;
              }
              case 65: {
                bitField0_ |= 0x00000100;
                bidfloor_ = input.readDouble();
                break;
              }
              case 74: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000200;
                bidfloorcur_ = bs;
                break;
              }
              case 82: {
                com.google.protobuf.ByteString bs = input.readBytes();
                if (!((mutable_bitField0_ & 0x00001000) != 0)) {
                  iframebuster_ = new com.google.protobuf.LazyStringArrayList();
                  mutable_bitField0_ |= 0x00001000;
                }
                iframebuster_.add(bs);
                break;
              }
              case 90: {
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Builder subBuilder = null;
                if (((bitField0_ & 0x00004000) != 0)) {
                  subBuilder = pmp_.toBuilder();
                }
                pmp_ = input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.PARSER, extensionRegistry);
                if (subBuilder != null) {
                  subBuilder.mergeFrom(pmp_);
                  pmp_ = subBuilder.buildPartial();
                }
                bitField0_ |= 0x00004000;
                break;
              }
              case 96: {
                bitField0_ |= 0x00000800;
                secure_ = input.readBool();
                break;
              }
              case 106: {
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native.Builder subBuilder = null;
                if (((bitField0_ & 0x00008000) != 0)) {
                  subBuilder = native_.toBuilder();
                }
                native_ = input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native.PARSER, extensionRegistry);
                if (subBuilder != null) {
                  subBuilder.mergeFrom(native_);
                  native_ = subBuilder.buildPartial();
                }
                bitField0_ |= 0x00008000;
                break;
              }
              case 112: {
                bitField0_ |= 0x00010000;
                exp_ = input.readInt32();
                break;
              }
              case 122: {
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio.Builder subBuilder = null;
                if (((bitField0_ & 0x00000008) != 0)) {
                  subBuilder = audio_.toBuilder();
                }
                audio_ = input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio.PARSER, extensionRegistry);
                if (subBuilder != null) {
                  subBuilder.mergeFrom(audio_);
                  audio_ = subBuilder.buildPartial();
                }
                bitField0_ |= 0x00000008;
                break;
              }
              case 128: {
                bitField0_ |= 0x00000400;
                clickbrowser_ = input.readBool();
                break;
              }
              case 138: {
                if (!((mutable_bitField0_ & 0x00040000) != 0)) {
                  metric_ = new java.util.ArrayList<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric>();
                  mutable_bitField0_ |= 0x00040000;
                }
                metric_.add(
                    input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric.PARSER, extensionRegistry));
                break;
              }
              case 144: {
                bitField0_ |= 0x00001000;
                rwdd_ = input.readBool();
                break;
              }
              case 152: {
                bitField0_ |= 0x00002000;
                ssai_ = input.readInt32();
                break;
              }
              case 162: {
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty.Builder subBuilder = null;
                if (((bitField0_ & 0x00020000) != 0)) {
                  subBuilder = qty_.toBuilder();
                }
                qty_ = input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty.PARSER, extensionRegistry);
                if (subBuilder != null) {
                  subBuilder.mergeFrom(qty_);
                  qty_ = subBuilder.buildPartial();
                }
                bitField0_ |= 0x00020000;
                break;
              }
              case 169: {
                bitField0_ |= 0x00040000;
                dt_ = input.readDouble();
                break;
              }
              case 178: {
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.Builder subBuilder = null;
                if (((bitField0_ & 0x00080000) != 0)) {
                  subBuilder = refresh_.toBuilder();
                }
                refresh_ = input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.PARSER, extensionRegistry);
                if (subBuilder != null) {
                  subBuilder.mergeFrom(refresh_);
                  refresh_ = subBuilder.buildPartial();
                }
                bitField0_ |= 0x00080000;
                break;
              }
              default: {
                if (!parseUnknownField(
                    input, unknownFields, extensionRegistry, tag)) {
                  done = true;
                }
                break;
              }
            }
          }
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          throw e.setUnfinishedMessage(this);
        } catch (java.io.IOException e) {
          throw new com.google.protobuf.InvalidProtocolBufferException(
              e).setUnfinishedMessage(this);
        } finally {
          if (((mutable_bitField0_ & 0x00001000) != 0)) {
            iframebuster_ = iframebuster_.getUnmodifiableView();
          }
          if (((mutable_bitField0_ & 0x00040000) != 0)) {
            metric_ = java.util.Collections.unmodifiableList(metric_);
          }
          this.unknownFields = unknownFields.build();
          makeExtensionsImmutable();
        }
      }
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Builder.class);
      }

      public interface MetricOrBuilder extends
          // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.BidRequest.Imp.Metric)
          com.google.protobuf.GeneratedMessageV3.
              ExtendableMessageOrBuilder<Metric> {

        /**
         * <pre>
         * Type of metric being presented using exchange curated string
         * names which should be published to bidders a priori.
         * REQUIRED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string type = 1;</code>
         * @return Whether the type field is set.
         */
        boolean hasType();
        /**
         * <pre>
         * Type of metric being presented using exchange curated string
         * names which should be published to bidders a priori.
         * REQUIRED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string type = 1;</code>
         * @return The type.
         */
        java.lang.String getType();
        /**
         * <pre>
         * Type of metric being presented using exchange curated string
         * names which should be published to bidders a priori.
         * REQUIRED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string type = 1;</code>
         * @return The bytes for type.
         */
        com.google.protobuf.ByteString
            getTypeBytes();

        /**
         * <pre>
         * Number representing the value of the metric.
         * Probabilities must be in the range 0.0 - 1.0.
         * REQUIRED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional double value = 2;</code>
         * @return Whether the value field is set.
         */
        boolean hasValue();
        /**
         * <pre>
         * Number representing the value of the metric.
         * Probabilities must be in the range 0.0 - 1.0.
         * REQUIRED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional double value = 2;</code>
         * @return The value.
         */
        double getValue();

        /**
         * <pre>
         * Source of the value using exchange curated string names
         * which should be published to bidders a priori.
         * If the exchange itself is the source versus a third party,
         * "EXCHANGE" is recommended.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string vendor = 3;</code>
         * @return Whether the vendor field is set.
         */
        boolean hasVendor();
        /**
         * <pre>
         * Source of the value using exchange curated string names
         * which should be published to bidders a priori.
         * If the exchange itself is the source versus a third party,
         * "EXCHANGE" is recommended.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string vendor = 3;</code>
         * @return The vendor.
         */
        java.lang.String getVendor();
        /**
         * <pre>
         * Source of the value using exchange curated string names
         * which should be published to bidders a priori.
         * If the exchange itself is the source versus a third party,
         * "EXCHANGE" is recommended.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string vendor = 3;</code>
         * @return The bytes for vendor.
         */
        com.google.protobuf.ByteString
            getVendorBytes();
      }
      /**
       * <pre>
       * OpenRTB 2.5: This object is associated with an impression as
       * an array of metrics. These metrics can offer insight into
       * the impression to assist with decisioning such as average recent
       * viewability, click-through rate, etc.  Each metric is identified
       * by its type, reports the value of the metric, and optionally
       * identifies the source or vendor measuring the value.
       * </pre>
       *
       * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Imp.Metric}
       */
      public static final class Metric extends
          com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
            Metric> implements
          // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.BidRequest.Imp.Metric)
          MetricOrBuilder {
      private static final long serialVersionUID = 0L;
        // Use Metric.newBuilder() to construct.
        private Metric(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric, ?> builder) {
          super(builder);
        }
        private Metric() {
          type_ = "";
          vendor_ = "";
        }

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

        @java.lang.Override
        public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
          return this.unknownFields;
        }
        private Metric(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          this();
          if (extensionRegistry == null) {
            throw new java.lang.NullPointerException();
          }
          int mutable_bitField0_ = 0;
          com.google.protobuf.UnknownFieldSet.Builder unknownFields =
              com.google.protobuf.UnknownFieldSet.newBuilder();
          try {
            boolean done = false;
            while (!done) {
              int tag = input.readTag();
              switch (tag) {
                case 0:
                  done = true;
                  break;
                case 10: {
                  com.google.protobuf.ByteString bs = input.readBytes();
                  bitField0_ |= 0x00000001;
                  type_ = bs;
                  break;
                }
                case 17: {
                  bitField0_ |= 0x00000002;
                  value_ = input.readDouble();
                  break;
                }
                case 26: {
                  com.google.protobuf.ByteString bs = input.readBytes();
                  bitField0_ |= 0x00000004;
                  vendor_ = bs;
                  break;
                }
                default: {
                  if (!parseUnknownField(
                      input, unknownFields, extensionRegistry, tag)) {
                    done = true;
                  }
                  break;
                }
              }
            }
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            throw e.setUnfinishedMessage(this);
          } catch (java.io.IOException e) {
            throw new com.google.protobuf.InvalidProtocolBufferException(
                e).setUnfinishedMessage(this);
          } finally {
            this.unknownFields = unknownFields.build();
            makeExtensionsImmutable();
          }
        }
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Metric_descriptor;
        }

        @java.lang.Override
        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Metric_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric.Builder.class);
        }

        private int bitField0_;
        public static final int TYPE_FIELD_NUMBER = 1;
        private volatile java.lang.Object type_;
        /**
         * <pre>
         * Type of metric being presented using exchange curated string
         * names which should be published to bidders a priori.
         * REQUIRED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string type = 1;</code>
         * @return Whether the type field is set.
         */
        @java.lang.Override
        public boolean hasType() {
          return ((bitField0_ & 0x00000001) != 0);
        }
        /**
         * <pre>
         * Type of metric being presented using exchange curated string
         * names which should be published to bidders a priori.
         * REQUIRED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string type = 1;</code>
         * @return The type.
         */
        @java.lang.Override
        public java.lang.String getType() {
          java.lang.Object ref = type_;
          if (ref instanceof java.lang.String) {
            return (java.lang.String) ref;
          } else {
            com.google.protobuf.ByteString bs = 
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              type_ = s;
            }
            return s;
          }
        }
        /**
         * <pre>
         * Type of metric being presented using exchange curated string
         * names which should be published to bidders a priori.
         * REQUIRED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string type = 1;</code>
         * @return The bytes for type.
         */
        @java.lang.Override
        public com.google.protobuf.ByteString
            getTypeBytes() {
          java.lang.Object ref = type_;
          if (ref instanceof java.lang.String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            type_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }

        public static final int VALUE_FIELD_NUMBER = 2;
        private double value_;
        /**
         * <pre>
         * Number representing the value of the metric.
         * Probabilities must be in the range 0.0 - 1.0.
         * REQUIRED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional double value = 2;</code>
         * @return Whether the value field is set.
         */
        @java.lang.Override
        public boolean hasValue() {
          return ((bitField0_ & 0x00000002) != 0);
        }
        /**
         * <pre>
         * Number representing the value of the metric.
         * Probabilities must be in the range 0.0 - 1.0.
         * REQUIRED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional double value = 2;</code>
         * @return The value.
         */
        @java.lang.Override
        public double getValue() {
          return value_;
        }

        public static final int VENDOR_FIELD_NUMBER = 3;
        private volatile java.lang.Object vendor_;
        /**
         * <pre>
         * Source of the value using exchange curated string names
         * which should be published to bidders a priori.
         * If the exchange itself is the source versus a third party,
         * "EXCHANGE" is recommended.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string vendor = 3;</code>
         * @return Whether the vendor field is set.
         */
        @java.lang.Override
        public boolean hasVendor() {
          return ((bitField0_ & 0x00000004) != 0);
        }
        /**
         * <pre>
         * Source of the value using exchange curated string names
         * which should be published to bidders a priori.
         * If the exchange itself is the source versus a third party,
         * "EXCHANGE" is recommended.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string vendor = 3;</code>
         * @return The vendor.
         */
        @java.lang.Override
        public java.lang.String getVendor() {
          java.lang.Object ref = vendor_;
          if (ref instanceof java.lang.String) {
            return (java.lang.String) ref;
          } else {
            com.google.protobuf.ByteString bs = 
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              vendor_ = s;
            }
            return s;
          }
        }
        /**
         * <pre>
         * Source of the value using exchange curated string names
         * which should be published to bidders a priori.
         * If the exchange itself is the source versus a third party,
         * "EXCHANGE" is recommended.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string vendor = 3;</code>
         * @return The bytes for vendor.
         */
        @java.lang.Override
        public com.google.protobuf.ByteString
            getVendorBytes() {
          java.lang.Object ref = vendor_;
          if (ref instanceof java.lang.String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            vendor_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }

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

          if (!extensionsAreInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
          memoizedIsInitialized = 1;
          return true;
        }

        @java.lang.Override
        public void writeTo(com.google.protobuf.CodedOutputStream output)
                            throws java.io.IOException {
          com.google.protobuf.GeneratedMessageV3
            .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric>.ExtensionWriter
              extensionWriter = newExtensionWriter();
          if (((bitField0_ & 0x00000001) != 0)) {
            com.google.protobuf.GeneratedMessageV3.writeString(output, 1, type_);
          }
          if (((bitField0_ & 0x00000002) != 0)) {
            output.writeDouble(2, value_);
          }
          if (((bitField0_ & 0x00000004) != 0)) {
            com.google.protobuf.GeneratedMessageV3.writeString(output, 3, vendor_);
          }
          extensionWriter.writeUntil(10000, output);
          unknownFields.writeTo(output);
        }

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

          size = 0;
          if (((bitField0_ & 0x00000001) != 0)) {
            size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, type_);
          }
          if (((bitField0_ & 0x00000002) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeDoubleSize(2, value_);
          }
          if (((bitField0_ & 0x00000004) != 0)) {
            size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, vendor_);
          }
          size += extensionsSerializedSize();
          size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric)) {
            return super.equals(obj);
          }
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric other = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric) obj;

          if (hasType() != other.hasType()) return false;
          if (hasType()) {
            if (!getType()
                .equals(other.getType())) return false;
          }
          if (hasValue() != other.hasValue()) return false;
          if (hasValue()) {
            if (java.lang.Double.doubleToLongBits(getValue())
                != java.lang.Double.doubleToLongBits(
                    other.getValue())) return false;
          }
          if (hasVendor() != other.hasVendor()) return false;
          if (hasVendor()) {
            if (!getVendor()
                .equals(other.getVendor())) return false;
          }
          if (!unknownFields.equals(other.unknownFields)) return false;
          if (!getExtensionFields().equals(other.getExtensionFields()))
            return false;
          return true;
        }

        @java.lang.Override
        public int hashCode() {
          if (memoizedHashCode != 0) {
            return memoizedHashCode;
          }
          int hash = 41;
          hash = (19 * hash) + getDescriptor().hashCode();
          if (hasType()) {
            hash = (37 * hash) + TYPE_FIELD_NUMBER;
            hash = (53 * hash) + getType().hashCode();
          }
          if (hasValue()) {
            hash = (37 * hash) + VALUE_FIELD_NUMBER;
            hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
                java.lang.Double.doubleToLongBits(getValue()));
          }
          if (hasVendor()) {
            hash = (37 * hash) + VENDOR_FIELD_NUMBER;
            hash = (53 * hash) + getVendor().hashCode();
          }
          hash = hashFields(hash, getExtensionFields());
          hash = (29 * hash) + unknownFields.hashCode();
          memoizedHashCode = hash;
          return hash;
        }

        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric parseFrom(
            java.nio.ByteBuffer data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric parseFrom(
            java.nio.ByteBuffer data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric parseFrom(
            com.google.protobuf.ByteString data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric parseFrom(
            com.google.protobuf.ByteString data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric parseFrom(byte[] data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric parseFrom(
            byte[] data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric parseFrom(java.io.InputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric parseDelimitedFrom(java.io.InputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseDelimitedWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric parseFrom(
            com.google.protobuf.CodedInputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric 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>
         * OpenRTB 2.5: This object is associated with an impression as
         * an array of metrics. These metrics can offer insight into
         * the impression to assist with decisioning such as average recent
         * viewability, click-through rate, etc.  Each metric is identified
         * by its type, reports the value of the metric, and optionally
         * identifies the source or vendor measuring the value.
         * </pre>
         *
         * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Imp.Metric}
         */
        public static final class Builder extends
            com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric, Builder> implements
            // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.BidRequest.Imp.Metric)
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.MetricOrBuilder {
          public static final com.google.protobuf.Descriptors.Descriptor
              getDescriptor() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Metric_descriptor;
          }

          @java.lang.Override
          protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
              internalGetFieldAccessorTable() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Metric_fieldAccessorTable
                .ensureFieldAccessorsInitialized(
                    com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric.Builder.class);
          }

          // Construct using com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric.newBuilder()
          private Builder() {
            maybeForceBuilderInitialization();
          }

          private Builder(
              com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
            super(parent);
            maybeForceBuilderInitialization();
          }
          private void maybeForceBuilderInitialization() {
            if (com.google.protobuf.GeneratedMessageV3
                    .alwaysUseFieldBuilders) {
            }
          }
          @java.lang.Override
          public Builder clear() {
            super.clear();
            type_ = "";
            bitField0_ = (bitField0_ & ~0x00000001);
            value_ = 0D;
            bitField0_ = (bitField0_ & ~0x00000002);
            vendor_ = "";
            bitField0_ = (bitField0_ & ~0x00000004);
            return this;
          }

          @java.lang.Override
          public com.google.protobuf.Descriptors.Descriptor
              getDescriptorForType() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Metric_descriptor;
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric getDefaultInstanceForType() {
            return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric.getDefaultInstance();
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric build() {
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric result = buildPartial();
            if (!result.isInitialized()) {
              throw newUninitializedMessageException(result);
            }
            return result;
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric buildPartial() {
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric result = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric(this);
            int from_bitField0_ = bitField0_;
            int to_bitField0_ = 0;
            if (((from_bitField0_ & 0x00000001) != 0)) {
              to_bitField0_ |= 0x00000001;
            }
            result.type_ = type_;
            if (((from_bitField0_ & 0x00000002) != 0)) {
              result.value_ = value_;
              to_bitField0_ |= 0x00000002;
            }
            if (((from_bitField0_ & 0x00000004) != 0)) {
              to_bitField0_ |= 0x00000004;
            }
            result.vendor_ = vendor_;
            result.bitField0_ = to_bitField0_;
            onBuilt();
            return result;
          }

          @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 <Type> Builder setExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric, Type> extension,
              Type value) {
            return super.setExtension(extension, value);
          }
          @java.lang.Override
          public <Type> Builder setExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric, java.util.List<Type>> extension,
              int index, Type value) {
            return super.setExtension(extension, index, value);
          }
          @java.lang.Override
          public <Type> Builder addExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric, java.util.List<Type>> extension,
              Type value) {
            return super.addExtension(extension, value);
          }
          @java.lang.Override
          public <Type> Builder clearExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric, ?> extension) {
            return super.clearExtension(extension);
          }
          @java.lang.Override
          public Builder mergeFrom(com.google.protobuf.Message other) {
            if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric) {
              return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric)other);
            } else {
              super.mergeFrom(other);
              return this;
            }
          }

          public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric other) {
            if (other == com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric.getDefaultInstance()) return this;
            if (other.hasType()) {
              bitField0_ |= 0x00000001;
              type_ = other.type_;
              onChanged();
            }
            if (other.hasValue()) {
              setValue(other.getValue());
            }
            if (other.hasVendor()) {
              bitField0_ |= 0x00000004;
              vendor_ = other.vendor_;
              onChanged();
            }
            this.mergeExtensionFields(other);
            this.mergeUnknownFields(other.unknownFields);
            onChanged();
            return this;
          }

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

          @java.lang.Override
          public Builder mergeFrom(
              com.google.protobuf.CodedInputStream input,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric parsedMessage = null;
            try {
              parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
              parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric) e.getUnfinishedMessage();
              throw e.unwrapIOException();
            } finally {
              if (parsedMessage != null) {
                mergeFrom(parsedMessage);
              }
            }
            return this;
          }
          private int bitField0_;

          private java.lang.Object type_ = "";
          /**
           * <pre>
           * Type of metric being presented using exchange curated string
           * names which should be published to bidders a priori.
           * REQUIRED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional string type = 1;</code>
           * @return Whether the type field is set.
           */
          public boolean hasType() {
            return ((bitField0_ & 0x00000001) != 0);
          }
          /**
           * <pre>
           * Type of metric being presented using exchange curated string
           * names which should be published to bidders a priori.
           * REQUIRED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional string type = 1;</code>
           * @return The type.
           */
          public java.lang.String getType() {
            java.lang.Object ref = type_;
            if (!(ref instanceof java.lang.String)) {
              com.google.protobuf.ByteString bs =
                  (com.google.protobuf.ByteString) ref;
              java.lang.String s = bs.toStringUtf8();
              if (bs.isValidUtf8()) {
                type_ = s;
              }
              return s;
            } else {
              return (java.lang.String) ref;
            }
          }
          /**
           * <pre>
           * Type of metric being presented using exchange curated string
           * names which should be published to bidders a priori.
           * REQUIRED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional string type = 1;</code>
           * @return The bytes for type.
           */
          public com.google.protobuf.ByteString
              getTypeBytes() {
            java.lang.Object ref = type_;
            if (ref instanceof String) {
              com.google.protobuf.ByteString b = 
                  com.google.protobuf.ByteString.copyFromUtf8(
                      (java.lang.String) ref);
              type_ = b;
              return b;
            } else {
              return (com.google.protobuf.ByteString) ref;
            }
          }
          /**
           * <pre>
           * Type of metric being presented using exchange curated string
           * names which should be published to bidders a priori.
           * REQUIRED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional string type = 1;</code>
           * @param value The type to set.
           * @return This builder for chaining.
           */
          public Builder setType(
              java.lang.String value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
            type_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Type of metric being presented using exchange curated string
           * names which should be published to bidders a priori.
           * REQUIRED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional string type = 1;</code>
           * @return This builder for chaining.
           */
          public Builder clearType() {
            bitField0_ = (bitField0_ & ~0x00000001);
            type_ = getDefaultInstance().getType();
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Type of metric being presented using exchange curated string
           * names which should be published to bidders a priori.
           * REQUIRED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional string type = 1;</code>
           * @param value The bytes for type to set.
           * @return This builder for chaining.
           */
          public Builder setTypeBytes(
              com.google.protobuf.ByteString value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
            type_ = value;
            onChanged();
            return this;
          }

          private double value_ ;
          /**
           * <pre>
           * Number representing the value of the metric.
           * Probabilities must be in the range 0.0 - 1.0.
           * REQUIRED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional double value = 2;</code>
           * @return Whether the value field is set.
           */
          @java.lang.Override
          public boolean hasValue() {
            return ((bitField0_ & 0x00000002) != 0);
          }
          /**
           * <pre>
           * Number representing the value of the metric.
           * Probabilities must be in the range 0.0 - 1.0.
           * REQUIRED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional double value = 2;</code>
           * @return The value.
           */
          @java.lang.Override
          public double getValue() {
            return value_;
          }
          /**
           * <pre>
           * Number representing the value of the metric.
           * Probabilities must be in the range 0.0 - 1.0.
           * REQUIRED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional double value = 2;</code>
           * @param value The value to set.
           * @return This builder for chaining.
           */
          public Builder setValue(double value) {
            bitField0_ |= 0x00000002;
            value_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Number representing the value of the metric.
           * Probabilities must be in the range 0.0 - 1.0.
           * REQUIRED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional double value = 2;</code>
           * @return This builder for chaining.
           */
          public Builder clearValue() {
            bitField0_ = (bitField0_ & ~0x00000002);
            value_ = 0D;
            onChanged();
            return this;
          }

          private java.lang.Object vendor_ = "";
          /**
           * <pre>
           * Source of the value using exchange curated string names
           * which should be published to bidders a priori.
           * If the exchange itself is the source versus a third party,
           * "EXCHANGE" is recommended.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional string vendor = 3;</code>
           * @return Whether the vendor field is set.
           */
          public boolean hasVendor() {
            return ((bitField0_ & 0x00000004) != 0);
          }
          /**
           * <pre>
           * Source of the value using exchange curated string names
           * which should be published to bidders a priori.
           * If the exchange itself is the source versus a third party,
           * "EXCHANGE" is recommended.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional string vendor = 3;</code>
           * @return The vendor.
           */
          public java.lang.String getVendor() {
            java.lang.Object ref = vendor_;
            if (!(ref instanceof java.lang.String)) {
              com.google.protobuf.ByteString bs =
                  (com.google.protobuf.ByteString) ref;
              java.lang.String s = bs.toStringUtf8();
              if (bs.isValidUtf8()) {
                vendor_ = s;
              }
              return s;
            } else {
              return (java.lang.String) ref;
            }
          }
          /**
           * <pre>
           * Source of the value using exchange curated string names
           * which should be published to bidders a priori.
           * If the exchange itself is the source versus a third party,
           * "EXCHANGE" is recommended.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional string vendor = 3;</code>
           * @return The bytes for vendor.
           */
          public com.google.protobuf.ByteString
              getVendorBytes() {
            java.lang.Object ref = vendor_;
            if (ref instanceof String) {
              com.google.protobuf.ByteString b = 
                  com.google.protobuf.ByteString.copyFromUtf8(
                      (java.lang.String) ref);
              vendor_ = b;
              return b;
            } else {
              return (com.google.protobuf.ByteString) ref;
            }
          }
          /**
           * <pre>
           * Source of the value using exchange curated string names
           * which should be published to bidders a priori.
           * If the exchange itself is the source versus a third party,
           * "EXCHANGE" is recommended.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional string vendor = 3;</code>
           * @param value The vendor to set.
           * @return This builder for chaining.
           */
          public Builder setVendor(
              java.lang.String value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
            vendor_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Source of the value using exchange curated string names
           * which should be published to bidders a priori.
           * If the exchange itself is the source versus a third party,
           * "EXCHANGE" is recommended.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional string vendor = 3;</code>
           * @return This builder for chaining.
           */
          public Builder clearVendor() {
            bitField0_ = (bitField0_ & ~0x00000004);
            vendor_ = getDefaultInstance().getVendor();
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Source of the value using exchange curated string names
           * which should be published to bidders a priori.
           * If the exchange itself is the source versus a third party,
           * "EXCHANGE" is recommended.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional string vendor = 3;</code>
           * @param value The bytes for vendor to set.
           * @return This builder for chaining.
           */
          public Builder setVendorBytes(
              com.google.protobuf.ByteString value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
            vendor_ = value;
            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:com.iabtechlab.openrtb.v2.BidRequest.Imp.Metric)
        }

        // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.BidRequest.Imp.Metric)
        private static final com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric DEFAULT_INSTANCE;
        static {
          DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric();
        }

        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric getDefaultInstance() {
          return DEFAULT_INSTANCE;
        }

        @java.lang.Deprecated public static final com.google.protobuf.Parser<Metric>
            PARSER = new com.google.protobuf.AbstractParser<Metric>() {
          @java.lang.Override
          public Metric parsePartialFrom(
              com.google.protobuf.CodedInputStream input,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.protobuf.InvalidProtocolBufferException {
            return new Metric(input, extensionRegistry);
          }
        };

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

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

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric getDefaultInstanceForType() {
          return DEFAULT_INSTANCE;
        }

      }

      public interface BannerOrBuilder extends
          // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner)
          com.google.protobuf.GeneratedMessageV3.
              ExtendableMessageOrBuilder<Banner> {

        /**
         * <pre>
         * Width in device independent pixels (DIPS).
         * If no format objects are specified, this is an exact width
         * requirement. Otherwise it is a preferred width.
         * </pre>
         *
         * <code>optional int32 w = 1;</code>
         * @return Whether the w field is set.
         */
        boolean hasW();
        /**
         * <pre>
         * Width in device independent pixels (DIPS).
         * If no format objects are specified, this is an exact width
         * requirement. Otherwise it is a preferred width.
         * </pre>
         *
         * <code>optional int32 w = 1;</code>
         * @return The w.
         */
        int getW();

        /**
         * <pre>
         * Height in device independent pixels (DIPS).
         * If no format objects are specified, this is an exact height
         * requirement. Otherwise it is a preferred height.
         * </pre>
         *
         * <code>optional int32 h = 2;</code>
         * @return Whether the h field is set.
         */
        boolean hasH();
        /**
         * <pre>
         * Height in device independent pixels (DIPS).
         * If no format objects are specified, this is an exact height
         * requirement. Otherwise it is a preferred height.
         * </pre>
         *
         * <code>optional int32 h = 2;</code>
         * @return The h.
         */
        int getH();

        /**
         * <pre>
         * Array of format objects representing the banner sizes permitted.
         * If none are specified, then use of the h and w attributes
         * is highly recommended.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner.Format format = 15;</code>
         */
        java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format> 
            getFormatList();
        /**
         * <pre>
         * Array of format objects representing the banner sizes permitted.
         * If none are specified, then use of the h and w attributes
         * is highly recommended.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner.Format format = 15;</code>
         */
        com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format getFormat(int index);
        /**
         * <pre>
         * Array of format objects representing the banner sizes permitted.
         * If none are specified, then use of the h and w attributes
         * is highly recommended.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner.Format format = 15;</code>
         */
        int getFormatCount();
        /**
         * <pre>
         * Array of format objects representing the banner sizes permitted.
         * If none are specified, then use of the h and w attributes
         * is highly recommended.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner.Format format = 15;</code>
         */
        java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.FormatOrBuilder> 
            getFormatOrBuilderList();
        /**
         * <pre>
         * Array of format objects representing the banner sizes permitted.
         * If none are specified, then use of the h and w attributes
         * is highly recommended.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner.Format format = 15;</code>
         */
        com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.FormatOrBuilder getFormatOrBuilder(
            int index);

        /**
         * <pre>
         * NOTE: Deprecated in favor of the format array.
         * Maximum width in device independent pixels (DIPS).
         * </pre>
         *
         * <code>optional int32 wmax = 11 [deprecated = true];</code>
         * @return Whether the wmax field is set.
         */
        @java.lang.Deprecated boolean hasWmax();
        /**
         * <pre>
         * NOTE: Deprecated in favor of the format array.
         * Maximum width in device independent pixels (DIPS).
         * </pre>
         *
         * <code>optional int32 wmax = 11 [deprecated = true];</code>
         * @return The wmax.
         */
        @java.lang.Deprecated int getWmax();

        /**
         * <pre>
         * NOTE: Deprecated in favor of the format array.
         * Maximum height in device independent pixels (DIPS).
         * </pre>
         *
         * <code>optional int32 hmax = 12 [deprecated = true];</code>
         * @return Whether the hmax field is set.
         */
        @java.lang.Deprecated boolean hasHmax();
        /**
         * <pre>
         * NOTE: Deprecated in favor of the format array.
         * Maximum height in device independent pixels (DIPS).
         * </pre>
         *
         * <code>optional int32 hmax = 12 [deprecated = true];</code>
         * @return The hmax.
         */
        @java.lang.Deprecated int getHmax();

        /**
         * <pre>
         * NOTE: Deprecated in favor of the format array.
         * Minimum width in device independent pixels (DIPS).
         * </pre>
         *
         * <code>optional int32 wmin = 13 [deprecated = true];</code>
         * @return Whether the wmin field is set.
         */
        @java.lang.Deprecated boolean hasWmin();
        /**
         * <pre>
         * NOTE: Deprecated in favor of the format array.
         * Minimum width in device independent pixels (DIPS).
         * </pre>
         *
         * <code>optional int32 wmin = 13 [deprecated = true];</code>
         * @return The wmin.
         */
        @java.lang.Deprecated int getWmin();

        /**
         * <pre>
         * NOTE: Deprecated in favor of the format array.
         * Minimum height in device independent pixels (DIPS).
         * </pre>
         *
         * <code>optional int32 hmin = 14 [deprecated = true];</code>
         * @return Whether the hmin field is set.
         */
        @java.lang.Deprecated boolean hasHmin();
        /**
         * <pre>
         * NOTE: Deprecated in favor of the format array.
         * Minimum height in device independent pixels (DIPS).
         * </pre>
         *
         * <code>optional int32 hmin = 14 [deprecated = true];</code>
         * @return The hmin.
         */
        @java.lang.Deprecated int getHmin();

        /**
         * <pre>
         * Unique identifier for this banner object. Recommended when Banner
         * objects are used with a Video object (Section 3.2.4) to represent
         * an array of companion ads. Values usually start at 1 and increase
         * with each object; should be unique within an impression.
         * </pre>
         *
         * <code>optional string id = 3;</code>
         * @return Whether the id field is set.
         */
        boolean hasId();
        /**
         * <pre>
         * Unique identifier for this banner object. Recommended when Banner
         * objects are used with a Video object (Section 3.2.4) to represent
         * an array of companion ads. Values usually start at 1 and increase
         * with each object; should be unique within an impression.
         * </pre>
         *
         * <code>optional string id = 3;</code>
         * @return The id.
         */
        java.lang.String getId();
        /**
         * <pre>
         * Unique identifier for this banner object. Recommended when Banner
         * objects are used with a Video object (Section 3.2.4) to represent
         * an array of companion ads. Values usually start at 1 and increase
         * with each object; should be unique within an impression.
         * </pre>
         *
         * <code>optional string id = 3;</code>
         * @return The bytes for id.
         */
        com.google.protobuf.ByteString
            getIdBytes();

        /**
         * <pre>
         * Ad position on screen.
         * Refer to enum Position for generic values.
         * </pre>
         *
         * <code>optional int32 pos = 4;</code>
         * @return Whether the pos field is set.
         */
        boolean hasPos();
        /**
         * <pre>
         * Ad position on screen.
         * Refer to enum Position for generic values.
         * </pre>
         *
         * <code>optional int32 pos = 4;</code>
         * @return The pos.
         */
        int getPos();

        /**
         * <pre>
         * Blocked banner ad types.
         * Refer to enum BannerAdType for generic values.
         * </pre>
         *
         * <code>repeated int32 btype = 5 [packed = true];</code>
         * @return A list containing the btype.
         */
        java.util.List<java.lang.Integer> getBtypeList();
        /**
         * <pre>
         * Blocked banner ad types.
         * Refer to enum BannerAdType for generic values.
         * </pre>
         *
         * <code>repeated int32 btype = 5 [packed = true];</code>
         * @return The count of btype.
         */
        int getBtypeCount();
        /**
         * <pre>
         * Blocked banner ad types.
         * Refer to enum BannerAdType for generic values.
         * </pre>
         *
         * <code>repeated int32 btype = 5 [packed = true];</code>
         * @param index The index of the element to return.
         * @return The btype at the given index.
         */
        int getBtype(int index);

        /**
         * <pre>
         * Blocked creative attributes.
         * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
         * </pre>
         *
         * <code>repeated int32 battr = 6 [packed = true];</code>
         * @return A list containing the battr.
         */
        java.util.List<java.lang.Integer> getBattrList();
        /**
         * <pre>
         * Blocked creative attributes.
         * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
         * </pre>
         *
         * <code>repeated int32 battr = 6 [packed = true];</code>
         * @return The count of battr.
         */
        int getBattrCount();
        /**
         * <pre>
         * Blocked creative attributes.
         * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
         * </pre>
         *
         * <code>repeated int32 battr = 6 [packed = true];</code>
         * @param index The index of the element to return.
         * @return The battr at the given index.
         */
        int getBattr(int index);

        /**
         * <pre>
         * Whitelist of content MIME types supported. Popular MIME types include,
         * but are not limited to "image/jpg", "image/gif" and
         * "application/x-shockwave-flash".
         * </pre>
         *
         * <code>repeated string mimes = 7;</code>
         * @return A list containing the mimes.
         */
        java.util.List<java.lang.String>
            getMimesList();
        /**
         * <pre>
         * Whitelist of content MIME types supported. Popular MIME types include,
         * but are not limited to "image/jpg", "image/gif" and
         * "application/x-shockwave-flash".
         * </pre>
         *
         * <code>repeated string mimes = 7;</code>
         * @return The count of mimes.
         */
        int getMimesCount();
        /**
         * <pre>
         * Whitelist of content MIME types supported. Popular MIME types include,
         * but are not limited to "image/jpg", "image/gif" and
         * "application/x-shockwave-flash".
         * </pre>
         *
         * <code>repeated string mimes = 7;</code>
         * @param index The index of the element to return.
         * @return The mimes at the given index.
         */
        java.lang.String getMimes(int index);
        /**
         * <pre>
         * Whitelist of content MIME types supported. Popular MIME types include,
         * but are not limited to "image/jpg", "image/gif" and
         * "application/x-shockwave-flash".
         * </pre>
         *
         * <code>repeated string mimes = 7;</code>
         * @param index The index of the value to return.
         * @return The bytes of the mimes at the given index.
         */
        com.google.protobuf.ByteString
            getMimesBytes(int index);

        /**
         * <pre>
         * Specify if the banner is delivered in the top frame (true)
         * or in an iframe (false).
         * </pre>
         *
         * <code>optional bool topframe = 8;</code>
         * @return Whether the topframe field is set.
         */
        boolean hasTopframe();
        /**
         * <pre>
         * Specify if the banner is delivered in the top frame (true)
         * or in an iframe (false).
         * </pre>
         *
         * <code>optional bool topframe = 8;</code>
         * @return The topframe.
         */
        boolean getTopframe();

        /**
         * <pre>
         * Directions in which the banner may expand.
         * Refer to enum com.iabtechlab.adcom.v1.enums.ExpandableDirection for generic values.
         * </pre>
         *
         * <code>repeated int32 expdir = 9 [packed = true];</code>
         * @return A list containing the expdir.
         */
        java.util.List<java.lang.Integer> getExpdirList();
        /**
         * <pre>
         * Directions in which the banner may expand.
         * Refer to enum com.iabtechlab.adcom.v1.enums.ExpandableDirection for generic values.
         * </pre>
         *
         * <code>repeated int32 expdir = 9 [packed = true];</code>
         * @return The count of expdir.
         */
        int getExpdirCount();
        /**
         * <pre>
         * Directions in which the banner may expand.
         * Refer to enum com.iabtechlab.adcom.v1.enums.ExpandableDirection for generic values.
         * </pre>
         *
         * <code>repeated int32 expdir = 9 [packed = true];</code>
         * @param index The index of the element to return.
         * @return The expdir at the given index.
         */
        int getExpdir(int index);

        /**
         * <pre>
         * List of supported API frameworks for this impression.
         * If an API is not explicitly listed, it is assumed not to be supported.
         * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
         * </pre>
         *
         * <code>repeated int32 api = 10 [packed = true];</code>
         * @return A list containing the api.
         */
        java.util.List<java.lang.Integer> getApiList();
        /**
         * <pre>
         * List of supported API frameworks for this impression.
         * If an API is not explicitly listed, it is assumed not to be supported.
         * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
         * </pre>
         *
         * <code>repeated int32 api = 10 [packed = true];</code>
         * @return The count of api.
         */
        int getApiCount();
        /**
         * <pre>
         * List of supported API frameworks for this impression.
         * If an API is not explicitly listed, it is assumed not to be supported.
         * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
         * </pre>
         *
         * <code>repeated int32 api = 10 [packed = true];</code>
         * @param index The index of the element to return.
         * @return The api at the given index.
         */
        int getApi(int index);

        /**
         * <pre>
         * Relevant only for Banner objects used with a Video object
         * (Section 3.2.7) in an array of companion ads. Indicates the
         * companion banner rendering mode relative to the associated
         * video, where 0 = concurrent, 1 = end-card.
         * </pre>
         *
         * <code>optional bool vcm = 16;</code>
         * @return Whether the vcm field is set.
         */
        boolean hasVcm();
        /**
         * <pre>
         * Relevant only for Banner objects used with a Video object
         * (Section 3.2.7) in an array of companion ads. Indicates the
         * companion banner rendering mode relative to the associated
         * video, where 0 = concurrent, 1 = end-card.
         * </pre>
         *
         * <code>optional bool vcm = 16;</code>
         * @return The vcm.
         */
        boolean getVcm();
      }
      /**
       * <pre>
       * OpenRTB 2.0: This object represents the most general type of
       * impression.  Although the term "banner" may have very specific meaning
       * in other contexts, here it can be many things including a simple static
       * image, an expandable ad unit, or even in-banner video (refer to the Video
       * object in Section 3.2.4 for the more generalized and full featured video
       * ad units). An array of Banner objects can also appear within the Video
       * to describe optional companion ads defined in the VAST specification.
       * The presence of a Banner as a subordinate of the Imp object indicates
       * that this impression is offered as a banner type impression.
       * At the publisher's discretion, that same impression may also be offered
       * as video and/or native by also including as Imp subordinates the Video
       * and/or Native objects, respectively. However, any given bid for the
       * impression must conform to one of the offered types.
       * </pre>
       *
       * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner}
       */
      public static final class Banner extends
          com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
            Banner> implements
          // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner)
          BannerOrBuilder {
      private static final long serialVersionUID = 0L;
        // Use Banner.newBuilder() to construct.
        private Banner(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner, ?> builder) {
          super(builder);
        }
        private Banner() {
          format_ = java.util.Collections.emptyList();
          id_ = "";
          btype_ = emptyIntList();
          battr_ = emptyIntList();
          mimes_ = com.google.protobuf.LazyStringArrayList.EMPTY;
          expdir_ = emptyIntList();
          api_ = emptyIntList();
        }

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

        @java.lang.Override
        public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
          return this.unknownFields;
        }
        private Banner(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          this();
          if (extensionRegistry == null) {
            throw new java.lang.NullPointerException();
          }
          int mutable_bitField0_ = 0;
          com.google.protobuf.UnknownFieldSet.Builder unknownFields =
              com.google.protobuf.UnknownFieldSet.newBuilder();
          try {
            boolean done = false;
            while (!done) {
              int tag = input.readTag();
              switch (tag) {
                case 0:
                  done = true;
                  break;
                case 8: {
                  bitField0_ |= 0x00000001;
                  w_ = input.readInt32();
                  break;
                }
                case 16: {
                  bitField0_ |= 0x00000002;
                  h_ = input.readInt32();
                  break;
                }
                case 26: {
                  com.google.protobuf.ByteString bs = input.readBytes();
                  bitField0_ |= 0x00000040;
                  id_ = bs;
                  break;
                }
                case 32: {
                  bitField0_ |= 0x00000080;
                  pos_ = input.readInt32();
                  break;
                }
                case 40: {
                  if (!((mutable_bitField0_ & 0x00000200) != 0)) {
                    btype_ = newIntList();
                    mutable_bitField0_ |= 0x00000200;
                  }
                  btype_.addInt(input.readInt32());
                  break;
                }
                case 42: {
                  int length = input.readRawVarint32();
                  int limit = input.pushLimit(length);
                  if (!((mutable_bitField0_ & 0x00000200) != 0) && input.getBytesUntilLimit() > 0) {
                    btype_ = newIntList();
                    mutable_bitField0_ |= 0x00000200;
                  }
                  while (input.getBytesUntilLimit() > 0) {
                    btype_.addInt(input.readInt32());
                  }
                  input.popLimit(limit);
                  break;
                }
                case 48: {
                  if (!((mutable_bitField0_ & 0x00000400) != 0)) {
                    battr_ = newIntList();
                    mutable_bitField0_ |= 0x00000400;
                  }
                  battr_.addInt(input.readInt32());
                  break;
                }
                case 50: {
                  int length = input.readRawVarint32();
                  int limit = input.pushLimit(length);
                  if (!((mutable_bitField0_ & 0x00000400) != 0) && input.getBytesUntilLimit() > 0) {
                    battr_ = newIntList();
                    mutable_bitField0_ |= 0x00000400;
                  }
                  while (input.getBytesUntilLimit() > 0) {
                    battr_.addInt(input.readInt32());
                  }
                  input.popLimit(limit);
                  break;
                }
                case 58: {
                  com.google.protobuf.ByteString bs = input.readBytes();
                  if (!((mutable_bitField0_ & 0x00000800) != 0)) {
                    mimes_ = new com.google.protobuf.LazyStringArrayList();
                    mutable_bitField0_ |= 0x00000800;
                  }
                  mimes_.add(bs);
                  break;
                }
                case 64: {
                  bitField0_ |= 0x00000100;
                  topframe_ = input.readBool();
                  break;
                }
                case 72: {
                  if (!((mutable_bitField0_ & 0x00002000) != 0)) {
                    expdir_ = newIntList();
                    mutable_bitField0_ |= 0x00002000;
                  }
                  expdir_.addInt(input.readInt32());
                  break;
                }
                case 74: {
                  int length = input.readRawVarint32();
                  int limit = input.pushLimit(length);
                  if (!((mutable_bitField0_ & 0x00002000) != 0) && input.getBytesUntilLimit() > 0) {
                    expdir_ = newIntList();
                    mutable_bitField0_ |= 0x00002000;
                  }
                  while (input.getBytesUntilLimit() > 0) {
                    expdir_.addInt(input.readInt32());
                  }
                  input.popLimit(limit);
                  break;
                }
                case 80: {
                  if (!((mutable_bitField0_ & 0x00004000) != 0)) {
                    api_ = newIntList();
                    mutable_bitField0_ |= 0x00004000;
                  }
                  api_.addInt(input.readInt32());
                  break;
                }
                case 82: {
                  int length = input.readRawVarint32();
                  int limit = input.pushLimit(length);
                  if (!((mutable_bitField0_ & 0x00004000) != 0) && input.getBytesUntilLimit() > 0) {
                    api_ = newIntList();
                    mutable_bitField0_ |= 0x00004000;
                  }
                  while (input.getBytesUntilLimit() > 0) {
                    api_.addInt(input.readInt32());
                  }
                  input.popLimit(limit);
                  break;
                }
                case 88: {
                  bitField0_ |= 0x00000004;
                  wmax_ = input.readInt32();
                  break;
                }
                case 96: {
                  bitField0_ |= 0x00000008;
                  hmax_ = input.readInt32();
                  break;
                }
                case 104: {
                  bitField0_ |= 0x00000010;
                  wmin_ = input.readInt32();
                  break;
                }
                case 112: {
                  bitField0_ |= 0x00000020;
                  hmin_ = input.readInt32();
                  break;
                }
                case 122: {
                  if (!((mutable_bitField0_ & 0x00000004) != 0)) {
                    format_ = new java.util.ArrayList<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format>();
                    mutable_bitField0_ |= 0x00000004;
                  }
                  format_.add(
                      input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format.PARSER, extensionRegistry));
                  break;
                }
                case 128: {
                  bitField0_ |= 0x00000200;
                  vcm_ = input.readBool();
                  break;
                }
                default: {
                  if (!parseUnknownField(
                      input, unknownFields, extensionRegistry, tag)) {
                    done = true;
                  }
                  break;
                }
              }
            }
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            throw e.setUnfinishedMessage(this);
          } catch (java.io.IOException e) {
            throw new com.google.protobuf.InvalidProtocolBufferException(
                e).setUnfinishedMessage(this);
          } finally {
            if (((mutable_bitField0_ & 0x00000200) != 0)) {
              btype_.makeImmutable(); // C
            }
            if (((mutable_bitField0_ & 0x00000400) != 0)) {
              battr_.makeImmutable(); // C
            }
            if (((mutable_bitField0_ & 0x00000800) != 0)) {
              mimes_ = mimes_.getUnmodifiableView();
            }
            if (((mutable_bitField0_ & 0x00002000) != 0)) {
              expdir_.makeImmutable(); // C
            }
            if (((mutable_bitField0_ & 0x00004000) != 0)) {
              api_.makeImmutable(); // C
            }
            if (((mutable_bitField0_ & 0x00000004) != 0)) {
              format_ = java.util.Collections.unmodifiableList(format_);
            }
            this.unknownFields = unknownFields.build();
            makeExtensionsImmutable();
          }
        }
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Banner_descriptor;
        }

        @java.lang.Override
        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Banner_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Builder.class);
        }

        public interface FormatOrBuilder extends
            // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner.Format)
            com.google.protobuf.GeneratedMessageV3.
                ExtendableMessageOrBuilder<Format> {

          /**
           * <pre>
           * Width in device independent pixels (DIPS).
           * </pre>
           *
           * <code>optional int32 w = 1;</code>
           * @return Whether the w field is set.
           */
          boolean hasW();
          /**
           * <pre>
           * Width in device independent pixels (DIPS).
           * </pre>
           *
           * <code>optional int32 w = 1;</code>
           * @return The w.
           */
          int getW();

          /**
           * <pre>
           * Height in device independent pixels (DIPS).
           * </pre>
           *
           * <code>optional int32 h = 2;</code>
           * @return Whether the h field is set.
           */
          boolean hasH();
          /**
           * <pre>
           * Height in device independent pixels (DIPS).
           * </pre>
           *
           * <code>optional int32 h = 2;</code>
           * @return The h.
           */
          int getH();

          /**
           * <pre>
           * Relative width when expressing size as a ratio.
           * </pre>
           *
           * <code>optional int32 wratio = 3;</code>
           * @return Whether the wratio field is set.
           */
          boolean hasWratio();
          /**
           * <pre>
           * Relative width when expressing size as a ratio.
           * </pre>
           *
           * <code>optional int32 wratio = 3;</code>
           * @return The wratio.
           */
          int getWratio();

          /**
           * <pre>
           * Relative height when expressing size as a ratio.
           * </pre>
           *
           * <code>optional int32 hratio = 4;</code>
           * @return Whether the hratio field is set.
           */
          boolean hasHratio();
          /**
           * <pre>
           * Relative height when expressing size as a ratio.
           * </pre>
           *
           * <code>optional int32 hratio = 4;</code>
           * @return The hratio.
           */
          int getHratio();

          /**
           * <pre>
           * The minimum width in device independent pixels (DIPS) at
           * which the ad will be displayed when the size is expressed as a ratio.
           * </pre>
           *
           * <code>optional int32 wmin = 5;</code>
           * @return Whether the wmin field is set.
           */
          boolean hasWmin();
          /**
           * <pre>
           * The minimum width in device independent pixels (DIPS) at
           * which the ad will be displayed when the size is expressed as a ratio.
           * </pre>
           *
           * <code>optional int32 wmin = 5;</code>
           * @return The wmin.
           */
          int getWmin();
        }
        /**
         * <pre>
         * OpenRTB 2.4: This object represents an allowed size (i.e.,
         * height and width combination) for a banner impression.
         * These are typically used in an array for an impression where
         * multiple sizes are permitted.
         * </pre>
         *
         * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner.Format}
         */
        public static final class Format extends
            com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
              Format> implements
            // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner.Format)
            FormatOrBuilder {
        private static final long serialVersionUID = 0L;
          // Use Format.newBuilder() to construct.
          private Format(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format, ?> builder) {
            super(builder);
          }
          private Format() {
          }

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

          @java.lang.Override
          public final com.google.protobuf.UnknownFieldSet
          getUnknownFields() {
            return this.unknownFields;
          }
          private Format(
              com.google.protobuf.CodedInputStream input,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.protobuf.InvalidProtocolBufferException {
            this();
            if (extensionRegistry == null) {
              throw new java.lang.NullPointerException();
            }
            int mutable_bitField0_ = 0;
            com.google.protobuf.UnknownFieldSet.Builder unknownFields =
                com.google.protobuf.UnknownFieldSet.newBuilder();
            try {
              boolean done = false;
              while (!done) {
                int tag = input.readTag();
                switch (tag) {
                  case 0:
                    done = true;
                    break;
                  case 8: {
                    bitField0_ |= 0x00000001;
                    w_ = input.readInt32();
                    break;
                  }
                  case 16: {
                    bitField0_ |= 0x00000002;
                    h_ = input.readInt32();
                    break;
                  }
                  case 24: {
                    bitField0_ |= 0x00000004;
                    wratio_ = input.readInt32();
                    break;
                  }
                  case 32: {
                    bitField0_ |= 0x00000008;
                    hratio_ = input.readInt32();
                    break;
                  }
                  case 40: {
                    bitField0_ |= 0x00000010;
                    wmin_ = input.readInt32();
                    break;
                  }
                  default: {
                    if (!parseUnknownField(
                        input, unknownFields, extensionRegistry, tag)) {
                      done = true;
                    }
                    break;
                  }
                }
              }
            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
              throw e.setUnfinishedMessage(this);
            } catch (java.io.IOException e) {
              throw new com.google.protobuf.InvalidProtocolBufferException(
                  e).setUnfinishedMessage(this);
            } finally {
              this.unknownFields = unknownFields.build();
              makeExtensionsImmutable();
            }
          }
          public static final com.google.protobuf.Descriptors.Descriptor
              getDescriptor() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Banner_Format_descriptor;
          }

          @java.lang.Override
          protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
              internalGetFieldAccessorTable() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Banner_Format_fieldAccessorTable
                .ensureFieldAccessorsInitialized(
                    com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format.Builder.class);
          }

          private int bitField0_;
          public static final int W_FIELD_NUMBER = 1;
          private int w_;
          /**
           * <pre>
           * Width in device independent pixels (DIPS).
           * </pre>
           *
           * <code>optional int32 w = 1;</code>
           * @return Whether the w field is set.
           */
          @java.lang.Override
          public boolean hasW() {
            return ((bitField0_ & 0x00000001) != 0);
          }
          /**
           * <pre>
           * Width in device independent pixels (DIPS).
           * </pre>
           *
           * <code>optional int32 w = 1;</code>
           * @return The w.
           */
          @java.lang.Override
          public int getW() {
            return w_;
          }

          public static final int H_FIELD_NUMBER = 2;
          private int h_;
          /**
           * <pre>
           * Height in device independent pixels (DIPS).
           * </pre>
           *
           * <code>optional int32 h = 2;</code>
           * @return Whether the h field is set.
           */
          @java.lang.Override
          public boolean hasH() {
            return ((bitField0_ & 0x00000002) != 0);
          }
          /**
           * <pre>
           * Height in device independent pixels (DIPS).
           * </pre>
           *
           * <code>optional int32 h = 2;</code>
           * @return The h.
           */
          @java.lang.Override
          public int getH() {
            return h_;
          }

          public static final int WRATIO_FIELD_NUMBER = 3;
          private int wratio_;
          /**
           * <pre>
           * Relative width when expressing size as a ratio.
           * </pre>
           *
           * <code>optional int32 wratio = 3;</code>
           * @return Whether the wratio field is set.
           */
          @java.lang.Override
          public boolean hasWratio() {
            return ((bitField0_ & 0x00000004) != 0);
          }
          /**
           * <pre>
           * Relative width when expressing size as a ratio.
           * </pre>
           *
           * <code>optional int32 wratio = 3;</code>
           * @return The wratio.
           */
          @java.lang.Override
          public int getWratio() {
            return wratio_;
          }

          public static final int HRATIO_FIELD_NUMBER = 4;
          private int hratio_;
          /**
           * <pre>
           * Relative height when expressing size as a ratio.
           * </pre>
           *
           * <code>optional int32 hratio = 4;</code>
           * @return Whether the hratio field is set.
           */
          @java.lang.Override
          public boolean hasHratio() {
            return ((bitField0_ & 0x00000008) != 0);
          }
          /**
           * <pre>
           * Relative height when expressing size as a ratio.
           * </pre>
           *
           * <code>optional int32 hratio = 4;</code>
           * @return The hratio.
           */
          @java.lang.Override
          public int getHratio() {
            return hratio_;
          }

          public static final int WMIN_FIELD_NUMBER = 5;
          private int wmin_;
          /**
           * <pre>
           * The minimum width in device independent pixels (DIPS) at
           * which the ad will be displayed when the size is expressed as a ratio.
           * </pre>
           *
           * <code>optional int32 wmin = 5;</code>
           * @return Whether the wmin field is set.
           */
          @java.lang.Override
          public boolean hasWmin() {
            return ((bitField0_ & 0x00000010) != 0);
          }
          /**
           * <pre>
           * The minimum width in device independent pixels (DIPS) at
           * which the ad will be displayed when the size is expressed as a ratio.
           * </pre>
           *
           * <code>optional int32 wmin = 5;</code>
           * @return The wmin.
           */
          @java.lang.Override
          public int getWmin() {
            return wmin_;
          }

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

            if (!extensionsAreInitialized()) {
              memoizedIsInitialized = 0;
              return false;
            }
            memoizedIsInitialized = 1;
            return true;
          }

          @java.lang.Override
          public void writeTo(com.google.protobuf.CodedOutputStream output)
                              throws java.io.IOException {
            com.google.protobuf.GeneratedMessageV3
              .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format>.ExtensionWriter
                extensionWriter = newExtensionWriter();
            if (((bitField0_ & 0x00000001) != 0)) {
              output.writeInt32(1, w_);
            }
            if (((bitField0_ & 0x00000002) != 0)) {
              output.writeInt32(2, h_);
            }
            if (((bitField0_ & 0x00000004) != 0)) {
              output.writeInt32(3, wratio_);
            }
            if (((bitField0_ & 0x00000008) != 0)) {
              output.writeInt32(4, hratio_);
            }
            if (((bitField0_ & 0x00000010) != 0)) {
              output.writeInt32(5, wmin_);
            }
            extensionWriter.writeUntil(10000, output);
            unknownFields.writeTo(output);
          }

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

            size = 0;
            if (((bitField0_ & 0x00000001) != 0)) {
              size += com.google.protobuf.CodedOutputStream
                .computeInt32Size(1, w_);
            }
            if (((bitField0_ & 0x00000002) != 0)) {
              size += com.google.protobuf.CodedOutputStream
                .computeInt32Size(2, h_);
            }
            if (((bitField0_ & 0x00000004) != 0)) {
              size += com.google.protobuf.CodedOutputStream
                .computeInt32Size(3, wratio_);
            }
            if (((bitField0_ & 0x00000008) != 0)) {
              size += com.google.protobuf.CodedOutputStream
                .computeInt32Size(4, hratio_);
            }
            if (((bitField0_ & 0x00000010) != 0)) {
              size += com.google.protobuf.CodedOutputStream
                .computeInt32Size(5, wmin_);
            }
            size += extensionsSerializedSize();
            size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format)) {
              return super.equals(obj);
            }
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format other = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format) obj;

            if (hasW() != other.hasW()) return false;
            if (hasW()) {
              if (getW()
                  != other.getW()) return false;
            }
            if (hasH() != other.hasH()) return false;
            if (hasH()) {
              if (getH()
                  != other.getH()) return false;
            }
            if (hasWratio() != other.hasWratio()) return false;
            if (hasWratio()) {
              if (getWratio()
                  != other.getWratio()) return false;
            }
            if (hasHratio() != other.hasHratio()) return false;
            if (hasHratio()) {
              if (getHratio()
                  != other.getHratio()) return false;
            }
            if (hasWmin() != other.hasWmin()) return false;
            if (hasWmin()) {
              if (getWmin()
                  != other.getWmin()) return false;
            }
            if (!unknownFields.equals(other.unknownFields)) return false;
            if (!getExtensionFields().equals(other.getExtensionFields()))
              return false;
            return true;
          }

          @java.lang.Override
          public int hashCode() {
            if (memoizedHashCode != 0) {
              return memoizedHashCode;
            }
            int hash = 41;
            hash = (19 * hash) + getDescriptor().hashCode();
            if (hasW()) {
              hash = (37 * hash) + W_FIELD_NUMBER;
              hash = (53 * hash) + getW();
            }
            if (hasH()) {
              hash = (37 * hash) + H_FIELD_NUMBER;
              hash = (53 * hash) + getH();
            }
            if (hasWratio()) {
              hash = (37 * hash) + WRATIO_FIELD_NUMBER;
              hash = (53 * hash) + getWratio();
            }
            if (hasHratio()) {
              hash = (37 * hash) + HRATIO_FIELD_NUMBER;
              hash = (53 * hash) + getHratio();
            }
            if (hasWmin()) {
              hash = (37 * hash) + WMIN_FIELD_NUMBER;
              hash = (53 * hash) + getWmin();
            }
            hash = hashFields(hash, getExtensionFields());
            hash = (29 * hash) + unknownFields.hashCode();
            memoizedHashCode = hash;
            return hash;
          }

          public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format parseFrom(
              java.nio.ByteBuffer data)
              throws com.google.protobuf.InvalidProtocolBufferException {
            return PARSER.parseFrom(data);
          }
          public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format parseFrom(
              java.nio.ByteBuffer data,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.protobuf.InvalidProtocolBufferException {
            return PARSER.parseFrom(data, extensionRegistry);
          }
          public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format parseFrom(
              com.google.protobuf.ByteString data)
              throws com.google.protobuf.InvalidProtocolBufferException {
            return PARSER.parseFrom(data);
          }
          public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format parseFrom(
              com.google.protobuf.ByteString data,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.protobuf.InvalidProtocolBufferException {
            return PARSER.parseFrom(data, extensionRegistry);
          }
          public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format parseFrom(byte[] data)
              throws com.google.protobuf.InvalidProtocolBufferException {
            return PARSER.parseFrom(data);
          }
          public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format parseFrom(
              byte[] data,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.protobuf.InvalidProtocolBufferException {
            return PARSER.parseFrom(data, extensionRegistry);
          }
          public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format parseFrom(java.io.InputStream input)
              throws java.io.IOException {
            return com.google.protobuf.GeneratedMessageV3
                .parseWithIOException(PARSER, input);
          }
          public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format parseDelimitedFrom(java.io.InputStream input)
              throws java.io.IOException {
            return com.google.protobuf.GeneratedMessageV3
                .parseDelimitedWithIOException(PARSER, input);
          }
          public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format parseFrom(
              com.google.protobuf.CodedInputStream input)
              throws java.io.IOException {
            return com.google.protobuf.GeneratedMessageV3
                .parseWithIOException(PARSER, input);
          }
          public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format 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>
           * OpenRTB 2.4: This object represents an allowed size (i.e.,
           * height and width combination) for a banner impression.
           * These are typically used in an array for an impression where
           * multiple sizes are permitted.
           * </pre>
           *
           * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner.Format}
           */
          public static final class Builder extends
              com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format, Builder> implements
              // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner.Format)
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.FormatOrBuilder {
            public static final com.google.protobuf.Descriptors.Descriptor
                getDescriptor() {
              return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Banner_Format_descriptor;
            }

            @java.lang.Override
            protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
                internalGetFieldAccessorTable() {
              return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Banner_Format_fieldAccessorTable
                  .ensureFieldAccessorsInitialized(
                      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format.Builder.class);
            }

            // Construct using com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format.newBuilder()
            private Builder() {
              maybeForceBuilderInitialization();
            }

            private Builder(
                com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
              super(parent);
              maybeForceBuilderInitialization();
            }
            private void maybeForceBuilderInitialization() {
              if (com.google.protobuf.GeneratedMessageV3
                      .alwaysUseFieldBuilders) {
              }
            }
            @java.lang.Override
            public Builder clear() {
              super.clear();
              w_ = 0;
              bitField0_ = (bitField0_ & ~0x00000001);
              h_ = 0;
              bitField0_ = (bitField0_ & ~0x00000002);
              wratio_ = 0;
              bitField0_ = (bitField0_ & ~0x00000004);
              hratio_ = 0;
              bitField0_ = (bitField0_ & ~0x00000008);
              wmin_ = 0;
              bitField0_ = (bitField0_ & ~0x00000010);
              return this;
            }

            @java.lang.Override
            public com.google.protobuf.Descriptors.Descriptor
                getDescriptorForType() {
              return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Banner_Format_descriptor;
            }

            @java.lang.Override
            public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format getDefaultInstanceForType() {
              return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format.getDefaultInstance();
            }

            @java.lang.Override
            public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format build() {
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format result = buildPartial();
              if (!result.isInitialized()) {
                throw newUninitializedMessageException(result);
              }
              return result;
            }

            @java.lang.Override
            public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format buildPartial() {
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format result = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format(this);
              int from_bitField0_ = bitField0_;
              int to_bitField0_ = 0;
              if (((from_bitField0_ & 0x00000001) != 0)) {
                result.w_ = w_;
                to_bitField0_ |= 0x00000001;
              }
              if (((from_bitField0_ & 0x00000002) != 0)) {
                result.h_ = h_;
                to_bitField0_ |= 0x00000002;
              }
              if (((from_bitField0_ & 0x00000004) != 0)) {
                result.wratio_ = wratio_;
                to_bitField0_ |= 0x00000004;
              }
              if (((from_bitField0_ & 0x00000008) != 0)) {
                result.hratio_ = hratio_;
                to_bitField0_ |= 0x00000008;
              }
              if (((from_bitField0_ & 0x00000010) != 0)) {
                result.wmin_ = wmin_;
                to_bitField0_ |= 0x00000010;
              }
              result.bitField0_ = to_bitField0_;
              onBuilt();
              return result;
            }

            @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 <Type> Builder setExtension(
                com.google.protobuf.GeneratedMessage.GeneratedExtension<
                    com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format, Type> extension,
                Type value) {
              return super.setExtension(extension, value);
            }
            @java.lang.Override
            public <Type> Builder setExtension(
                com.google.protobuf.GeneratedMessage.GeneratedExtension<
                    com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format, java.util.List<Type>> extension,
                int index, Type value) {
              return super.setExtension(extension, index, value);
            }
            @java.lang.Override
            public <Type> Builder addExtension(
                com.google.protobuf.GeneratedMessage.GeneratedExtension<
                    com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format, java.util.List<Type>> extension,
                Type value) {
              return super.addExtension(extension, value);
            }
            @java.lang.Override
            public <Type> Builder clearExtension(
                com.google.protobuf.GeneratedMessage.GeneratedExtension<
                    com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format, ?> extension) {
              return super.clearExtension(extension);
            }
            @java.lang.Override
            public Builder mergeFrom(com.google.protobuf.Message other) {
              if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format) {
                return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format)other);
              } else {
                super.mergeFrom(other);
                return this;
              }
            }

            public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format other) {
              if (other == com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format.getDefaultInstance()) return this;
              if (other.hasW()) {
                setW(other.getW());
              }
              if (other.hasH()) {
                setH(other.getH());
              }
              if (other.hasWratio()) {
                setWratio(other.getWratio());
              }
              if (other.hasHratio()) {
                setHratio(other.getHratio());
              }
              if (other.hasWmin()) {
                setWmin(other.getWmin());
              }
              this.mergeExtensionFields(other);
              this.mergeUnknownFields(other.unknownFields);
              onChanged();
              return this;
            }

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

            @java.lang.Override
            public Builder mergeFrom(
                com.google.protobuf.CodedInputStream input,
                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
                throws java.io.IOException {
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format parsedMessage = null;
              try {
                parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
              } catch (com.google.protobuf.InvalidProtocolBufferException e) {
                parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format) e.getUnfinishedMessage();
                throw e.unwrapIOException();
              } finally {
                if (parsedMessage != null) {
                  mergeFrom(parsedMessage);
                }
              }
              return this;
            }
            private int bitField0_;

            private int w_ ;
            /**
             * <pre>
             * Width in device independent pixels (DIPS).
             * </pre>
             *
             * <code>optional int32 w = 1;</code>
             * @return Whether the w field is set.
             */
            @java.lang.Override
            public boolean hasW() {
              return ((bitField0_ & 0x00000001) != 0);
            }
            /**
             * <pre>
             * Width in device independent pixels (DIPS).
             * </pre>
             *
             * <code>optional int32 w = 1;</code>
             * @return The w.
             */
            @java.lang.Override
            public int getW() {
              return w_;
            }
            /**
             * <pre>
             * Width in device independent pixels (DIPS).
             * </pre>
             *
             * <code>optional int32 w = 1;</code>
             * @param value The w to set.
             * @return This builder for chaining.
             */
            public Builder setW(int value) {
              bitField0_ |= 0x00000001;
              w_ = value;
              onChanged();
              return this;
            }
            /**
             * <pre>
             * Width in device independent pixels (DIPS).
             * </pre>
             *
             * <code>optional int32 w = 1;</code>
             * @return This builder for chaining.
             */
            public Builder clearW() {
              bitField0_ = (bitField0_ & ~0x00000001);
              w_ = 0;
              onChanged();
              return this;
            }

            private int h_ ;
            /**
             * <pre>
             * Height in device independent pixels (DIPS).
             * </pre>
             *
             * <code>optional int32 h = 2;</code>
             * @return Whether the h field is set.
             */
            @java.lang.Override
            public boolean hasH() {
              return ((bitField0_ & 0x00000002) != 0);
            }
            /**
             * <pre>
             * Height in device independent pixels (DIPS).
             * </pre>
             *
             * <code>optional int32 h = 2;</code>
             * @return The h.
             */
            @java.lang.Override
            public int getH() {
              return h_;
            }
            /**
             * <pre>
             * Height in device independent pixels (DIPS).
             * </pre>
             *
             * <code>optional int32 h = 2;</code>
             * @param value The h to set.
             * @return This builder for chaining.
             */
            public Builder setH(int value) {
              bitField0_ |= 0x00000002;
              h_ = value;
              onChanged();
              return this;
            }
            /**
             * <pre>
             * Height in device independent pixels (DIPS).
             * </pre>
             *
             * <code>optional int32 h = 2;</code>
             * @return This builder for chaining.
             */
            public Builder clearH() {
              bitField0_ = (bitField0_ & ~0x00000002);
              h_ = 0;
              onChanged();
              return this;
            }

            private int wratio_ ;
            /**
             * <pre>
             * Relative width when expressing size as a ratio.
             * </pre>
             *
             * <code>optional int32 wratio = 3;</code>
             * @return Whether the wratio field is set.
             */
            @java.lang.Override
            public boolean hasWratio() {
              return ((bitField0_ & 0x00000004) != 0);
            }
            /**
             * <pre>
             * Relative width when expressing size as a ratio.
             * </pre>
             *
             * <code>optional int32 wratio = 3;</code>
             * @return The wratio.
             */
            @java.lang.Override
            public int getWratio() {
              return wratio_;
            }
            /**
             * <pre>
             * Relative width when expressing size as a ratio.
             * </pre>
             *
             * <code>optional int32 wratio = 3;</code>
             * @param value The wratio to set.
             * @return This builder for chaining.
             */
            public Builder setWratio(int value) {
              bitField0_ |= 0x00000004;
              wratio_ = value;
              onChanged();
              return this;
            }
            /**
             * <pre>
             * Relative width when expressing size as a ratio.
             * </pre>
             *
             * <code>optional int32 wratio = 3;</code>
             * @return This builder for chaining.
             */
            public Builder clearWratio() {
              bitField0_ = (bitField0_ & ~0x00000004);
              wratio_ = 0;
              onChanged();
              return this;
            }

            private int hratio_ ;
            /**
             * <pre>
             * Relative height when expressing size as a ratio.
             * </pre>
             *
             * <code>optional int32 hratio = 4;</code>
             * @return Whether the hratio field is set.
             */
            @java.lang.Override
            public boolean hasHratio() {
              return ((bitField0_ & 0x00000008) != 0);
            }
            /**
             * <pre>
             * Relative height when expressing size as a ratio.
             * </pre>
             *
             * <code>optional int32 hratio = 4;</code>
             * @return The hratio.
             */
            @java.lang.Override
            public int getHratio() {
              return hratio_;
            }
            /**
             * <pre>
             * Relative height when expressing size as a ratio.
             * </pre>
             *
             * <code>optional int32 hratio = 4;</code>
             * @param value The hratio to set.
             * @return This builder for chaining.
             */
            public Builder setHratio(int value) {
              bitField0_ |= 0x00000008;
              hratio_ = value;
              onChanged();
              return this;
            }
            /**
             * <pre>
             * Relative height when expressing size as a ratio.
             * </pre>
             *
             * <code>optional int32 hratio = 4;</code>
             * @return This builder for chaining.
             */
            public Builder clearHratio() {
              bitField0_ = (bitField0_ & ~0x00000008);
              hratio_ = 0;
              onChanged();
              return this;
            }

            private int wmin_ ;
            /**
             * <pre>
             * The minimum width in device independent pixels (DIPS) at
             * which the ad will be displayed when the size is expressed as a ratio.
             * </pre>
             *
             * <code>optional int32 wmin = 5;</code>
             * @return Whether the wmin field is set.
             */
            @java.lang.Override
            public boolean hasWmin() {
              return ((bitField0_ & 0x00000010) != 0);
            }
            /**
             * <pre>
             * The minimum width in device independent pixels (DIPS) at
             * which the ad will be displayed when the size is expressed as a ratio.
             * </pre>
             *
             * <code>optional int32 wmin = 5;</code>
             * @return The wmin.
             */
            @java.lang.Override
            public int getWmin() {
              return wmin_;
            }
            /**
             * <pre>
             * The minimum width in device independent pixels (DIPS) at
             * which the ad will be displayed when the size is expressed as a ratio.
             * </pre>
             *
             * <code>optional int32 wmin = 5;</code>
             * @param value The wmin to set.
             * @return This builder for chaining.
             */
            public Builder setWmin(int value) {
              bitField0_ |= 0x00000010;
              wmin_ = value;
              onChanged();
              return this;
            }
            /**
             * <pre>
             * The minimum width in device independent pixels (DIPS) at
             * which the ad will be displayed when the size is expressed as a ratio.
             * </pre>
             *
             * <code>optional int32 wmin = 5;</code>
             * @return This builder for chaining.
             */
            public Builder clearWmin() {
              bitField0_ = (bitField0_ & ~0x00000010);
              wmin_ = 0;
              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:com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner.Format)
          }

          // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner.Format)
          private static final com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format DEFAULT_INSTANCE;
          static {
            DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format();
          }

          public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format getDefaultInstance() {
            return DEFAULT_INSTANCE;
          }

          @java.lang.Deprecated public static final com.google.protobuf.Parser<Format>
              PARSER = new com.google.protobuf.AbstractParser<Format>() {
            @java.lang.Override
            public Format parsePartialFrom(
                com.google.protobuf.CodedInputStream input,
                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
                throws com.google.protobuf.InvalidProtocolBufferException {
              return new Format(input, extensionRegistry);
            }
          };

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

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

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format getDefaultInstanceForType() {
            return DEFAULT_INSTANCE;
          }

        }

        private int bitField0_;
        public static final int W_FIELD_NUMBER = 1;
        private int w_;
        /**
         * <pre>
         * Width in device independent pixels (DIPS).
         * If no format objects are specified, this is an exact width
         * requirement. Otherwise it is a preferred width.
         * </pre>
         *
         * <code>optional int32 w = 1;</code>
         * @return Whether the w field is set.
         */
        @java.lang.Override
        public boolean hasW() {
          return ((bitField0_ & 0x00000001) != 0);
        }
        /**
         * <pre>
         * Width in device independent pixels (DIPS).
         * If no format objects are specified, this is an exact width
         * requirement. Otherwise it is a preferred width.
         * </pre>
         *
         * <code>optional int32 w = 1;</code>
         * @return The w.
         */
        @java.lang.Override
        public int getW() {
          return w_;
        }

        public static final int H_FIELD_NUMBER = 2;
        private int h_;
        /**
         * <pre>
         * Height in device independent pixels (DIPS).
         * If no format objects are specified, this is an exact height
         * requirement. Otherwise it is a preferred height.
         * </pre>
         *
         * <code>optional int32 h = 2;</code>
         * @return Whether the h field is set.
         */
        @java.lang.Override
        public boolean hasH() {
          return ((bitField0_ & 0x00000002) != 0);
        }
        /**
         * <pre>
         * Height in device independent pixels (DIPS).
         * If no format objects are specified, this is an exact height
         * requirement. Otherwise it is a preferred height.
         * </pre>
         *
         * <code>optional int32 h = 2;</code>
         * @return The h.
         */
        @java.lang.Override
        public int getH() {
          return h_;
        }

        public static final int FORMAT_FIELD_NUMBER = 15;
        private java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format> format_;
        /**
         * <pre>
         * Array of format objects representing the banner sizes permitted.
         * If none are specified, then use of the h and w attributes
         * is highly recommended.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner.Format format = 15;</code>
         */
        @java.lang.Override
        public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format> getFormatList() {
          return format_;
        }
        /**
         * <pre>
         * Array of format objects representing the banner sizes permitted.
         * If none are specified, then use of the h and w attributes
         * is highly recommended.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner.Format format = 15;</code>
         */
        @java.lang.Override
        public java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.FormatOrBuilder> 
            getFormatOrBuilderList() {
          return format_;
        }
        /**
         * <pre>
         * Array of format objects representing the banner sizes permitted.
         * If none are specified, then use of the h and w attributes
         * is highly recommended.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner.Format format = 15;</code>
         */
        @java.lang.Override
        public int getFormatCount() {
          return format_.size();
        }
        /**
         * <pre>
         * Array of format objects representing the banner sizes permitted.
         * If none are specified, then use of the h and w attributes
         * is highly recommended.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner.Format format = 15;</code>
         */
        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format getFormat(int index) {
          return format_.get(index);
        }
        /**
         * <pre>
         * Array of format objects representing the banner sizes permitted.
         * If none are specified, then use of the h and w attributes
         * is highly recommended.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner.Format format = 15;</code>
         */
        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.FormatOrBuilder getFormatOrBuilder(
            int index) {
          return format_.get(index);
        }

        public static final int WMAX_FIELD_NUMBER = 11;
        private int wmax_;
        /**
         * <pre>
         * NOTE: Deprecated in favor of the format array.
         * Maximum width in device independent pixels (DIPS).
         * </pre>
         *
         * <code>optional int32 wmax = 11 [deprecated = true];</code>
         * @return Whether the wmax field is set.
         */
        @java.lang.Override
        @java.lang.Deprecated public boolean hasWmax() {
          return ((bitField0_ & 0x00000004) != 0);
        }
        /**
         * <pre>
         * NOTE: Deprecated in favor of the format array.
         * Maximum width in device independent pixels (DIPS).
         * </pre>
         *
         * <code>optional int32 wmax = 11 [deprecated = true];</code>
         * @return The wmax.
         */
        @java.lang.Override
        @java.lang.Deprecated public int getWmax() {
          return wmax_;
        }

        public static final int HMAX_FIELD_NUMBER = 12;
        private int hmax_;
        /**
         * <pre>
         * NOTE: Deprecated in favor of the format array.
         * Maximum height in device independent pixels (DIPS).
         * </pre>
         *
         * <code>optional int32 hmax = 12 [deprecated = true];</code>
         * @return Whether the hmax field is set.
         */
        @java.lang.Override
        @java.lang.Deprecated public boolean hasHmax() {
          return ((bitField0_ & 0x00000008) != 0);
        }
        /**
         * <pre>
         * NOTE: Deprecated in favor of the format array.
         * Maximum height in device independent pixels (DIPS).
         * </pre>
         *
         * <code>optional int32 hmax = 12 [deprecated = true];</code>
         * @return The hmax.
         */
        @java.lang.Override
        @java.lang.Deprecated public int getHmax() {
          return hmax_;
        }

        public static final int WMIN_FIELD_NUMBER = 13;
        private int wmin_;
        /**
         * <pre>
         * NOTE: Deprecated in favor of the format array.
         * Minimum width in device independent pixels (DIPS).
         * </pre>
         *
         * <code>optional int32 wmin = 13 [deprecated = true];</code>
         * @return Whether the wmin field is set.
         */
        @java.lang.Override
        @java.lang.Deprecated public boolean hasWmin() {
          return ((bitField0_ & 0x00000010) != 0);
        }
        /**
         * <pre>
         * NOTE: Deprecated in favor of the format array.
         * Minimum width in device independent pixels (DIPS).
         * </pre>
         *
         * <code>optional int32 wmin = 13 [deprecated = true];</code>
         * @return The wmin.
         */
        @java.lang.Override
        @java.lang.Deprecated public int getWmin() {
          return wmin_;
        }

        public static final int HMIN_FIELD_NUMBER = 14;
        private int hmin_;
        /**
         * <pre>
         * NOTE: Deprecated in favor of the format array.
         * Minimum height in device independent pixels (DIPS).
         * </pre>
         *
         * <code>optional int32 hmin = 14 [deprecated = true];</code>
         * @return Whether the hmin field is set.
         */
        @java.lang.Override
        @java.lang.Deprecated public boolean hasHmin() {
          return ((bitField0_ & 0x00000020) != 0);
        }
        /**
         * <pre>
         * NOTE: Deprecated in favor of the format array.
         * Minimum height in device independent pixels (DIPS).
         * </pre>
         *
         * <code>optional int32 hmin = 14 [deprecated = true];</code>
         * @return The hmin.
         */
        @java.lang.Override
        @java.lang.Deprecated public int getHmin() {
          return hmin_;
        }

        public static final int ID_FIELD_NUMBER = 3;
        private volatile java.lang.Object id_;
        /**
         * <pre>
         * Unique identifier for this banner object. Recommended when Banner
         * objects are used with a Video object (Section 3.2.4) to represent
         * an array of companion ads. Values usually start at 1 and increase
         * with each object; should be unique within an impression.
         * </pre>
         *
         * <code>optional string id = 3;</code>
         * @return Whether the id field is set.
         */
        @java.lang.Override
        public boolean hasId() {
          return ((bitField0_ & 0x00000040) != 0);
        }
        /**
         * <pre>
         * Unique identifier for this banner object. Recommended when Banner
         * objects are used with a Video object (Section 3.2.4) to represent
         * an array of companion ads. Values usually start at 1 and increase
         * with each object; should be unique within an impression.
         * </pre>
         *
         * <code>optional string id = 3;</code>
         * @return The id.
         */
        @java.lang.Override
        public java.lang.String getId() {
          java.lang.Object ref = id_;
          if (ref instanceof java.lang.String) {
            return (java.lang.String) ref;
          } else {
            com.google.protobuf.ByteString bs = 
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              id_ = s;
            }
            return s;
          }
        }
        /**
         * <pre>
         * Unique identifier for this banner object. Recommended when Banner
         * objects are used with a Video object (Section 3.2.4) to represent
         * an array of companion ads. Values usually start at 1 and increase
         * with each object; should be unique within an impression.
         * </pre>
         *
         * <code>optional string id = 3;</code>
         * @return The bytes for id.
         */
        @java.lang.Override
        public com.google.protobuf.ByteString
            getIdBytes() {
          java.lang.Object ref = id_;
          if (ref instanceof java.lang.String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            id_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }

        public static final int POS_FIELD_NUMBER = 4;
        private int pos_;
        /**
         * <pre>
         * Ad position on screen.
         * Refer to enum Position for generic values.
         * </pre>
         *
         * <code>optional int32 pos = 4;</code>
         * @return Whether the pos field is set.
         */
        @java.lang.Override
        public boolean hasPos() {
          return ((bitField0_ & 0x00000080) != 0);
        }
        /**
         * <pre>
         * Ad position on screen.
         * Refer to enum Position for generic values.
         * </pre>
         *
         * <code>optional int32 pos = 4;</code>
         * @return The pos.
         */
        @java.lang.Override
        public int getPos() {
          return pos_;
        }

        public static final int BTYPE_FIELD_NUMBER = 5;
        private com.google.protobuf.Internal.IntList btype_;
        /**
         * <pre>
         * Blocked banner ad types.
         * Refer to enum BannerAdType for generic values.
         * </pre>
         *
         * <code>repeated int32 btype = 5 [packed = true];</code>
         * @return A list containing the btype.
         */
        @java.lang.Override
        public java.util.List<java.lang.Integer>
            getBtypeList() {
          return btype_;
        }
        /**
         * <pre>
         * Blocked banner ad types.
         * Refer to enum BannerAdType for generic values.
         * </pre>
         *
         * <code>repeated int32 btype = 5 [packed = true];</code>
         * @return The count of btype.
         */
        public int getBtypeCount() {
          return btype_.size();
        }
        /**
         * <pre>
         * Blocked banner ad types.
         * Refer to enum BannerAdType for generic values.
         * </pre>
         *
         * <code>repeated int32 btype = 5 [packed = true];</code>
         * @param index The index of the element to return.
         * @return The btype at the given index.
         */
        public int getBtype(int index) {
          return btype_.getInt(index);
        }
        private int btypeMemoizedSerializedSize = -1;

        public static final int BATTR_FIELD_NUMBER = 6;
        private com.google.protobuf.Internal.IntList battr_;
        /**
         * <pre>
         * Blocked creative attributes.
         * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
         * </pre>
         *
         * <code>repeated int32 battr = 6 [packed = true];</code>
         * @return A list containing the battr.
         */
        @java.lang.Override
        public java.util.List<java.lang.Integer>
            getBattrList() {
          return battr_;
        }
        /**
         * <pre>
         * Blocked creative attributes.
         * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
         * </pre>
         *
         * <code>repeated int32 battr = 6 [packed = true];</code>
         * @return The count of battr.
         */
        public int getBattrCount() {
          return battr_.size();
        }
        /**
         * <pre>
         * Blocked creative attributes.
         * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
         * </pre>
         *
         * <code>repeated int32 battr = 6 [packed = true];</code>
         * @param index The index of the element to return.
         * @return The battr at the given index.
         */
        public int getBattr(int index) {
          return battr_.getInt(index);
        }
        private int battrMemoizedSerializedSize = -1;

        public static final int MIMES_FIELD_NUMBER = 7;
        private com.google.protobuf.LazyStringList mimes_;
        /**
         * <pre>
         * Whitelist of content MIME types supported. Popular MIME types include,
         * but are not limited to "image/jpg", "image/gif" and
         * "application/x-shockwave-flash".
         * </pre>
         *
         * <code>repeated string mimes = 7;</code>
         * @return A list containing the mimes.
         */
        public com.google.protobuf.ProtocolStringList
            getMimesList() {
          return mimes_;
        }
        /**
         * <pre>
         * Whitelist of content MIME types supported. Popular MIME types include,
         * but are not limited to "image/jpg", "image/gif" and
         * "application/x-shockwave-flash".
         * </pre>
         *
         * <code>repeated string mimes = 7;</code>
         * @return The count of mimes.
         */
        public int getMimesCount() {
          return mimes_.size();
        }
        /**
         * <pre>
         * Whitelist of content MIME types supported. Popular MIME types include,
         * but are not limited to "image/jpg", "image/gif" and
         * "application/x-shockwave-flash".
         * </pre>
         *
         * <code>repeated string mimes = 7;</code>
         * @param index The index of the element to return.
         * @return The mimes at the given index.
         */
        public java.lang.String getMimes(int index) {
          return mimes_.get(index);
        }
        /**
         * <pre>
         * Whitelist of content MIME types supported. Popular MIME types include,
         * but are not limited to "image/jpg", "image/gif" and
         * "application/x-shockwave-flash".
         * </pre>
         *
         * <code>repeated string mimes = 7;</code>
         * @param index The index of the value to return.
         * @return The bytes of the mimes at the given index.
         */
        public com.google.protobuf.ByteString
            getMimesBytes(int index) {
          return mimes_.getByteString(index);
        }

        public static final int TOPFRAME_FIELD_NUMBER = 8;
        private boolean topframe_;
        /**
         * <pre>
         * Specify if the banner is delivered in the top frame (true)
         * or in an iframe (false).
         * </pre>
         *
         * <code>optional bool topframe = 8;</code>
         * @return Whether the topframe field is set.
         */
        @java.lang.Override
        public boolean hasTopframe() {
          return ((bitField0_ & 0x00000100) != 0);
        }
        /**
         * <pre>
         * Specify if the banner is delivered in the top frame (true)
         * or in an iframe (false).
         * </pre>
         *
         * <code>optional bool topframe = 8;</code>
         * @return The topframe.
         */
        @java.lang.Override
        public boolean getTopframe() {
          return topframe_;
        }

        public static final int EXPDIR_FIELD_NUMBER = 9;
        private com.google.protobuf.Internal.IntList expdir_;
        /**
         * <pre>
         * Directions in which the banner may expand.
         * Refer to enum com.iabtechlab.adcom.v1.enums.ExpandableDirection for generic values.
         * </pre>
         *
         * <code>repeated int32 expdir = 9 [packed = true];</code>
         * @return A list containing the expdir.
         */
        @java.lang.Override
        public java.util.List<java.lang.Integer>
            getExpdirList() {
          return expdir_;
        }
        /**
         * <pre>
         * Directions in which the banner may expand.
         * Refer to enum com.iabtechlab.adcom.v1.enums.ExpandableDirection for generic values.
         * </pre>
         *
         * <code>repeated int32 expdir = 9 [packed = true];</code>
         * @return The count of expdir.
         */
        public int getExpdirCount() {
          return expdir_.size();
        }
        /**
         * <pre>
         * Directions in which the banner may expand.
         * Refer to enum com.iabtechlab.adcom.v1.enums.ExpandableDirection for generic values.
         * </pre>
         *
         * <code>repeated int32 expdir = 9 [packed = true];</code>
         * @param index The index of the element to return.
         * @return The expdir at the given index.
         */
        public int getExpdir(int index) {
          return expdir_.getInt(index);
        }
        private int expdirMemoizedSerializedSize = -1;

        public static final int API_FIELD_NUMBER = 10;
        private com.google.protobuf.Internal.IntList api_;
        /**
         * <pre>
         * List of supported API frameworks for this impression.
         * If an API is not explicitly listed, it is assumed not to be supported.
         * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
         * </pre>
         *
         * <code>repeated int32 api = 10 [packed = true];</code>
         * @return A list containing the api.
         */
        @java.lang.Override
        public java.util.List<java.lang.Integer>
            getApiList() {
          return api_;
        }
        /**
         * <pre>
         * List of supported API frameworks for this impression.
         * If an API is not explicitly listed, it is assumed not to be supported.
         * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
         * </pre>
         *
         * <code>repeated int32 api = 10 [packed = true];</code>
         * @return The count of api.
         */
        public int getApiCount() {
          return api_.size();
        }
        /**
         * <pre>
         * List of supported API frameworks for this impression.
         * If an API is not explicitly listed, it is assumed not to be supported.
         * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
         * </pre>
         *
         * <code>repeated int32 api = 10 [packed = true];</code>
         * @param index The index of the element to return.
         * @return The api at the given index.
         */
        public int getApi(int index) {
          return api_.getInt(index);
        }
        private int apiMemoizedSerializedSize = -1;

        public static final int VCM_FIELD_NUMBER = 16;
        private boolean vcm_;
        /**
         * <pre>
         * Relevant only for Banner objects used with a Video object
         * (Section 3.2.7) in an array of companion ads. Indicates the
         * companion banner rendering mode relative to the associated
         * video, where 0 = concurrent, 1 = end-card.
         * </pre>
         *
         * <code>optional bool vcm = 16;</code>
         * @return Whether the vcm field is set.
         */
        @java.lang.Override
        public boolean hasVcm() {
          return ((bitField0_ & 0x00000200) != 0);
        }
        /**
         * <pre>
         * Relevant only for Banner objects used with a Video object
         * (Section 3.2.7) in an array of companion ads. Indicates the
         * companion banner rendering mode relative to the associated
         * video, where 0 = concurrent, 1 = end-card.
         * </pre>
         *
         * <code>optional bool vcm = 16;</code>
         * @return The vcm.
         */
        @java.lang.Override
        public boolean getVcm() {
          return vcm_;
        }

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

          for (int i = 0; i < getFormatCount(); i++) {
            if (!getFormat(i).isInitialized()) {
              memoizedIsInitialized = 0;
              return false;
            }
          }
          if (!extensionsAreInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
          memoizedIsInitialized = 1;
          return true;
        }

        @java.lang.Override
        public void writeTo(com.google.protobuf.CodedOutputStream output)
                            throws java.io.IOException {
          getSerializedSize();
          com.google.protobuf.GeneratedMessageV3
            .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner>.ExtensionWriter
              extensionWriter = newExtensionWriter();
          if (((bitField0_ & 0x00000001) != 0)) {
            output.writeInt32(1, w_);
          }
          if (((bitField0_ & 0x00000002) != 0)) {
            output.writeInt32(2, h_);
          }
          if (((bitField0_ & 0x00000040) != 0)) {
            com.google.protobuf.GeneratedMessageV3.writeString(output, 3, id_);
          }
          if (((bitField0_ & 0x00000080) != 0)) {
            output.writeInt32(4, pos_);
          }
          if (getBtypeList().size() > 0) {
            output.writeUInt32NoTag(42);
            output.writeUInt32NoTag(btypeMemoizedSerializedSize);
          }
          for (int i = 0; i < btype_.size(); i++) {
            output.writeInt32NoTag(btype_.getInt(i));
          }
          if (getBattrList().size() > 0) {
            output.writeUInt32NoTag(50);
            output.writeUInt32NoTag(battrMemoizedSerializedSize);
          }
          for (int i = 0; i < battr_.size(); i++) {
            output.writeInt32NoTag(battr_.getInt(i));
          }
          for (int i = 0; i < mimes_.size(); i++) {
            com.google.protobuf.GeneratedMessageV3.writeString(output, 7, mimes_.getRaw(i));
          }
          if (((bitField0_ & 0x00000100) != 0)) {
            output.writeBool(8, topframe_);
          }
          if (getExpdirList().size() > 0) {
            output.writeUInt32NoTag(74);
            output.writeUInt32NoTag(expdirMemoizedSerializedSize);
          }
          for (int i = 0; i < expdir_.size(); i++) {
            output.writeInt32NoTag(expdir_.getInt(i));
          }
          if (getApiList().size() > 0) {
            output.writeUInt32NoTag(82);
            output.writeUInt32NoTag(apiMemoizedSerializedSize);
          }
          for (int i = 0; i < api_.size(); i++) {
            output.writeInt32NoTag(api_.getInt(i));
          }
          if (((bitField0_ & 0x00000004) != 0)) {
            output.writeInt32(11, wmax_);
          }
          if (((bitField0_ & 0x00000008) != 0)) {
            output.writeInt32(12, hmax_);
          }
          if (((bitField0_ & 0x00000010) != 0)) {
            output.writeInt32(13, wmin_);
          }
          if (((bitField0_ & 0x00000020) != 0)) {
            output.writeInt32(14, hmin_);
          }
          for (int i = 0; i < format_.size(); i++) {
            output.writeMessage(15, format_.get(i));
          }
          if (((bitField0_ & 0x00000200) != 0)) {
            output.writeBool(16, vcm_);
          }
          extensionWriter.writeUntil(10000, output);
          unknownFields.writeTo(output);
        }

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

          size = 0;
          if (((bitField0_ & 0x00000001) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(1, w_);
          }
          if (((bitField0_ & 0x00000002) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(2, h_);
          }
          if (((bitField0_ & 0x00000040) != 0)) {
            size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, id_);
          }
          if (((bitField0_ & 0x00000080) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(4, pos_);
          }
          {
            int dataSize = 0;
            for (int i = 0; i < btype_.size(); i++) {
              dataSize += com.google.protobuf.CodedOutputStream
                .computeInt32SizeNoTag(btype_.getInt(i));
            }
            size += dataSize;
            if (!getBtypeList().isEmpty()) {
              size += 1;
              size += com.google.protobuf.CodedOutputStream
                  .computeInt32SizeNoTag(dataSize);
            }
            btypeMemoizedSerializedSize = dataSize;
          }
          {
            int dataSize = 0;
            for (int i = 0; i < battr_.size(); i++) {
              dataSize += com.google.protobuf.CodedOutputStream
                .computeInt32SizeNoTag(battr_.getInt(i));
            }
            size += dataSize;
            if (!getBattrList().isEmpty()) {
              size += 1;
              size += com.google.protobuf.CodedOutputStream
                  .computeInt32SizeNoTag(dataSize);
            }
            battrMemoizedSerializedSize = dataSize;
          }
          {
            int dataSize = 0;
            for (int i = 0; i < mimes_.size(); i++) {
              dataSize += computeStringSizeNoTag(mimes_.getRaw(i));
            }
            size += dataSize;
            size += 1 * getMimesList().size();
          }
          if (((bitField0_ & 0x00000100) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeBoolSize(8, topframe_);
          }
          {
            int dataSize = 0;
            for (int i = 0; i < expdir_.size(); i++) {
              dataSize += com.google.protobuf.CodedOutputStream
                .computeInt32SizeNoTag(expdir_.getInt(i));
            }
            size += dataSize;
            if (!getExpdirList().isEmpty()) {
              size += 1;
              size += com.google.protobuf.CodedOutputStream
                  .computeInt32SizeNoTag(dataSize);
            }
            expdirMemoizedSerializedSize = dataSize;
          }
          {
            int dataSize = 0;
            for (int i = 0; i < api_.size(); i++) {
              dataSize += com.google.protobuf.CodedOutputStream
                .computeInt32SizeNoTag(api_.getInt(i));
            }
            size += dataSize;
            if (!getApiList().isEmpty()) {
              size += 1;
              size += com.google.protobuf.CodedOutputStream
                  .computeInt32SizeNoTag(dataSize);
            }
            apiMemoizedSerializedSize = dataSize;
          }
          if (((bitField0_ & 0x00000004) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(11, wmax_);
          }
          if (((bitField0_ & 0x00000008) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(12, hmax_);
          }
          if (((bitField0_ & 0x00000010) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(13, wmin_);
          }
          if (((bitField0_ & 0x00000020) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(14, hmin_);
          }
          for (int i = 0; i < format_.size(); i++) {
            size += com.google.protobuf.CodedOutputStream
              .computeMessageSize(15, format_.get(i));
          }
          if (((bitField0_ & 0x00000200) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeBoolSize(16, vcm_);
          }
          size += extensionsSerializedSize();
          size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner)) {
            return super.equals(obj);
          }
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner other = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner) obj;

          if (hasW() != other.hasW()) return false;
          if (hasW()) {
            if (getW()
                != other.getW()) return false;
          }
          if (hasH() != other.hasH()) return false;
          if (hasH()) {
            if (getH()
                != other.getH()) return false;
          }
          if (!getFormatList()
              .equals(other.getFormatList())) return false;
          if (hasWmax() != other.hasWmax()) return false;
          if (hasWmax()) {
            if (getWmax()
                != other.getWmax()) return false;
          }
          if (hasHmax() != other.hasHmax()) return false;
          if (hasHmax()) {
            if (getHmax()
                != other.getHmax()) return false;
          }
          if (hasWmin() != other.hasWmin()) return false;
          if (hasWmin()) {
            if (getWmin()
                != other.getWmin()) return false;
          }
          if (hasHmin() != other.hasHmin()) return false;
          if (hasHmin()) {
            if (getHmin()
                != other.getHmin()) return false;
          }
          if (hasId() != other.hasId()) return false;
          if (hasId()) {
            if (!getId()
                .equals(other.getId())) return false;
          }
          if (hasPos() != other.hasPos()) return false;
          if (hasPos()) {
            if (getPos()
                != other.getPos()) return false;
          }
          if (!getBtypeList()
              .equals(other.getBtypeList())) return false;
          if (!getBattrList()
              .equals(other.getBattrList())) return false;
          if (!getMimesList()
              .equals(other.getMimesList())) return false;
          if (hasTopframe() != other.hasTopframe()) return false;
          if (hasTopframe()) {
            if (getTopframe()
                != other.getTopframe()) return false;
          }
          if (!getExpdirList()
              .equals(other.getExpdirList())) return false;
          if (!getApiList()
              .equals(other.getApiList())) return false;
          if (hasVcm() != other.hasVcm()) return false;
          if (hasVcm()) {
            if (getVcm()
                != other.getVcm()) return false;
          }
          if (!unknownFields.equals(other.unknownFields)) return false;
          if (!getExtensionFields().equals(other.getExtensionFields()))
            return false;
          return true;
        }

        @java.lang.Override
        public int hashCode() {
          if (memoizedHashCode != 0) {
            return memoizedHashCode;
          }
          int hash = 41;
          hash = (19 * hash) + getDescriptor().hashCode();
          if (hasW()) {
            hash = (37 * hash) + W_FIELD_NUMBER;
            hash = (53 * hash) + getW();
          }
          if (hasH()) {
            hash = (37 * hash) + H_FIELD_NUMBER;
            hash = (53 * hash) + getH();
          }
          if (getFormatCount() > 0) {
            hash = (37 * hash) + FORMAT_FIELD_NUMBER;
            hash = (53 * hash) + getFormatList().hashCode();
          }
          if (hasWmax()) {
            hash = (37 * hash) + WMAX_FIELD_NUMBER;
            hash = (53 * hash) + getWmax();
          }
          if (hasHmax()) {
            hash = (37 * hash) + HMAX_FIELD_NUMBER;
            hash = (53 * hash) + getHmax();
          }
          if (hasWmin()) {
            hash = (37 * hash) + WMIN_FIELD_NUMBER;
            hash = (53 * hash) + getWmin();
          }
          if (hasHmin()) {
            hash = (37 * hash) + HMIN_FIELD_NUMBER;
            hash = (53 * hash) + getHmin();
          }
          if (hasId()) {
            hash = (37 * hash) + ID_FIELD_NUMBER;
            hash = (53 * hash) + getId().hashCode();
          }
          if (hasPos()) {
            hash = (37 * hash) + POS_FIELD_NUMBER;
            hash = (53 * hash) + getPos();
          }
          if (getBtypeCount() > 0) {
            hash = (37 * hash) + BTYPE_FIELD_NUMBER;
            hash = (53 * hash) + getBtypeList().hashCode();
          }
          if (getBattrCount() > 0) {
            hash = (37 * hash) + BATTR_FIELD_NUMBER;
            hash = (53 * hash) + getBattrList().hashCode();
          }
          if (getMimesCount() > 0) {
            hash = (37 * hash) + MIMES_FIELD_NUMBER;
            hash = (53 * hash) + getMimesList().hashCode();
          }
          if (hasTopframe()) {
            hash = (37 * hash) + TOPFRAME_FIELD_NUMBER;
            hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
                getTopframe());
          }
          if (getExpdirCount() > 0) {
            hash = (37 * hash) + EXPDIR_FIELD_NUMBER;
            hash = (53 * hash) + getExpdirList().hashCode();
          }
          if (getApiCount() > 0) {
            hash = (37 * hash) + API_FIELD_NUMBER;
            hash = (53 * hash) + getApiList().hashCode();
          }
          if (hasVcm()) {
            hash = (37 * hash) + VCM_FIELD_NUMBER;
            hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
                getVcm());
          }
          hash = hashFields(hash, getExtensionFields());
          hash = (29 * hash) + unknownFields.hashCode();
          memoizedHashCode = hash;
          return hash;
        }

        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner parseFrom(
            java.nio.ByteBuffer data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner parseFrom(
            java.nio.ByteBuffer data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner parseFrom(
            com.google.protobuf.ByteString data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner parseFrom(
            com.google.protobuf.ByteString data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner parseFrom(byte[] data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner parseFrom(
            byte[] data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner parseFrom(java.io.InputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner parseDelimitedFrom(java.io.InputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseDelimitedWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner parseFrom(
            com.google.protobuf.CodedInputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner 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>
         * OpenRTB 2.0: This object represents the most general type of
         * impression.  Although the term "banner" may have very specific meaning
         * in other contexts, here it can be many things including a simple static
         * image, an expandable ad unit, or even in-banner video (refer to the Video
         * object in Section 3.2.4 for the more generalized and full featured video
         * ad units). An array of Banner objects can also appear within the Video
         * to describe optional companion ads defined in the VAST specification.
         * The presence of a Banner as a subordinate of the Imp object indicates
         * that this impression is offered as a banner type impression.
         * At the publisher's discretion, that same impression may also be offered
         * as video and/or native by also including as Imp subordinates the Video
         * and/or Native objects, respectively. However, any given bid for the
         * impression must conform to one of the offered types.
         * </pre>
         *
         * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner}
         */
        public static final class Builder extends
            com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner, Builder> implements
            // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner)
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.BannerOrBuilder {
          public static final com.google.protobuf.Descriptors.Descriptor
              getDescriptor() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Banner_descriptor;
          }

          @java.lang.Override
          protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
              internalGetFieldAccessorTable() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Banner_fieldAccessorTable
                .ensureFieldAccessorsInitialized(
                    com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Builder.class);
          }

          // Construct using com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.newBuilder()
          private Builder() {
            maybeForceBuilderInitialization();
          }

          private Builder(
              com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
            super(parent);
            maybeForceBuilderInitialization();
          }
          private void maybeForceBuilderInitialization() {
            if (com.google.protobuf.GeneratedMessageV3
                    .alwaysUseFieldBuilders) {
              getFormatFieldBuilder();
            }
          }
          @java.lang.Override
          public Builder clear() {
            super.clear();
            w_ = 0;
            bitField0_ = (bitField0_ & ~0x00000001);
            h_ = 0;
            bitField0_ = (bitField0_ & ~0x00000002);
            if (formatBuilder_ == null) {
              format_ = java.util.Collections.emptyList();
              bitField0_ = (bitField0_ & ~0x00000004);
            } else {
              formatBuilder_.clear();
            }
            wmax_ = 0;
            bitField0_ = (bitField0_ & ~0x00000008);
            hmax_ = 0;
            bitField0_ = (bitField0_ & ~0x00000010);
            wmin_ = 0;
            bitField0_ = (bitField0_ & ~0x00000020);
            hmin_ = 0;
            bitField0_ = (bitField0_ & ~0x00000040);
            id_ = "";
            bitField0_ = (bitField0_ & ~0x00000080);
            pos_ = 0;
            bitField0_ = (bitField0_ & ~0x00000100);
            btype_ = emptyIntList();
            bitField0_ = (bitField0_ & ~0x00000200);
            battr_ = emptyIntList();
            bitField0_ = (bitField0_ & ~0x00000400);
            mimes_ = com.google.protobuf.LazyStringArrayList.EMPTY;
            bitField0_ = (bitField0_ & ~0x00000800);
            topframe_ = false;
            bitField0_ = (bitField0_ & ~0x00001000);
            expdir_ = emptyIntList();
            bitField0_ = (bitField0_ & ~0x00002000);
            api_ = emptyIntList();
            bitField0_ = (bitField0_ & ~0x00004000);
            vcm_ = false;
            bitField0_ = (bitField0_ & ~0x00008000);
            return this;
          }

          @java.lang.Override
          public com.google.protobuf.Descriptors.Descriptor
              getDescriptorForType() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Banner_descriptor;
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner getDefaultInstanceForType() {
            return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.getDefaultInstance();
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner build() {
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner result = buildPartial();
            if (!result.isInitialized()) {
              throw newUninitializedMessageException(result);
            }
            return result;
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner buildPartial() {
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner result = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner(this);
            int from_bitField0_ = bitField0_;
            int to_bitField0_ = 0;
            if (((from_bitField0_ & 0x00000001) != 0)) {
              result.w_ = w_;
              to_bitField0_ |= 0x00000001;
            }
            if (((from_bitField0_ & 0x00000002) != 0)) {
              result.h_ = h_;
              to_bitField0_ |= 0x00000002;
            }
            if (formatBuilder_ == null) {
              if (((bitField0_ & 0x00000004) != 0)) {
                format_ = java.util.Collections.unmodifiableList(format_);
                bitField0_ = (bitField0_ & ~0x00000004);
              }
              result.format_ = format_;
            } else {
              result.format_ = formatBuilder_.build();
            }
            if (((from_bitField0_ & 0x00000008) != 0)) {
              result.wmax_ = wmax_;
              to_bitField0_ |= 0x00000004;
            }
            if (((from_bitField0_ & 0x00000010) != 0)) {
              result.hmax_ = hmax_;
              to_bitField0_ |= 0x00000008;
            }
            if (((from_bitField0_ & 0x00000020) != 0)) {
              result.wmin_ = wmin_;
              to_bitField0_ |= 0x00000010;
            }
            if (((from_bitField0_ & 0x00000040) != 0)) {
              result.hmin_ = hmin_;
              to_bitField0_ |= 0x00000020;
            }
            if (((from_bitField0_ & 0x00000080) != 0)) {
              to_bitField0_ |= 0x00000040;
            }
            result.id_ = id_;
            if (((from_bitField0_ & 0x00000100) != 0)) {
              result.pos_ = pos_;
              to_bitField0_ |= 0x00000080;
            }
            if (((bitField0_ & 0x00000200) != 0)) {
              btype_.makeImmutable();
              bitField0_ = (bitField0_ & ~0x00000200);
            }
            result.btype_ = btype_;
            if (((bitField0_ & 0x00000400) != 0)) {
              battr_.makeImmutable();
              bitField0_ = (bitField0_ & ~0x00000400);
            }
            result.battr_ = battr_;
            if (((bitField0_ & 0x00000800) != 0)) {
              mimes_ = mimes_.getUnmodifiableView();
              bitField0_ = (bitField0_ & ~0x00000800);
            }
            result.mimes_ = mimes_;
            if (((from_bitField0_ & 0x00001000) != 0)) {
              result.topframe_ = topframe_;
              to_bitField0_ |= 0x00000100;
            }
            if (((bitField0_ & 0x00002000) != 0)) {
              expdir_.makeImmutable();
              bitField0_ = (bitField0_ & ~0x00002000);
            }
            result.expdir_ = expdir_;
            if (((bitField0_ & 0x00004000) != 0)) {
              api_.makeImmutable();
              bitField0_ = (bitField0_ & ~0x00004000);
            }
            result.api_ = api_;
            if (((from_bitField0_ & 0x00008000) != 0)) {
              result.vcm_ = vcm_;
              to_bitField0_ |= 0x00000200;
            }
            result.bitField0_ = to_bitField0_;
            onBuilt();
            return result;
          }

          @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 <Type> Builder setExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner, Type> extension,
              Type value) {
            return super.setExtension(extension, value);
          }
          @java.lang.Override
          public <Type> Builder setExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner, java.util.List<Type>> extension,
              int index, Type value) {
            return super.setExtension(extension, index, value);
          }
          @java.lang.Override
          public <Type> Builder addExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner, java.util.List<Type>> extension,
              Type value) {
            return super.addExtension(extension, value);
          }
          @java.lang.Override
          public <Type> Builder clearExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner, ?> extension) {
            return super.clearExtension(extension);
          }
          @java.lang.Override
          public Builder mergeFrom(com.google.protobuf.Message other) {
            if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner) {
              return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner)other);
            } else {
              super.mergeFrom(other);
              return this;
            }
          }

          public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner other) {
            if (other == com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.getDefaultInstance()) return this;
            if (other.hasW()) {
              setW(other.getW());
            }
            if (other.hasH()) {
              setH(other.getH());
            }
            if (formatBuilder_ == null) {
              if (!other.format_.isEmpty()) {
                if (format_.isEmpty()) {
                  format_ = other.format_;
                  bitField0_ = (bitField0_ & ~0x00000004);
                } else {
                  ensureFormatIsMutable();
                  format_.addAll(other.format_);
                }
                onChanged();
              }
            } else {
              if (!other.format_.isEmpty()) {
                if (formatBuilder_.isEmpty()) {
                  formatBuilder_.dispose();
                  formatBuilder_ = null;
                  format_ = other.format_;
                  bitField0_ = (bitField0_ & ~0x00000004);
                  formatBuilder_ = 
                    com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
                       getFormatFieldBuilder() : null;
                } else {
                  formatBuilder_.addAllMessages(other.format_);
                }
              }
            }
            if (other.hasWmax()) {
              setWmax(other.getWmax());
            }
            if (other.hasHmax()) {
              setHmax(other.getHmax());
            }
            if (other.hasWmin()) {
              setWmin(other.getWmin());
            }
            if (other.hasHmin()) {
              setHmin(other.getHmin());
            }
            if (other.hasId()) {
              bitField0_ |= 0x00000080;
              id_ = other.id_;
              onChanged();
            }
            if (other.hasPos()) {
              setPos(other.getPos());
            }
            if (!other.btype_.isEmpty()) {
              if (btype_.isEmpty()) {
                btype_ = other.btype_;
                bitField0_ = (bitField0_ & ~0x00000200);
              } else {
                ensureBtypeIsMutable();
                btype_.addAll(other.btype_);
              }
              onChanged();
            }
            if (!other.battr_.isEmpty()) {
              if (battr_.isEmpty()) {
                battr_ = other.battr_;
                bitField0_ = (bitField0_ & ~0x00000400);
              } else {
                ensureBattrIsMutable();
                battr_.addAll(other.battr_);
              }
              onChanged();
            }
            if (!other.mimes_.isEmpty()) {
              if (mimes_.isEmpty()) {
                mimes_ = other.mimes_;
                bitField0_ = (bitField0_ & ~0x00000800);
              } else {
                ensureMimesIsMutable();
                mimes_.addAll(other.mimes_);
              }
              onChanged();
            }
            if (other.hasTopframe()) {
              setTopframe(other.getTopframe());
            }
            if (!other.expdir_.isEmpty()) {
              if (expdir_.isEmpty()) {
                expdir_ = other.expdir_;
                bitField0_ = (bitField0_ & ~0x00002000);
              } else {
                ensureExpdirIsMutable();
                expdir_.addAll(other.expdir_);
              }
              onChanged();
            }
            if (!other.api_.isEmpty()) {
              if (api_.isEmpty()) {
                api_ = other.api_;
                bitField0_ = (bitField0_ & ~0x00004000);
              } else {
                ensureApiIsMutable();
                api_.addAll(other.api_);
              }
              onChanged();
            }
            if (other.hasVcm()) {
              setVcm(other.getVcm());
            }
            this.mergeExtensionFields(other);
            this.mergeUnknownFields(other.unknownFields);
            onChanged();
            return this;
          }

          @java.lang.Override
          public final boolean isInitialized() {
            for (int i = 0; i < getFormatCount(); i++) {
              if (!getFormat(i).isInitialized()) {
                return false;
              }
            }
            if (!extensionsAreInitialized()) {
              return false;
            }
            return true;
          }

          @java.lang.Override
          public Builder mergeFrom(
              com.google.protobuf.CodedInputStream input,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner parsedMessage = null;
            try {
              parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
              parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner) e.getUnfinishedMessage();
              throw e.unwrapIOException();
            } finally {
              if (parsedMessage != null) {
                mergeFrom(parsedMessage);
              }
            }
            return this;
          }
          private int bitField0_;

          private int w_ ;
          /**
           * <pre>
           * Width in device independent pixels (DIPS).
           * If no format objects are specified, this is an exact width
           * requirement. Otherwise it is a preferred width.
           * </pre>
           *
           * <code>optional int32 w = 1;</code>
           * @return Whether the w field is set.
           */
          @java.lang.Override
          public boolean hasW() {
            return ((bitField0_ & 0x00000001) != 0);
          }
          /**
           * <pre>
           * Width in device independent pixels (DIPS).
           * If no format objects are specified, this is an exact width
           * requirement. Otherwise it is a preferred width.
           * </pre>
           *
           * <code>optional int32 w = 1;</code>
           * @return The w.
           */
          @java.lang.Override
          public int getW() {
            return w_;
          }
          /**
           * <pre>
           * Width in device independent pixels (DIPS).
           * If no format objects are specified, this is an exact width
           * requirement. Otherwise it is a preferred width.
           * </pre>
           *
           * <code>optional int32 w = 1;</code>
           * @param value The w to set.
           * @return This builder for chaining.
           */
          public Builder setW(int value) {
            bitField0_ |= 0x00000001;
            w_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Width in device independent pixels (DIPS).
           * If no format objects are specified, this is an exact width
           * requirement. Otherwise it is a preferred width.
           * </pre>
           *
           * <code>optional int32 w = 1;</code>
           * @return This builder for chaining.
           */
          public Builder clearW() {
            bitField0_ = (bitField0_ & ~0x00000001);
            w_ = 0;
            onChanged();
            return this;
          }

          private int h_ ;
          /**
           * <pre>
           * Height in device independent pixels (DIPS).
           * If no format objects are specified, this is an exact height
           * requirement. Otherwise it is a preferred height.
           * </pre>
           *
           * <code>optional int32 h = 2;</code>
           * @return Whether the h field is set.
           */
          @java.lang.Override
          public boolean hasH() {
            return ((bitField0_ & 0x00000002) != 0);
          }
          /**
           * <pre>
           * Height in device independent pixels (DIPS).
           * If no format objects are specified, this is an exact height
           * requirement. Otherwise it is a preferred height.
           * </pre>
           *
           * <code>optional int32 h = 2;</code>
           * @return The h.
           */
          @java.lang.Override
          public int getH() {
            return h_;
          }
          /**
           * <pre>
           * Height in device independent pixels (DIPS).
           * If no format objects are specified, this is an exact height
           * requirement. Otherwise it is a preferred height.
           * </pre>
           *
           * <code>optional int32 h = 2;</code>
           * @param value The h to set.
           * @return This builder for chaining.
           */
          public Builder setH(int value) {
            bitField0_ |= 0x00000002;
            h_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Height in device independent pixels (DIPS).
           * If no format objects are specified, this is an exact height
           * requirement. Otherwise it is a preferred height.
           * </pre>
           *
           * <code>optional int32 h = 2;</code>
           * @return This builder for chaining.
           */
          public Builder clearH() {
            bitField0_ = (bitField0_ & ~0x00000002);
            h_ = 0;
            onChanged();
            return this;
          }

          private java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format> format_ =
            java.util.Collections.emptyList();
          private void ensureFormatIsMutable() {
            if (!((bitField0_ & 0x00000004) != 0)) {
              format_ = new java.util.ArrayList<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format>(format_);
              bitField0_ |= 0x00000004;
             }
          }

          private com.google.protobuf.RepeatedFieldBuilderV3<
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.FormatOrBuilder> formatBuilder_;

          /**
           * <pre>
           * Array of format objects representing the banner sizes permitted.
           * If none are specified, then use of the h and w attributes
           * is highly recommended.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner.Format format = 15;</code>
           */
          public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format> getFormatList() {
            if (formatBuilder_ == null) {
              return java.util.Collections.unmodifiableList(format_);
            } else {
              return formatBuilder_.getMessageList();
            }
          }
          /**
           * <pre>
           * Array of format objects representing the banner sizes permitted.
           * If none are specified, then use of the h and w attributes
           * is highly recommended.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner.Format format = 15;</code>
           */
          public int getFormatCount() {
            if (formatBuilder_ == null) {
              return format_.size();
            } else {
              return formatBuilder_.getCount();
            }
          }
          /**
           * <pre>
           * Array of format objects representing the banner sizes permitted.
           * If none are specified, then use of the h and w attributes
           * is highly recommended.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner.Format format = 15;</code>
           */
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format getFormat(int index) {
            if (formatBuilder_ == null) {
              return format_.get(index);
            } else {
              return formatBuilder_.getMessage(index);
            }
          }
          /**
           * <pre>
           * Array of format objects representing the banner sizes permitted.
           * If none are specified, then use of the h and w attributes
           * is highly recommended.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner.Format format = 15;</code>
           */
          public Builder setFormat(
              int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format value) {
            if (formatBuilder_ == null) {
              if (value == null) {
                throw new NullPointerException();
              }
              ensureFormatIsMutable();
              format_.set(index, value);
              onChanged();
            } else {
              formatBuilder_.setMessage(index, value);
            }
            return this;
          }
          /**
           * <pre>
           * Array of format objects representing the banner sizes permitted.
           * If none are specified, then use of the h and w attributes
           * is highly recommended.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner.Format format = 15;</code>
           */
          public Builder setFormat(
              int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format.Builder builderForValue) {
            if (formatBuilder_ == null) {
              ensureFormatIsMutable();
              format_.set(index, builderForValue.build());
              onChanged();
            } else {
              formatBuilder_.setMessage(index, builderForValue.build());
            }
            return this;
          }
          /**
           * <pre>
           * Array of format objects representing the banner sizes permitted.
           * If none are specified, then use of the h and w attributes
           * is highly recommended.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner.Format format = 15;</code>
           */
          public Builder addFormat(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format value) {
            if (formatBuilder_ == null) {
              if (value == null) {
                throw new NullPointerException();
              }
              ensureFormatIsMutable();
              format_.add(value);
              onChanged();
            } else {
              formatBuilder_.addMessage(value);
            }
            return this;
          }
          /**
           * <pre>
           * Array of format objects representing the banner sizes permitted.
           * If none are specified, then use of the h and w attributes
           * is highly recommended.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner.Format format = 15;</code>
           */
          public Builder addFormat(
              int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format value) {
            if (formatBuilder_ == null) {
              if (value == null) {
                throw new NullPointerException();
              }
              ensureFormatIsMutable();
              format_.add(index, value);
              onChanged();
            } else {
              formatBuilder_.addMessage(index, value);
            }
            return this;
          }
          /**
           * <pre>
           * Array of format objects representing the banner sizes permitted.
           * If none are specified, then use of the h and w attributes
           * is highly recommended.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner.Format format = 15;</code>
           */
          public Builder addFormat(
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format.Builder builderForValue) {
            if (formatBuilder_ == null) {
              ensureFormatIsMutable();
              format_.add(builderForValue.build());
              onChanged();
            } else {
              formatBuilder_.addMessage(builderForValue.build());
            }
            return this;
          }
          /**
           * <pre>
           * Array of format objects representing the banner sizes permitted.
           * If none are specified, then use of the h and w attributes
           * is highly recommended.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner.Format format = 15;</code>
           */
          public Builder addFormat(
              int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format.Builder builderForValue) {
            if (formatBuilder_ == null) {
              ensureFormatIsMutable();
              format_.add(index, builderForValue.build());
              onChanged();
            } else {
              formatBuilder_.addMessage(index, builderForValue.build());
            }
            return this;
          }
          /**
           * <pre>
           * Array of format objects representing the banner sizes permitted.
           * If none are specified, then use of the h and w attributes
           * is highly recommended.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner.Format format = 15;</code>
           */
          public Builder addAllFormat(
              java.lang.Iterable<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format> values) {
            if (formatBuilder_ == null) {
              ensureFormatIsMutable();
              com.google.protobuf.AbstractMessageLite.Builder.addAll(
                  values, format_);
              onChanged();
            } else {
              formatBuilder_.addAllMessages(values);
            }
            return this;
          }
          /**
           * <pre>
           * Array of format objects representing the banner sizes permitted.
           * If none are specified, then use of the h and w attributes
           * is highly recommended.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner.Format format = 15;</code>
           */
          public Builder clearFormat() {
            if (formatBuilder_ == null) {
              format_ = java.util.Collections.emptyList();
              bitField0_ = (bitField0_ & ~0x00000004);
              onChanged();
            } else {
              formatBuilder_.clear();
            }
            return this;
          }
          /**
           * <pre>
           * Array of format objects representing the banner sizes permitted.
           * If none are specified, then use of the h and w attributes
           * is highly recommended.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner.Format format = 15;</code>
           */
          public Builder removeFormat(int index) {
            if (formatBuilder_ == null) {
              ensureFormatIsMutable();
              format_.remove(index);
              onChanged();
            } else {
              formatBuilder_.remove(index);
            }
            return this;
          }
          /**
           * <pre>
           * Array of format objects representing the banner sizes permitted.
           * If none are specified, then use of the h and w attributes
           * is highly recommended.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner.Format format = 15;</code>
           */
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format.Builder getFormatBuilder(
              int index) {
            return getFormatFieldBuilder().getBuilder(index);
          }
          /**
           * <pre>
           * Array of format objects representing the banner sizes permitted.
           * If none are specified, then use of the h and w attributes
           * is highly recommended.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner.Format format = 15;</code>
           */
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.FormatOrBuilder getFormatOrBuilder(
              int index) {
            if (formatBuilder_ == null) {
              return format_.get(index);  } else {
              return formatBuilder_.getMessageOrBuilder(index);
            }
          }
          /**
           * <pre>
           * Array of format objects representing the banner sizes permitted.
           * If none are specified, then use of the h and w attributes
           * is highly recommended.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner.Format format = 15;</code>
           */
          public java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.FormatOrBuilder> 
               getFormatOrBuilderList() {
            if (formatBuilder_ != null) {
              return formatBuilder_.getMessageOrBuilderList();
            } else {
              return java.util.Collections.unmodifiableList(format_);
            }
          }
          /**
           * <pre>
           * Array of format objects representing the banner sizes permitted.
           * If none are specified, then use of the h and w attributes
           * is highly recommended.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner.Format format = 15;</code>
           */
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format.Builder addFormatBuilder() {
            return getFormatFieldBuilder().addBuilder(
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format.getDefaultInstance());
          }
          /**
           * <pre>
           * Array of format objects representing the banner sizes permitted.
           * If none are specified, then use of the h and w attributes
           * is highly recommended.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner.Format format = 15;</code>
           */
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format.Builder addFormatBuilder(
              int index) {
            return getFormatFieldBuilder().addBuilder(
                index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format.getDefaultInstance());
          }
          /**
           * <pre>
           * Array of format objects representing the banner sizes permitted.
           * If none are specified, then use of the h and w attributes
           * is highly recommended.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner.Format format = 15;</code>
           */
          public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format.Builder> 
               getFormatBuilderList() {
            return getFormatFieldBuilder().getBuilderList();
          }
          private com.google.protobuf.RepeatedFieldBuilderV3<
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.FormatOrBuilder> 
              getFormatFieldBuilder() {
            if (formatBuilder_ == null) {
              formatBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Format.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.FormatOrBuilder>(
                      format_,
                      ((bitField0_ & 0x00000004) != 0),
                      getParentForChildren(),
                      isClean());
              format_ = null;
            }
            return formatBuilder_;
          }

          private int wmax_ ;
          /**
           * <pre>
           * NOTE: Deprecated in favor of the format array.
           * Maximum width in device independent pixels (DIPS).
           * </pre>
           *
           * <code>optional int32 wmax = 11 [deprecated = true];</code>
           * @return Whether the wmax field is set.
           */
          @java.lang.Override
          @java.lang.Deprecated public boolean hasWmax() {
            return ((bitField0_ & 0x00000008) != 0);
          }
          /**
           * <pre>
           * NOTE: Deprecated in favor of the format array.
           * Maximum width in device independent pixels (DIPS).
           * </pre>
           *
           * <code>optional int32 wmax = 11 [deprecated = true];</code>
           * @return The wmax.
           */
          @java.lang.Override
          @java.lang.Deprecated public int getWmax() {
            return wmax_;
          }
          /**
           * <pre>
           * NOTE: Deprecated in favor of the format array.
           * Maximum width in device independent pixels (DIPS).
           * </pre>
           *
           * <code>optional int32 wmax = 11 [deprecated = true];</code>
           * @param value The wmax to set.
           * @return This builder for chaining.
           */
          @java.lang.Deprecated public Builder setWmax(int value) {
            bitField0_ |= 0x00000008;
            wmax_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * NOTE: Deprecated in favor of the format array.
           * Maximum width in device independent pixels (DIPS).
           * </pre>
           *
           * <code>optional int32 wmax = 11 [deprecated = true];</code>
           * @return This builder for chaining.
           */
          @java.lang.Deprecated public Builder clearWmax() {
            bitField0_ = (bitField0_ & ~0x00000008);
            wmax_ = 0;
            onChanged();
            return this;
          }

          private int hmax_ ;
          /**
           * <pre>
           * NOTE: Deprecated in favor of the format array.
           * Maximum height in device independent pixels (DIPS).
           * </pre>
           *
           * <code>optional int32 hmax = 12 [deprecated = true];</code>
           * @return Whether the hmax field is set.
           */
          @java.lang.Override
          @java.lang.Deprecated public boolean hasHmax() {
            return ((bitField0_ & 0x00000010) != 0);
          }
          /**
           * <pre>
           * NOTE: Deprecated in favor of the format array.
           * Maximum height in device independent pixels (DIPS).
           * </pre>
           *
           * <code>optional int32 hmax = 12 [deprecated = true];</code>
           * @return The hmax.
           */
          @java.lang.Override
          @java.lang.Deprecated public int getHmax() {
            return hmax_;
          }
          /**
           * <pre>
           * NOTE: Deprecated in favor of the format array.
           * Maximum height in device independent pixels (DIPS).
           * </pre>
           *
           * <code>optional int32 hmax = 12 [deprecated = true];</code>
           * @param value The hmax to set.
           * @return This builder for chaining.
           */
          @java.lang.Deprecated public Builder setHmax(int value) {
            bitField0_ |= 0x00000010;
            hmax_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * NOTE: Deprecated in favor of the format array.
           * Maximum height in device independent pixels (DIPS).
           * </pre>
           *
           * <code>optional int32 hmax = 12 [deprecated = true];</code>
           * @return This builder for chaining.
           */
          @java.lang.Deprecated public Builder clearHmax() {
            bitField0_ = (bitField0_ & ~0x00000010);
            hmax_ = 0;
            onChanged();
            return this;
          }

          private int wmin_ ;
          /**
           * <pre>
           * NOTE: Deprecated in favor of the format array.
           * Minimum width in device independent pixels (DIPS).
           * </pre>
           *
           * <code>optional int32 wmin = 13 [deprecated = true];</code>
           * @return Whether the wmin field is set.
           */
          @java.lang.Override
          @java.lang.Deprecated public boolean hasWmin() {
            return ((bitField0_ & 0x00000020) != 0);
          }
          /**
           * <pre>
           * NOTE: Deprecated in favor of the format array.
           * Minimum width in device independent pixels (DIPS).
           * </pre>
           *
           * <code>optional int32 wmin = 13 [deprecated = true];</code>
           * @return The wmin.
           */
          @java.lang.Override
          @java.lang.Deprecated public int getWmin() {
            return wmin_;
          }
          /**
           * <pre>
           * NOTE: Deprecated in favor of the format array.
           * Minimum width in device independent pixels (DIPS).
           * </pre>
           *
           * <code>optional int32 wmin = 13 [deprecated = true];</code>
           * @param value The wmin to set.
           * @return This builder for chaining.
           */
          @java.lang.Deprecated public Builder setWmin(int value) {
            bitField0_ |= 0x00000020;
            wmin_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * NOTE: Deprecated in favor of the format array.
           * Minimum width in device independent pixels (DIPS).
           * </pre>
           *
           * <code>optional int32 wmin = 13 [deprecated = true];</code>
           * @return This builder for chaining.
           */
          @java.lang.Deprecated public Builder clearWmin() {
            bitField0_ = (bitField0_ & ~0x00000020);
            wmin_ = 0;
            onChanged();
            return this;
          }

          private int hmin_ ;
          /**
           * <pre>
           * NOTE: Deprecated in favor of the format array.
           * Minimum height in device independent pixels (DIPS).
           * </pre>
           *
           * <code>optional int32 hmin = 14 [deprecated = true];</code>
           * @return Whether the hmin field is set.
           */
          @java.lang.Override
          @java.lang.Deprecated public boolean hasHmin() {
            return ((bitField0_ & 0x00000040) != 0);
          }
          /**
           * <pre>
           * NOTE: Deprecated in favor of the format array.
           * Minimum height in device independent pixels (DIPS).
           * </pre>
           *
           * <code>optional int32 hmin = 14 [deprecated = true];</code>
           * @return The hmin.
           */
          @java.lang.Override
          @java.lang.Deprecated public int getHmin() {
            return hmin_;
          }
          /**
           * <pre>
           * NOTE: Deprecated in favor of the format array.
           * Minimum height in device independent pixels (DIPS).
           * </pre>
           *
           * <code>optional int32 hmin = 14 [deprecated = true];</code>
           * @param value The hmin to set.
           * @return This builder for chaining.
           */
          @java.lang.Deprecated public Builder setHmin(int value) {
            bitField0_ |= 0x00000040;
            hmin_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * NOTE: Deprecated in favor of the format array.
           * Minimum height in device independent pixels (DIPS).
           * </pre>
           *
           * <code>optional int32 hmin = 14 [deprecated = true];</code>
           * @return This builder for chaining.
           */
          @java.lang.Deprecated public Builder clearHmin() {
            bitField0_ = (bitField0_ & ~0x00000040);
            hmin_ = 0;
            onChanged();
            return this;
          }

          private java.lang.Object id_ = "";
          /**
           * <pre>
           * Unique identifier for this banner object. Recommended when Banner
           * objects are used with a Video object (Section 3.2.4) to represent
           * an array of companion ads. Values usually start at 1 and increase
           * with each object; should be unique within an impression.
           * </pre>
           *
           * <code>optional string id = 3;</code>
           * @return Whether the id field is set.
           */
          public boolean hasId() {
            return ((bitField0_ & 0x00000080) != 0);
          }
          /**
           * <pre>
           * Unique identifier for this banner object. Recommended when Banner
           * objects are used with a Video object (Section 3.2.4) to represent
           * an array of companion ads. Values usually start at 1 and increase
           * with each object; should be unique within an impression.
           * </pre>
           *
           * <code>optional string id = 3;</code>
           * @return The id.
           */
          public java.lang.String getId() {
            java.lang.Object ref = id_;
            if (!(ref instanceof java.lang.String)) {
              com.google.protobuf.ByteString bs =
                  (com.google.protobuf.ByteString) ref;
              java.lang.String s = bs.toStringUtf8();
              if (bs.isValidUtf8()) {
                id_ = s;
              }
              return s;
            } else {
              return (java.lang.String) ref;
            }
          }
          /**
           * <pre>
           * Unique identifier for this banner object. Recommended when Banner
           * objects are used with a Video object (Section 3.2.4) to represent
           * an array of companion ads. Values usually start at 1 and increase
           * with each object; should be unique within an impression.
           * </pre>
           *
           * <code>optional string id = 3;</code>
           * @return The bytes for id.
           */
          public com.google.protobuf.ByteString
              getIdBytes() {
            java.lang.Object ref = id_;
            if (ref instanceof String) {
              com.google.protobuf.ByteString b = 
                  com.google.protobuf.ByteString.copyFromUtf8(
                      (java.lang.String) ref);
              id_ = b;
              return b;
            } else {
              return (com.google.protobuf.ByteString) ref;
            }
          }
          /**
           * <pre>
           * Unique identifier for this banner object. Recommended when Banner
           * objects are used with a Video object (Section 3.2.4) to represent
           * an array of companion ads. Values usually start at 1 and increase
           * with each object; should be unique within an impression.
           * </pre>
           *
           * <code>optional string id = 3;</code>
           * @param value The id to set.
           * @return This builder for chaining.
           */
          public Builder setId(
              java.lang.String value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000080;
            id_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Unique identifier for this banner object. Recommended when Banner
           * objects are used with a Video object (Section 3.2.4) to represent
           * an array of companion ads. Values usually start at 1 and increase
           * with each object; should be unique within an impression.
           * </pre>
           *
           * <code>optional string id = 3;</code>
           * @return This builder for chaining.
           */
          public Builder clearId() {
            bitField0_ = (bitField0_ & ~0x00000080);
            id_ = getDefaultInstance().getId();
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Unique identifier for this banner object. Recommended when Banner
           * objects are used with a Video object (Section 3.2.4) to represent
           * an array of companion ads. Values usually start at 1 and increase
           * with each object; should be unique within an impression.
           * </pre>
           *
           * <code>optional string id = 3;</code>
           * @param value The bytes for id to set.
           * @return This builder for chaining.
           */
          public Builder setIdBytes(
              com.google.protobuf.ByteString value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000080;
            id_ = value;
            onChanged();
            return this;
          }

          private int pos_ ;
          /**
           * <pre>
           * Ad position on screen.
           * Refer to enum Position for generic values.
           * </pre>
           *
           * <code>optional int32 pos = 4;</code>
           * @return Whether the pos field is set.
           */
          @java.lang.Override
          public boolean hasPos() {
            return ((bitField0_ & 0x00000100) != 0);
          }
          /**
           * <pre>
           * Ad position on screen.
           * Refer to enum Position for generic values.
           * </pre>
           *
           * <code>optional int32 pos = 4;</code>
           * @return The pos.
           */
          @java.lang.Override
          public int getPos() {
            return pos_;
          }
          /**
           * <pre>
           * Ad position on screen.
           * Refer to enum Position for generic values.
           * </pre>
           *
           * <code>optional int32 pos = 4;</code>
           * @param value The pos to set.
           * @return This builder for chaining.
           */
          public Builder setPos(int value) {
            bitField0_ |= 0x00000100;
            pos_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Ad position on screen.
           * Refer to enum Position for generic values.
           * </pre>
           *
           * <code>optional int32 pos = 4;</code>
           * @return This builder for chaining.
           */
          public Builder clearPos() {
            bitField0_ = (bitField0_ & ~0x00000100);
            pos_ = 0;
            onChanged();
            return this;
          }

          private com.google.protobuf.Internal.IntList btype_ = emptyIntList();
          private void ensureBtypeIsMutable() {
            if (!((bitField0_ & 0x00000200) != 0)) {
              btype_ = mutableCopy(btype_);
              bitField0_ |= 0x00000200;
             }
          }
          /**
           * <pre>
           * Blocked banner ad types.
           * Refer to enum BannerAdType for generic values.
           * </pre>
           *
           * <code>repeated int32 btype = 5 [packed = true];</code>
           * @return A list containing the btype.
           */
          public java.util.List<java.lang.Integer>
              getBtypeList() {
            return ((bitField0_ & 0x00000200) != 0) ?
                     java.util.Collections.unmodifiableList(btype_) : btype_;
          }
          /**
           * <pre>
           * Blocked banner ad types.
           * Refer to enum BannerAdType for generic values.
           * </pre>
           *
           * <code>repeated int32 btype = 5 [packed = true];</code>
           * @return The count of btype.
           */
          public int getBtypeCount() {
            return btype_.size();
          }
          /**
           * <pre>
           * Blocked banner ad types.
           * Refer to enum BannerAdType for generic values.
           * </pre>
           *
           * <code>repeated int32 btype = 5 [packed = true];</code>
           * @param index The index of the element to return.
           * @return The btype at the given index.
           */
          public int getBtype(int index) {
            return btype_.getInt(index);
          }
          /**
           * <pre>
           * Blocked banner ad types.
           * Refer to enum BannerAdType for generic values.
           * </pre>
           *
           * <code>repeated int32 btype = 5 [packed = true];</code>
           * @param index The index to set the value at.
           * @param value The btype to set.
           * @return This builder for chaining.
           */
          public Builder setBtype(
              int index, int value) {
            ensureBtypeIsMutable();
            btype_.setInt(index, value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Blocked banner ad types.
           * Refer to enum BannerAdType for generic values.
           * </pre>
           *
           * <code>repeated int32 btype = 5 [packed = true];</code>
           * @param value The btype to add.
           * @return This builder for chaining.
           */
          public Builder addBtype(int value) {
            ensureBtypeIsMutable();
            btype_.addInt(value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Blocked banner ad types.
           * Refer to enum BannerAdType for generic values.
           * </pre>
           *
           * <code>repeated int32 btype = 5 [packed = true];</code>
           * @param values The btype to add.
           * @return This builder for chaining.
           */
          public Builder addAllBtype(
              java.lang.Iterable<? extends java.lang.Integer> values) {
            ensureBtypeIsMutable();
            com.google.protobuf.AbstractMessageLite.Builder.addAll(
                values, btype_);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Blocked banner ad types.
           * Refer to enum BannerAdType for generic values.
           * </pre>
           *
           * <code>repeated int32 btype = 5 [packed = true];</code>
           * @return This builder for chaining.
           */
          public Builder clearBtype() {
            btype_ = emptyIntList();
            bitField0_ = (bitField0_ & ~0x00000200);
            onChanged();
            return this;
          }

          private com.google.protobuf.Internal.IntList battr_ = emptyIntList();
          private void ensureBattrIsMutable() {
            if (!((bitField0_ & 0x00000400) != 0)) {
              battr_ = mutableCopy(battr_);
              bitField0_ |= 0x00000400;
             }
          }
          /**
           * <pre>
           * Blocked creative attributes.
           * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
           * </pre>
           *
           * <code>repeated int32 battr = 6 [packed = true];</code>
           * @return A list containing the battr.
           */
          public java.util.List<java.lang.Integer>
              getBattrList() {
            return ((bitField0_ & 0x00000400) != 0) ?
                     java.util.Collections.unmodifiableList(battr_) : battr_;
          }
          /**
           * <pre>
           * Blocked creative attributes.
           * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
           * </pre>
           *
           * <code>repeated int32 battr = 6 [packed = true];</code>
           * @return The count of battr.
           */
          public int getBattrCount() {
            return battr_.size();
          }
          /**
           * <pre>
           * Blocked creative attributes.
           * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
           * </pre>
           *
           * <code>repeated int32 battr = 6 [packed = true];</code>
           * @param index The index of the element to return.
           * @return The battr at the given index.
           */
          public int getBattr(int index) {
            return battr_.getInt(index);
          }
          /**
           * <pre>
           * Blocked creative attributes.
           * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
           * </pre>
           *
           * <code>repeated int32 battr = 6 [packed = true];</code>
           * @param index The index to set the value at.
           * @param value The battr to set.
           * @return This builder for chaining.
           */
          public Builder setBattr(
              int index, int value) {
            ensureBattrIsMutable();
            battr_.setInt(index, value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Blocked creative attributes.
           * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
           * </pre>
           *
           * <code>repeated int32 battr = 6 [packed = true];</code>
           * @param value The battr to add.
           * @return This builder for chaining.
           */
          public Builder addBattr(int value) {
            ensureBattrIsMutable();
            battr_.addInt(value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Blocked creative attributes.
           * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
           * </pre>
           *
           * <code>repeated int32 battr = 6 [packed = true];</code>
           * @param values The battr to add.
           * @return This builder for chaining.
           */
          public Builder addAllBattr(
              java.lang.Iterable<? extends java.lang.Integer> values) {
            ensureBattrIsMutable();
            com.google.protobuf.AbstractMessageLite.Builder.addAll(
                values, battr_);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Blocked creative attributes.
           * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
           * </pre>
           *
           * <code>repeated int32 battr = 6 [packed = true];</code>
           * @return This builder for chaining.
           */
          public Builder clearBattr() {
            battr_ = emptyIntList();
            bitField0_ = (bitField0_ & ~0x00000400);
            onChanged();
            return this;
          }

          private com.google.protobuf.LazyStringList mimes_ = com.google.protobuf.LazyStringArrayList.EMPTY;
          private void ensureMimesIsMutable() {
            if (!((bitField0_ & 0x00000800) != 0)) {
              mimes_ = new com.google.protobuf.LazyStringArrayList(mimes_);
              bitField0_ |= 0x00000800;
             }
          }
          /**
           * <pre>
           * Whitelist of content MIME types supported. Popular MIME types include,
           * but are not limited to "image/jpg", "image/gif" and
           * "application/x-shockwave-flash".
           * </pre>
           *
           * <code>repeated string mimes = 7;</code>
           * @return A list containing the mimes.
           */
          public com.google.protobuf.ProtocolStringList
              getMimesList() {
            return mimes_.getUnmodifiableView();
          }
          /**
           * <pre>
           * Whitelist of content MIME types supported. Popular MIME types include,
           * but are not limited to "image/jpg", "image/gif" and
           * "application/x-shockwave-flash".
           * </pre>
           *
           * <code>repeated string mimes = 7;</code>
           * @return The count of mimes.
           */
          public int getMimesCount() {
            return mimes_.size();
          }
          /**
           * <pre>
           * Whitelist of content MIME types supported. Popular MIME types include,
           * but are not limited to "image/jpg", "image/gif" and
           * "application/x-shockwave-flash".
           * </pre>
           *
           * <code>repeated string mimes = 7;</code>
           * @param index The index of the element to return.
           * @return The mimes at the given index.
           */
          public java.lang.String getMimes(int index) {
            return mimes_.get(index);
          }
          /**
           * <pre>
           * Whitelist of content MIME types supported. Popular MIME types include,
           * but are not limited to "image/jpg", "image/gif" and
           * "application/x-shockwave-flash".
           * </pre>
           *
           * <code>repeated string mimes = 7;</code>
           * @param index The index of the value to return.
           * @return The bytes of the mimes at the given index.
           */
          public com.google.protobuf.ByteString
              getMimesBytes(int index) {
            return mimes_.getByteString(index);
          }
          /**
           * <pre>
           * Whitelist of content MIME types supported. Popular MIME types include,
           * but are not limited to "image/jpg", "image/gif" and
           * "application/x-shockwave-flash".
           * </pre>
           *
           * <code>repeated string mimes = 7;</code>
           * @param index The index to set the value at.
           * @param value The mimes to set.
           * @return This builder for chaining.
           */
          public Builder setMimes(
              int index, java.lang.String value) {
            if (value == null) {
    throw new NullPointerException();
  }
  ensureMimesIsMutable();
            mimes_.set(index, value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Whitelist of content MIME types supported. Popular MIME types include,
           * but are not limited to "image/jpg", "image/gif" and
           * "application/x-shockwave-flash".
           * </pre>
           *
           * <code>repeated string mimes = 7;</code>
           * @param value The mimes to add.
           * @return This builder for chaining.
           */
          public Builder addMimes(
              java.lang.String value) {
            if (value == null) {
    throw new NullPointerException();
  }
  ensureMimesIsMutable();
            mimes_.add(value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Whitelist of content MIME types supported. Popular MIME types include,
           * but are not limited to "image/jpg", "image/gif" and
           * "application/x-shockwave-flash".
           * </pre>
           *
           * <code>repeated string mimes = 7;</code>
           * @param values The mimes to add.
           * @return This builder for chaining.
           */
          public Builder addAllMimes(
              java.lang.Iterable<java.lang.String> values) {
            ensureMimesIsMutable();
            com.google.protobuf.AbstractMessageLite.Builder.addAll(
                values, mimes_);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Whitelist of content MIME types supported. Popular MIME types include,
           * but are not limited to "image/jpg", "image/gif" and
           * "application/x-shockwave-flash".
           * </pre>
           *
           * <code>repeated string mimes = 7;</code>
           * @return This builder for chaining.
           */
          public Builder clearMimes() {
            mimes_ = com.google.protobuf.LazyStringArrayList.EMPTY;
            bitField0_ = (bitField0_ & ~0x00000800);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Whitelist of content MIME types supported. Popular MIME types include,
           * but are not limited to "image/jpg", "image/gif" and
           * "application/x-shockwave-flash".
           * </pre>
           *
           * <code>repeated string mimes = 7;</code>
           * @param value The bytes of the mimes to add.
           * @return This builder for chaining.
           */
          public Builder addMimesBytes(
              com.google.protobuf.ByteString value) {
            if (value == null) {
    throw new NullPointerException();
  }
  ensureMimesIsMutable();
            mimes_.add(value);
            onChanged();
            return this;
          }

          private boolean topframe_ ;
          /**
           * <pre>
           * Specify if the banner is delivered in the top frame (true)
           * or in an iframe (false).
           * </pre>
           *
           * <code>optional bool topframe = 8;</code>
           * @return Whether the topframe field is set.
           */
          @java.lang.Override
          public boolean hasTopframe() {
            return ((bitField0_ & 0x00001000) != 0);
          }
          /**
           * <pre>
           * Specify if the banner is delivered in the top frame (true)
           * or in an iframe (false).
           * </pre>
           *
           * <code>optional bool topframe = 8;</code>
           * @return The topframe.
           */
          @java.lang.Override
          public boolean getTopframe() {
            return topframe_;
          }
          /**
           * <pre>
           * Specify if the banner is delivered in the top frame (true)
           * or in an iframe (false).
           * </pre>
           *
           * <code>optional bool topframe = 8;</code>
           * @param value The topframe to set.
           * @return This builder for chaining.
           */
          public Builder setTopframe(boolean value) {
            bitField0_ |= 0x00001000;
            topframe_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Specify if the banner is delivered in the top frame (true)
           * or in an iframe (false).
           * </pre>
           *
           * <code>optional bool topframe = 8;</code>
           * @return This builder for chaining.
           */
          public Builder clearTopframe() {
            bitField0_ = (bitField0_ & ~0x00001000);
            topframe_ = false;
            onChanged();
            return this;
          }

          private com.google.protobuf.Internal.IntList expdir_ = emptyIntList();
          private void ensureExpdirIsMutable() {
            if (!((bitField0_ & 0x00002000) != 0)) {
              expdir_ = mutableCopy(expdir_);
              bitField0_ |= 0x00002000;
             }
          }
          /**
           * <pre>
           * Directions in which the banner may expand.
           * Refer to enum com.iabtechlab.adcom.v1.enums.ExpandableDirection for generic values.
           * </pre>
           *
           * <code>repeated int32 expdir = 9 [packed = true];</code>
           * @return A list containing the expdir.
           */
          public java.util.List<java.lang.Integer>
              getExpdirList() {
            return ((bitField0_ & 0x00002000) != 0) ?
                     java.util.Collections.unmodifiableList(expdir_) : expdir_;
          }
          /**
           * <pre>
           * Directions in which the banner may expand.
           * Refer to enum com.iabtechlab.adcom.v1.enums.ExpandableDirection for generic values.
           * </pre>
           *
           * <code>repeated int32 expdir = 9 [packed = true];</code>
           * @return The count of expdir.
           */
          public int getExpdirCount() {
            return expdir_.size();
          }
          /**
           * <pre>
           * Directions in which the banner may expand.
           * Refer to enum com.iabtechlab.adcom.v1.enums.ExpandableDirection for generic values.
           * </pre>
           *
           * <code>repeated int32 expdir = 9 [packed = true];</code>
           * @param index The index of the element to return.
           * @return The expdir at the given index.
           */
          public int getExpdir(int index) {
            return expdir_.getInt(index);
          }
          /**
           * <pre>
           * Directions in which the banner may expand.
           * Refer to enum com.iabtechlab.adcom.v1.enums.ExpandableDirection for generic values.
           * </pre>
           *
           * <code>repeated int32 expdir = 9 [packed = true];</code>
           * @param index The index to set the value at.
           * @param value The expdir to set.
           * @return This builder for chaining.
           */
          public Builder setExpdir(
              int index, int value) {
            ensureExpdirIsMutable();
            expdir_.setInt(index, value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Directions in which the banner may expand.
           * Refer to enum com.iabtechlab.adcom.v1.enums.ExpandableDirection for generic values.
           * </pre>
           *
           * <code>repeated int32 expdir = 9 [packed = true];</code>
           * @param value The expdir to add.
           * @return This builder for chaining.
           */
          public Builder addExpdir(int value) {
            ensureExpdirIsMutable();
            expdir_.addInt(value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Directions in which the banner may expand.
           * Refer to enum com.iabtechlab.adcom.v1.enums.ExpandableDirection for generic values.
           * </pre>
           *
           * <code>repeated int32 expdir = 9 [packed = true];</code>
           * @param values The expdir to add.
           * @return This builder for chaining.
           */
          public Builder addAllExpdir(
              java.lang.Iterable<? extends java.lang.Integer> values) {
            ensureExpdirIsMutable();
            com.google.protobuf.AbstractMessageLite.Builder.addAll(
                values, expdir_);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Directions in which the banner may expand.
           * Refer to enum com.iabtechlab.adcom.v1.enums.ExpandableDirection for generic values.
           * </pre>
           *
           * <code>repeated int32 expdir = 9 [packed = true];</code>
           * @return This builder for chaining.
           */
          public Builder clearExpdir() {
            expdir_ = emptyIntList();
            bitField0_ = (bitField0_ & ~0x00002000);
            onChanged();
            return this;
          }

          private com.google.protobuf.Internal.IntList api_ = emptyIntList();
          private void ensureApiIsMutable() {
            if (!((bitField0_ & 0x00004000) != 0)) {
              api_ = mutableCopy(api_);
              bitField0_ |= 0x00004000;
             }
          }
          /**
           * <pre>
           * List of supported API frameworks for this impression.
           * If an API is not explicitly listed, it is assumed not to be supported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
           * </pre>
           *
           * <code>repeated int32 api = 10 [packed = true];</code>
           * @return A list containing the api.
           */
          public java.util.List<java.lang.Integer>
              getApiList() {
            return ((bitField0_ & 0x00004000) != 0) ?
                     java.util.Collections.unmodifiableList(api_) : api_;
          }
          /**
           * <pre>
           * List of supported API frameworks for this impression.
           * If an API is not explicitly listed, it is assumed not to be supported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
           * </pre>
           *
           * <code>repeated int32 api = 10 [packed = true];</code>
           * @return The count of api.
           */
          public int getApiCount() {
            return api_.size();
          }
          /**
           * <pre>
           * List of supported API frameworks for this impression.
           * If an API is not explicitly listed, it is assumed not to be supported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
           * </pre>
           *
           * <code>repeated int32 api = 10 [packed = true];</code>
           * @param index The index of the element to return.
           * @return The api at the given index.
           */
          public int getApi(int index) {
            return api_.getInt(index);
          }
          /**
           * <pre>
           * List of supported API frameworks for this impression.
           * If an API is not explicitly listed, it is assumed not to be supported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
           * </pre>
           *
           * <code>repeated int32 api = 10 [packed = true];</code>
           * @param index The index to set the value at.
           * @param value The api to set.
           * @return This builder for chaining.
           */
          public Builder setApi(
              int index, int value) {
            ensureApiIsMutable();
            api_.setInt(index, value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * List of supported API frameworks for this impression.
           * If an API is not explicitly listed, it is assumed not to be supported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
           * </pre>
           *
           * <code>repeated int32 api = 10 [packed = true];</code>
           * @param value The api to add.
           * @return This builder for chaining.
           */
          public Builder addApi(int value) {
            ensureApiIsMutable();
            api_.addInt(value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * List of supported API frameworks for this impression.
           * If an API is not explicitly listed, it is assumed not to be supported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
           * </pre>
           *
           * <code>repeated int32 api = 10 [packed = true];</code>
           * @param values The api to add.
           * @return This builder for chaining.
           */
          public Builder addAllApi(
              java.lang.Iterable<? extends java.lang.Integer> values) {
            ensureApiIsMutable();
            com.google.protobuf.AbstractMessageLite.Builder.addAll(
                values, api_);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * List of supported API frameworks for this impression.
           * If an API is not explicitly listed, it is assumed not to be supported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
           * </pre>
           *
           * <code>repeated int32 api = 10 [packed = true];</code>
           * @return This builder for chaining.
           */
          public Builder clearApi() {
            api_ = emptyIntList();
            bitField0_ = (bitField0_ & ~0x00004000);
            onChanged();
            return this;
          }

          private boolean vcm_ ;
          /**
           * <pre>
           * Relevant only for Banner objects used with a Video object
           * (Section 3.2.7) in an array of companion ads. Indicates the
           * companion banner rendering mode relative to the associated
           * video, where 0 = concurrent, 1 = end-card.
           * </pre>
           *
           * <code>optional bool vcm = 16;</code>
           * @return Whether the vcm field is set.
           */
          @java.lang.Override
          public boolean hasVcm() {
            return ((bitField0_ & 0x00008000) != 0);
          }
          /**
           * <pre>
           * Relevant only for Banner objects used with a Video object
           * (Section 3.2.7) in an array of companion ads. Indicates the
           * companion banner rendering mode relative to the associated
           * video, where 0 = concurrent, 1 = end-card.
           * </pre>
           *
           * <code>optional bool vcm = 16;</code>
           * @return The vcm.
           */
          @java.lang.Override
          public boolean getVcm() {
            return vcm_;
          }
          /**
           * <pre>
           * Relevant only for Banner objects used with a Video object
           * (Section 3.2.7) in an array of companion ads. Indicates the
           * companion banner rendering mode relative to the associated
           * video, where 0 = concurrent, 1 = end-card.
           * </pre>
           *
           * <code>optional bool vcm = 16;</code>
           * @param value The vcm to set.
           * @return This builder for chaining.
           */
          public Builder setVcm(boolean value) {
            bitField0_ |= 0x00008000;
            vcm_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Relevant only for Banner objects used with a Video object
           * (Section 3.2.7) in an array of companion ads. Indicates the
           * companion banner rendering mode relative to the associated
           * video, where 0 = concurrent, 1 = end-card.
           * </pre>
           *
           * <code>optional bool vcm = 16;</code>
           * @return This builder for chaining.
           */
          public Builder clearVcm() {
            bitField0_ = (bitField0_ & ~0x00008000);
            vcm_ = 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:com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner)
        }

        // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner)
        private static final com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner DEFAULT_INSTANCE;
        static {
          DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner();
        }

        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner getDefaultInstance() {
          return DEFAULT_INSTANCE;
        }

        @java.lang.Deprecated public static final com.google.protobuf.Parser<Banner>
            PARSER = new com.google.protobuf.AbstractParser<Banner>() {
          @java.lang.Override
          public Banner parsePartialFrom(
              com.google.protobuf.CodedInputStream input,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.protobuf.InvalidProtocolBufferException {
            return new Banner(input, extensionRegistry);
          }
        };

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

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

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner getDefaultInstanceForType() {
          return DEFAULT_INSTANCE;
        }

      }

      public interface VideoOrBuilder extends
          // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.BidRequest.Imp.Video)
          com.google.protobuf.GeneratedMessageV3.
              ExtendableMessageOrBuilder<Video> {

        /**
         * <pre>
         * Whitelist of content MIME types supported. Popular MIME types include,
         * but are not limited to "image/jpg", "image/gif" and
         * "application/x-shockwave-flash".
         * REQUIRED by the OpenRTB specification: at least 1 element.
         * </pre>
         *
         * <code>repeated string mimes = 1;</code>
         * @return A list containing the mimes.
         */
        java.util.List<java.lang.String>
            getMimesList();
        /**
         * <pre>
         * Whitelist of content MIME types supported. Popular MIME types include,
         * but are not limited to "image/jpg", "image/gif" and
         * "application/x-shockwave-flash".
         * REQUIRED by the OpenRTB specification: at least 1 element.
         * </pre>
         *
         * <code>repeated string mimes = 1;</code>
         * @return The count of mimes.
         */
        int getMimesCount();
        /**
         * <pre>
         * Whitelist of content MIME types supported. Popular MIME types include,
         * but are not limited to "image/jpg", "image/gif" and
         * "application/x-shockwave-flash".
         * REQUIRED by the OpenRTB specification: at least 1 element.
         * </pre>
         *
         * <code>repeated string mimes = 1;</code>
         * @param index The index of the element to return.
         * @return The mimes at the given index.
         */
        java.lang.String getMimes(int index);
        /**
         * <pre>
         * Whitelist of content MIME types supported. Popular MIME types include,
         * but are not limited to "image/jpg", "image/gif" and
         * "application/x-shockwave-flash".
         * REQUIRED by the OpenRTB specification: at least 1 element.
         * </pre>
         *
         * <code>repeated string mimes = 1;</code>
         * @param index The index of the value to return.
         * @return The bytes of the mimes at the given index.
         */
        com.google.protobuf.ByteString
            getMimesBytes(int index);

        /**
         * <pre>
         * Indicates if the impression must be linear, nonlinear, etc.
         * If none specified, assume all are allowed.
         * Refer to enum com.iabtechlab.adcom.v1.enums.LinearityMode for generic values.
         * </pre>
         *
         * <code>optional int32 linearity = 2;</code>
         * @return Whether the linearity field is set.
         */
        boolean hasLinearity();
        /**
         * <pre>
         * Indicates if the impression must be linear, nonlinear, etc.
         * If none specified, assume all are allowed.
         * Refer to enum com.iabtechlab.adcom.v1.enums.LinearityMode for generic values.
         * </pre>
         *
         * <code>optional int32 linearity = 2;</code>
         * @return The linearity.
         */
        int getLinearity();

        /**
         * <pre>
         * Minimum video ad duration in seconds.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional int32 minduration = 3;</code>
         * @return Whether the minduration field is set.
         */
        boolean hasMinduration();
        /**
         * <pre>
         * Minimum video ad duration in seconds.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional int32 minduration = 3;</code>
         * @return The minduration.
         */
        int getMinduration();

        /**
         * <pre>
         * Maximum video ad duration in seconds.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional int32 maxduration = 4;</code>
         * @return Whether the maxduration field is set.
         */
        boolean hasMaxduration();
        /**
         * <pre>
         * Maximum video ad duration in seconds.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional int32 maxduration = 4;</code>
         * @return The maxduration.
         */
        int getMaxduration();

        /**
         * <pre>
         * Deprecated; use protocols.
         * Refer to enum com.iabtechlab.adcom.v1.Creative.AudioVideoType for generic values.
         * </pre>
         *
         * <code>optional int32 protocol = 5 [deprecated = true];</code>
         * @return Whether the protocol field is set.
         */
        @java.lang.Deprecated boolean hasProtocol();
        /**
         * <pre>
         * Deprecated; use protocols.
         * Refer to enum com.iabtechlab.adcom.v1.Creative.AudioVideoType for generic values.
         * </pre>
         *
         * <code>optional int32 protocol = 5 [deprecated = true];</code>
         * @return The protocol.
         */
        @java.lang.Deprecated int getProtocol();

        /**
         * <pre>
         * Array of supported video bid response protocols.
         * At least one supported protocol must be specified.
         * Refer to enum com.iabtechlab.adcom.v1.Creative.AudioVideoType for generic values.
         * </pre>
         *
         * <code>repeated int32 protocols = 21 [packed = true];</code>
         * @return A list containing the protocols.
         */
        java.util.List<java.lang.Integer> getProtocolsList();
        /**
         * <pre>
         * Array of supported video bid response protocols.
         * At least one supported protocol must be specified.
         * Refer to enum com.iabtechlab.adcom.v1.Creative.AudioVideoType for generic values.
         * </pre>
         *
         * <code>repeated int32 protocols = 21 [packed = true];</code>
         * @return The count of protocols.
         */
        int getProtocolsCount();
        /**
         * <pre>
         * Array of supported video bid response protocols.
         * At least one supported protocol must be specified.
         * Refer to enum com.iabtechlab.adcom.v1.Creative.AudioVideoType for generic values.
         * </pre>
         *
         * <code>repeated int32 protocols = 21 [packed = true];</code>
         * @param index The index of the element to return.
         * @return The protocols at the given index.
         */
        int getProtocols(int index);

        /**
         * <pre>
         * Width of the video player in device independent pixels (DIPS).
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional int32 w = 6;</code>
         * @return Whether the w field is set.
         */
        boolean hasW();
        /**
         * <pre>
         * Width of the video player in device independent pixels (DIPS).
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional int32 w = 6;</code>
         * @return The w.
         */
        int getW();

        /**
         * <pre>
         * Height of the video player in device independent pixels (DIPS).
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional int32 h = 7;</code>
         * @return Whether the h field is set.
         */
        boolean hasH();
        /**
         * <pre>
         * Height of the video player in device independent pixels (DIPS).
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional int32 h = 7;</code>
         * @return The h.
         */
        int getH();

        /**
         * <pre>
         * Indicates the start delay in seconds for pre-roll, mid-roll, or
         * post-roll ad placements.
         * Refer to enum com.iabtechlab.adcom.v1.StartDelayMode for generic values.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional int32 startdelay = 8;</code>
         * @return Whether the startdelay field is set.
         */
        boolean hasStartdelay();
        /**
         * <pre>
         * Indicates the start delay in seconds for pre-roll, mid-roll, or
         * post-roll ad placements.
         * Refer to enum com.iabtechlab.adcom.v1.StartDelayMode for generic values.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional int32 startdelay = 8;</code>
         * @return The startdelay.
         */
        int getStartdelay();

        /**
         * <pre>
         * Indicates the maximum number of ads that may be served into a
         * “dynamic” video ad pod (where the precise number of ads is not
         * predetermined by the seller).
         * </pre>
         *
         * <code>optional int32 maxseq = 28;</code>
         * @return Whether the maxseq field is set.
         */
        boolean hasMaxseq();
        /**
         * <pre>
         * Indicates the maximum number of ads that may be served into a
         * “dynamic” video ad pod (where the precise number of ads is not
         * predetermined by the seller).
         * </pre>
         *
         * <code>optional int32 maxseq = 28;</code>
         * @return The maxseq.
         */
        int getMaxseq();

        /**
         * <pre>
         * Indicates the total amount of time in seconds that advertisers may
         * fill for a “dynamic” video ad pod (See Section 7.6 for more details),
         * or the dynamic portion of a “hybrid” ad pod. This field is required
         * only for the dynamic portion(s) of video ad pods. This field refers to
         * the length of the entire ad break, whereas
         * minduration/maxduration/rqddurs are constraints relating to the slots
         * that make up the pod.
         * </pre>
         *
         * <code>optional int32 poddur = 29;</code>
         * @return Whether the poddur field is set.
         */
        boolean hasPoddur();
        /**
         * <pre>
         * Indicates the total amount of time in seconds that advertisers may
         * fill for a “dynamic” video ad pod (See Section 7.6 for more details),
         * or the dynamic portion of a “hybrid” ad pod. This field is required
         * only for the dynamic portion(s) of video ad pods. This field refers to
         * the length of the entire ad break, whereas
         * minduration/maxduration/rqddurs are constraints relating to the slots
         * that make up the pod.
         * </pre>
         *
         * <code>optional int32 poddur = 29;</code>
         * @return The poddur.
         */
        int getPoddur();

        /**
         * <pre>
         * Indicates if the player will allow the video to be skipped,
         * where 0 = no, 1 = yes.
         * If a bidder sends markup/creative that is itself skippable, the
         * Bid object should include the attr array with an element of
         * 16 indicating skippable video.
         * </pre>
         *
         * <code>optional bool skip = 23;</code>
         * @return Whether the skip field is set.
         */
        boolean hasSkip();
        /**
         * <pre>
         * Indicates if the player will allow the video to be skipped,
         * where 0 = no, 1 = yes.
         * If a bidder sends markup/creative that is itself skippable, the
         * Bid object should include the attr array with an element of
         * 16 indicating skippable video.
         * </pre>
         *
         * <code>optional bool skip = 23;</code>
         * @return The skip.
         */
        boolean getSkip();

        /**
         * <pre>
         * Videos of total duration greater than this number of seconds
         * can be skippable; only applicable if the ad is skippable.
         * </pre>
         *
         * <code>optional int32 skipmin = 24;</code>
         * @return Whether the skipmin field is set.
         */
        boolean hasSkipmin();
        /**
         * <pre>
         * Videos of total duration greater than this number of seconds
         * can be skippable; only applicable if the ad is skippable.
         * </pre>
         *
         * <code>optional int32 skipmin = 24;</code>
         * @return The skipmin.
         */
        int getSkipmin();

        /**
         * <pre>
         * Number of seconds a video must play before skipping is
         * enabled; only applicable if the ad is skippable.
         * </pre>
         *
         * <code>optional int32 skipafter = 25;</code>
         * @return Whether the skipafter field is set.
         */
        boolean hasSkipafter();
        /**
         * <pre>
         * Number of seconds a video must play before skipping is
         * enabled; only applicable if the ad is skippable.
         * </pre>
         *
         * <code>optional int32 skipafter = 25;</code>
         * @return The skipafter.
         */
        int getSkipafter();

        /**
         * <pre>
         * If multiple ad impressions are offered in the same bid request,
         * the sequence number will allow for the coordinated delivery of
         * multiple creatives.
         * </pre>
         *
         * <code>optional int32 sequence = 9 [default = 1, deprecated = true];</code>
         * @return Whether the sequence field is set.
         */
        @java.lang.Deprecated boolean hasSequence();
        /**
         * <pre>
         * If multiple ad impressions are offered in the same bid request,
         * the sequence number will allow for the coordinated delivery of
         * multiple creatives.
         * </pre>
         *
         * <code>optional int32 sequence = 9 [default = 1, deprecated = true];</code>
         * @return The sequence.
         */
        @java.lang.Deprecated int getSequence();

        /**
         * <pre>
         * For video ad pods, this value indicates that the seller can guarantee
         * delivery against the indicated slot position in the pod.
         * </pre>
         *
         * <code>optional int32 slotinpod = 33 [default = 0];</code>
         * @return Whether the slotinpod field is set.
         */
        boolean hasSlotinpod();
        /**
         * <pre>
         * For video ad pods, this value indicates that the seller can guarantee
         * delivery against the indicated slot position in the pod.
         * </pre>
         *
         * <code>optional int32 slotinpod = 33 [default = 0];</code>
         * @return The slotinpod.
         */
        int getSlotinpod();

        /**
         * <pre>
         * Minimum CPM per second. This is a price floor for the "dynamic"
         * portion of a video ad pod, relative to the duration of bids an
         * advertiser may submit.
         * </pre>
         *
         * <code>optional double mincpmpersec = 34;</code>
         * @return Whether the mincpmpersec field is set.
         */
        boolean hasMincpmpersec();
        /**
         * <pre>
         * Minimum CPM per second. This is a price floor for the "dynamic"
         * portion of a video ad pod, relative to the duration of bids an
         * advertiser may submit.
         * </pre>
         *
         * <code>optional double mincpmpersec = 34;</code>
         * @return The mincpmpersec.
         */
        double getMincpmpersec();

        /**
         * <pre>
         * Blocked creative attributes.
         * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
         * </pre>
         *
         * <code>repeated int32 battr = 10 [packed = true];</code>
         * @return A list containing the battr.
         */
        java.util.List<java.lang.Integer> getBattrList();
        /**
         * <pre>
         * Blocked creative attributes.
         * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
         * </pre>
         *
         * <code>repeated int32 battr = 10 [packed = true];</code>
         * @return The count of battr.
         */
        int getBattrCount();
        /**
         * <pre>
         * Blocked creative attributes.
         * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
         * </pre>
         *
         * <code>repeated int32 battr = 10 [packed = true];</code>
         * @param index The index of the element to return.
         * @return The battr at the given index.
         */
        int getBattr(int index);

        /**
         * <pre>
         * Maximum extended video ad duration, if extension is allowed.
         * If blank or 0, extension is not allowed. If -1, extension is allowed,
         * and there is no time limit imposed. If greater than 0, then the value
         * represents the number of seconds of extended play supported beyond
         * the maxduration value.
         * </pre>
         *
         * <code>optional int32 maxextended = 11;</code>
         * @return Whether the maxextended field is set.
         */
        boolean hasMaxextended();
        /**
         * <pre>
         * Maximum extended video ad duration, if extension is allowed.
         * If blank or 0, extension is not allowed. If -1, extension is allowed,
         * and there is no time limit imposed. If greater than 0, then the value
         * represents the number of seconds of extended play supported beyond
         * the maxduration value.
         * </pre>
         *
         * <code>optional int32 maxextended = 11;</code>
         * @return The maxextended.
         */
        int getMaxextended();

        /**
         * <pre>
         * Minimum bit rate in Kbps.
         * </pre>
         *
         * <code>optional int32 minbitrate = 12;</code>
         * @return Whether the minbitrate field is set.
         */
        boolean hasMinbitrate();
        /**
         * <pre>
         * Minimum bit rate in Kbps.
         * </pre>
         *
         * <code>optional int32 minbitrate = 12;</code>
         * @return The minbitrate.
         */
        int getMinbitrate();

        /**
         * <pre>
         * Maximum bit rate in Kbps.
         * </pre>
         *
         * <code>optional int32 maxbitrate = 13;</code>
         * @return Whether the maxbitrate field is set.
         */
        boolean hasMaxbitrate();
        /**
         * <pre>
         * Maximum bit rate in Kbps.
         * </pre>
         *
         * <code>optional int32 maxbitrate = 13;</code>
         * @return The maxbitrate.
         */
        int getMaxbitrate();

        /**
         * <pre>
         * Indicates if letter-boxing of 4:3 content into a 16:9 window is
         * allowed, where 0 = no, 1 = yes.
         * </pre>
         *
         * <code>optional bool boxingallowed = 14 [default = true];</code>
         * @return Whether the boxingallowed field is set.
         */
        boolean hasBoxingallowed();
        /**
         * <pre>
         * Indicates if letter-boxing of 4:3 content into a 16:9 window is
         * allowed, where 0 = no, 1 = yes.
         * </pre>
         *
         * <code>optional bool boxingallowed = 14 [default = true];</code>
         * @return The boxingallowed.
         */
        boolean getBoxingallowed();

        /**
         * <pre>
         * Playback methods that may be in use. If none are specified, any
         * method may be used. Only one method is typically used in practice.
         * As a result, this array may be converted to an integer in a future
         * version of the specification. It is strongly advised to use only
         * the first element of this array in preparation for this change.
         * Refer to enum com.iabtechlab.adcom.v1.PlaybackMethod for generic values.
         * </pre>
         *
         * <code>repeated int32 playbackmethod = 15 [packed = true];</code>
         * @return A list containing the playbackmethod.
         */
        java.util.List<java.lang.Integer> getPlaybackmethodList();
        /**
         * <pre>
         * Playback methods that may be in use. If none are specified, any
         * method may be used. Only one method is typically used in practice.
         * As a result, this array may be converted to an integer in a future
         * version of the specification. It is strongly advised to use only
         * the first element of this array in preparation for this change.
         * Refer to enum com.iabtechlab.adcom.v1.PlaybackMethod for generic values.
         * </pre>
         *
         * <code>repeated int32 playbackmethod = 15 [packed = true];</code>
         * @return The count of playbackmethod.
         */
        int getPlaybackmethodCount();
        /**
         * <pre>
         * Playback methods that may be in use. If none are specified, any
         * method may be used. Only one method is typically used in practice.
         * As a result, this array may be converted to an integer in a future
         * version of the specification. It is strongly advised to use only
         * the first element of this array in preparation for this change.
         * Refer to enum com.iabtechlab.adcom.v1.PlaybackMethod for generic values.
         * </pre>
         *
         * <code>repeated int32 playbackmethod = 15 [packed = true];</code>
         * @param index The index of the element to return.
         * @return The playbackmethod at the given index.
         */
        int getPlaybackmethod(int index);

        /**
         * <pre>
         * Supported delivery methods (e.g., streaming, progressive).
         * If none specified, assume all are supported.
         * Refer to enum com.iabtechlab.adcom.v1.enums.DeliveryMethod for generic values.
         * </pre>
         *
         * <code>repeated int32 delivery = 16 [packed = true];</code>
         * @return A list containing the delivery.
         */
        java.util.List<java.lang.Integer> getDeliveryList();
        /**
         * <pre>
         * Supported delivery methods (e.g., streaming, progressive).
         * If none specified, assume all are supported.
         * Refer to enum com.iabtechlab.adcom.v1.enums.DeliveryMethod for generic values.
         * </pre>
         *
         * <code>repeated int32 delivery = 16 [packed = true];</code>
         * @return The count of delivery.
         */
        int getDeliveryCount();
        /**
         * <pre>
         * Supported delivery methods (e.g., streaming, progressive).
         * If none specified, assume all are supported.
         * Refer to enum com.iabtechlab.adcom.v1.enums.DeliveryMethod for generic values.
         * </pre>
         *
         * <code>repeated int32 delivery = 16 [packed = true];</code>
         * @param index The index of the element to return.
         * @return The delivery at the given index.
         */
        int getDelivery(int index);

        /**
         * <pre>
         * Ad position on screen.
         * Refer to enum com.iabtechlab.adcom.v1.PlacementPosition for generic values.
         * </pre>
         *
         * <code>optional int32 pos = 17;</code>
         * @return Whether the pos field is set.
         */
        boolean hasPos();
        /**
         * <pre>
         * Ad position on screen.
         * Refer to enum com.iabtechlab.adcom.v1.PlacementPosition for generic values.
         * </pre>
         *
         * <code>optional int32 pos = 17;</code>
         * @return The pos.
         */
        int getPos();

        /**
         * <pre>
         * Array of Banner objects (Section 3.2.3) if companion ads are available.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 18;</code>
         */
        java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner> 
            getCompanionadList();
        /**
         * <pre>
         * Array of Banner objects (Section 3.2.3) if companion ads are available.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 18;</code>
         */
        com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner getCompanionad(int index);
        /**
         * <pre>
         * Array of Banner objects (Section 3.2.3) if companion ads are available.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 18;</code>
         */
        int getCompanionadCount();
        /**
         * <pre>
         * Array of Banner objects (Section 3.2.3) if companion ads are available.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 18;</code>
         */
        java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.BannerOrBuilder> 
            getCompanionadOrBuilderList();
        /**
         * <pre>
         * Array of Banner objects (Section 3.2.3) if companion ads are available.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 18;</code>
         */
        com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.BannerOrBuilder getCompanionadOrBuilder(
            int index);

        /**
         * <pre>
         * Companion ads in OpenRTB 2.1 format. (Or to be precise, interpretations
         * based on the buggy sample message in 5.1.4, fixed later in 2.2.)
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Video.CompanionAd companionad_21 = 22 [deprecated = true];</code>
         * @return Whether the companionad21 field is set.
         */
        @java.lang.Deprecated boolean hasCompanionad21();
        /**
         * <pre>
         * Companion ads in OpenRTB 2.1 format. (Or to be precise, interpretations
         * based on the buggy sample message in 5.1.4, fixed later in 2.2.)
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Video.CompanionAd companionad_21 = 22 [deprecated = true];</code>
         * @return The companionad21.
         */
        @java.lang.Deprecated com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd getCompanionad21();
        /**
         * <pre>
         * Companion ads in OpenRTB 2.1 format. (Or to be precise, interpretations
         * based on the buggy sample message in 5.1.4, fixed later in 2.2.)
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Video.CompanionAd companionad_21 = 22 [deprecated = true];</code>
         */
        @java.lang.Deprecated com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAdOrBuilder getCompanionad21OrBuilder();

        /**
         * <pre>
         * List of supported API frameworks for this impression.
         * If an API is not explicitly listed, it is assumed not to be supported.
         * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
         * </pre>
         *
         * <code>repeated int32 api = 19 [packed = true];</code>
         * @return A list containing the api.
         */
        java.util.List<java.lang.Integer> getApiList();
        /**
         * <pre>
         * List of supported API frameworks for this impression.
         * If an API is not explicitly listed, it is assumed not to be supported.
         * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
         * </pre>
         *
         * <code>repeated int32 api = 19 [packed = true];</code>
         * @return The count of api.
         */
        int getApiCount();
        /**
         * <pre>
         * List of supported API frameworks for this impression.
         * If an API is not explicitly listed, it is assumed not to be supported.
         * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
         * </pre>
         *
         * <code>repeated int32 api = 19 [packed = true];</code>
         * @param index The index of the element to return.
         * @return The api at the given index.
         */
        int getApi(int index);

        /**
         * <pre>
         * Supported VAST companion ad types.  Recommended if companion Banner
         * objects are included via the companionad array.
         * Refer to enum com.iabtechlab.adcom.v1.CompanionType for generic values.
         * </pre>
         *
         * <code>repeated int32 companiontype = 20 [packed = true];</code>
         * @return A list containing the companiontype.
         */
        java.util.List<java.lang.Integer> getCompaniontypeList();
        /**
         * <pre>
         * Supported VAST companion ad types.  Recommended if companion Banner
         * objects are included via the companionad array.
         * Refer to enum com.iabtechlab.adcom.v1.CompanionType for generic values.
         * </pre>
         *
         * <code>repeated int32 companiontype = 20 [packed = true];</code>
         * @return The count of companiontype.
         */
        int getCompaniontypeCount();
        /**
         * <pre>
         * Supported VAST companion ad types.  Recommended if companion Banner
         * objects are included via the companionad array.
         * Refer to enum com.iabtechlab.adcom.v1.CompanionType for generic values.
         * </pre>
         *
         * <code>repeated int32 companiontype = 20 [packed = true];</code>
         * @param index The index of the element to return.
         * @return The companiontype at the given index.
         */
        int getCompaniontype(int index);

        /**
         * <pre>
         * Unique identifier indicating that an impression opportunity belongs to
         * a video ad pod. If multiple impression opportunities within a bid
         * request share the same podid, this indicates that those impression
         * opportunities belong to the same video ad pod.
         * </pre>
         *
         * <code>optional string podid = 30;</code>
         * @return Whether the podid field is set.
         */
        boolean hasPodid();
        /**
         * <pre>
         * Unique identifier indicating that an impression opportunity belongs to
         * a video ad pod. If multiple impression opportunities within a bid
         * request share the same podid, this indicates that those impression
         * opportunities belong to the same video ad pod.
         * </pre>
         *
         * <code>optional string podid = 30;</code>
         * @return The podid.
         */
        java.lang.String getPodid();
        /**
         * <pre>
         * Unique identifier indicating that an impression opportunity belongs to
         * a video ad pod. If multiple impression opportunities within a bid
         * request share the same podid, this indicates that those impression
         * opportunities belong to the same video ad pod.
         * </pre>
         *
         * <code>optional string podid = 30;</code>
         * @return The bytes for podid.
         */
        com.google.protobuf.ByteString
            getPodidBytes();

        /**
         * <pre>
         * The sequence (position) of the video ad pod within a content stream.
         * </pre>
         *
         * <code>optional int32 podseq = 31 [default = 0];</code>
         * @return Whether the podseq field is set.
         */
        boolean hasPodseq();
        /**
         * <pre>
         * The sequence (position) of the video ad pod within a content stream.
         * </pre>
         *
         * <code>optional int32 podseq = 31 [default = 0];</code>
         * @return The podseq.
         */
        int getPodseq();

        /**
         * <pre>
         * Precise acceptable durations for video creatives in seconds. This
         * field specifically targets the Live TV use case where non-exact ad
         * durations would result in undesirable ‘dead air’. This field is
         * mutually exclusive with minduration and maxduration; if rqddurs is
         * specified, minduration and maxduration must not be specified and vice
         * versa.
         * </pre>
         *
         * <code>repeated int32 rqddurs = 32 [packed = true];</code>
         * @return A list containing the rqddurs.
         */
        java.util.List<java.lang.Integer> getRqddursList();
        /**
         * <pre>
         * Precise acceptable durations for video creatives in seconds. This
         * field specifically targets the Live TV use case where non-exact ad
         * durations would result in undesirable ‘dead air’. This field is
         * mutually exclusive with minduration and maxduration; if rqddurs is
         * specified, minduration and maxduration must not be specified and vice
         * versa.
         * </pre>
         *
         * <code>repeated int32 rqddurs = 32 [packed = true];</code>
         * @return The count of rqddurs.
         */
        int getRqddursCount();
        /**
         * <pre>
         * Precise acceptable durations for video creatives in seconds. This
         * field specifically targets the Live TV use case where non-exact ad
         * durations would result in undesirable ‘dead air’. This field is
         * mutually exclusive with minduration and maxduration; if rqddurs is
         * specified, minduration and maxduration must not be specified and vice
         * versa.
         * </pre>
         *
         * <code>repeated int32 rqddurs = 32 [packed = true];</code>
         * @param index The index of the element to return.
         * @return The rqddurs at the given index.
         */
        int getRqddurs(int index);

        /**
         * <pre>
         * Placement type for the impression.
         * Refer to enum com.iabtechlab.adcom.v1.VideoPlacementSubtype for generic values.
         * </pre>
         *
         * <code>optional int32 placement = 26 [deprecated = true];</code>
         * @return Whether the placement field is set.
         */
        @java.lang.Deprecated boolean hasPlacement();
        /**
         * <pre>
         * Placement type for the impression.
         * Refer to enum com.iabtechlab.adcom.v1.VideoPlacementSubtype for generic values.
         * </pre>
         *
         * <code>optional int32 placement = 26 [deprecated = true];</code>
         * @return The placement.
         */
        @java.lang.Deprecated int getPlacement();

        /**
         * <pre>
         * Video placement type for the impression.
         * Refer to enum com.iabtechlab.adcom.v1.VideoPlcmtSubtype for generic values.
         * </pre>
         *
         * <code>optional int32 plcmt = 35;</code>
         * @return Whether the plcmt field is set.
         */
        boolean hasPlcmt();
        /**
         * <pre>
         * Video placement type for the impression.
         * Refer to enum com.iabtechlab.adcom.v1.VideoPlcmtSubtype for generic values.
         * </pre>
         *
         * <code>optional int32 plcmt = 35;</code>
         * @return The plcmt.
         */
        int getPlcmt();

        /**
         * <pre>
         * The event that causes playback to end.
         * Refer to enum com.iabtechlab.adcom.v1.PlaybackCessationMode for generic values.
         * </pre>
         *
         * <code>optional int32 playbackend = 27;</code>
         * @return Whether the playbackend field is set.
         */
        boolean hasPlaybackend();
        /**
         * <pre>
         * The event that causes playback to end.
         * Refer to enum com.iabtechlab.adcom.v1.PlaybackCessationMode for generic values.
         * </pre>
         *
         * <code>optional int32 playbackend = 27;</code>
         * @return The playbackend.
         */
        int getPlaybackend();
      }
      /**
       * <pre>
       * OpenRTB 2.0: This object represents an in-stream video impression.
       * Many of the fields are non-essential for minimally viable transactions,
       * but are included to offer fine control when needed. Video in OpenRTB
       * generally assumes compliance with the VAST standard. As such, the notion
       * of companion ads is supported by optionally including an array of Banner
       * objects (refer to the Banner object in Section 3.2.3) that define these
       * companion ads.
       * The presence of a Video as a subordinate of the Imp object indicates
       * that this impression is offered as a video type impression. At the
       * publisher's discretion, that same impression may also be offered as
       * banner and/or native by also including as Imp subordinates the Banner
       * and/or Native objects, respectively. However, any given bid for the
       * impression must conform to one of the offered types.
       * </pre>
       *
       * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Imp.Video}
       */
      public static final class Video extends
          com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
            Video> implements
          // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.BidRequest.Imp.Video)
          VideoOrBuilder {
      private static final long serialVersionUID = 0L;
        // Use Video.newBuilder() to construct.
        private Video(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video, ?> builder) {
          super(builder);
        }
        private Video() {
          mimes_ = com.google.protobuf.LazyStringArrayList.EMPTY;
          protocols_ = emptyIntList();
          sequence_ = 1;
          battr_ = emptyIntList();
          boxingallowed_ = true;
          playbackmethod_ = emptyIntList();
          delivery_ = emptyIntList();
          companionad_ = java.util.Collections.emptyList();
          api_ = emptyIntList();
          companiontype_ = emptyIntList();
          podid_ = "";
          rqddurs_ = emptyIntList();
        }

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

        @java.lang.Override
        public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
          return this.unknownFields;
        }
        private Video(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          this();
          if (extensionRegistry == null) {
            throw new java.lang.NullPointerException();
          }
          int mutable_bitField0_ = 0;
          int mutable_bitField1_ = 0;
          com.google.protobuf.UnknownFieldSet.Builder unknownFields =
              com.google.protobuf.UnknownFieldSet.newBuilder();
          try {
            boolean done = false;
            while (!done) {
              int tag = input.readTag();
              switch (tag) {
                case 0:
                  done = true;
                  break;
                case 10: {
                  com.google.protobuf.ByteString bs = input.readBytes();
                  if (!((mutable_bitField0_ & 0x00000001) != 0)) {
                    mimes_ = new com.google.protobuf.LazyStringArrayList();
                    mutable_bitField0_ |= 0x00000001;
                  }
                  mimes_.add(bs);
                  break;
                }
                case 16: {
                  bitField0_ |= 0x00000001;
                  linearity_ = input.readInt32();
                  break;
                }
                case 24: {
                  bitField0_ |= 0x00000002;
                  minduration_ = input.readInt32();
                  break;
                }
                case 32: {
                  bitField0_ |= 0x00000004;
                  maxduration_ = input.readInt32();
                  break;
                }
                case 40: {
                  bitField0_ |= 0x00000008;
                  protocol_ = input.readInt32();
                  break;
                }
                case 48: {
                  bitField0_ |= 0x00000010;
                  w_ = input.readInt32();
                  break;
                }
                case 56: {
                  bitField0_ |= 0x00000020;
                  h_ = input.readInt32();
                  break;
                }
                case 64: {
                  bitField0_ |= 0x00000040;
                  startdelay_ = input.readInt32();
                  break;
                }
                case 72: {
                  bitField0_ |= 0x00001000;
                  sequence_ = input.readInt32();
                  break;
                }
                case 80: {
                  if (!((mutable_bitField0_ & 0x00020000) != 0)) {
                    battr_ = newIntList();
                    mutable_bitField0_ |= 0x00020000;
                  }
                  battr_.addInt(input.readInt32());
                  break;
                }
                case 82: {
                  int length = input.readRawVarint32();
                  int limit = input.pushLimit(length);
                  if (!((mutable_bitField0_ & 0x00020000) != 0) && input.getBytesUntilLimit() > 0) {
                    battr_ = newIntList();
                    mutable_bitField0_ |= 0x00020000;
                  }
                  while (input.getBytesUntilLimit() > 0) {
                    battr_.addInt(input.readInt32());
                  }
                  input.popLimit(limit);
                  break;
                }
                case 88: {
                  bitField0_ |= 0x00008000;
                  maxextended_ = input.readInt32();
                  break;
                }
                case 96: {
                  bitField0_ |= 0x00010000;
                  minbitrate_ = input.readInt32();
                  break;
                }
                case 104: {
                  bitField0_ |= 0x00020000;
                  maxbitrate_ = input.readInt32();
                  break;
                }
                case 112: {
                  bitField0_ |= 0x00040000;
                  boxingallowed_ = input.readBool();
                  break;
                }
                case 120: {
                  if (!((mutable_bitField0_ & 0x00400000) != 0)) {
                    playbackmethod_ = newIntList();
                    mutable_bitField0_ |= 0x00400000;
                  }
                  playbackmethod_.addInt(input.readInt32());
                  break;
                }
                case 122: {
                  int length = input.readRawVarint32();
                  int limit = input.pushLimit(length);
                  if (!((mutable_bitField0_ & 0x00400000) != 0) && input.getBytesUntilLimit() > 0) {
                    playbackmethod_ = newIntList();
                    mutable_bitField0_ |= 0x00400000;
                  }
                  while (input.getBytesUntilLimit() > 0) {
                    playbackmethod_.addInt(input.readInt32());
                  }
                  input.popLimit(limit);
                  break;
                }
                case 128: {
                  if (!((mutable_bitField0_ & 0x00800000) != 0)) {
                    delivery_ = newIntList();
                    mutable_bitField0_ |= 0x00800000;
                  }
                  delivery_.addInt(input.readInt32());
                  break;
                }
                case 130: {
                  int length = input.readRawVarint32();
                  int limit = input.pushLimit(length);
                  if (!((mutable_bitField0_ & 0x00800000) != 0) && input.getBytesUntilLimit() > 0) {
                    delivery_ = newIntList();
                    mutable_bitField0_ |= 0x00800000;
                  }
                  while (input.getBytesUntilLimit() > 0) {
                    delivery_.addInt(input.readInt32());
                  }
                  input.popLimit(limit);
                  break;
                }
                case 136: {
                  bitField0_ |= 0x00080000;
                  pos_ = input.readInt32();
                  break;
                }
                case 146: {
                  if (!((mutable_bitField0_ & 0x02000000) != 0)) {
                    companionad_ = new java.util.ArrayList<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner>();
                    mutable_bitField0_ |= 0x02000000;
                  }
                  companionad_.add(
                      input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.PARSER, extensionRegistry));
                  break;
                }
                case 152: {
                  if (!((mutable_bitField0_ & 0x08000000) != 0)) {
                    api_ = newIntList();
                    mutable_bitField0_ |= 0x08000000;
                  }
                  api_.addInt(input.readInt32());
                  break;
                }
                case 154: {
                  int length = input.readRawVarint32();
                  int limit = input.pushLimit(length);
                  if (!((mutable_bitField0_ & 0x08000000) != 0) && input.getBytesUntilLimit() > 0) {
                    api_ = newIntList();
                    mutable_bitField0_ |= 0x08000000;
                  }
                  while (input.getBytesUntilLimit() > 0) {
                    api_.addInt(input.readInt32());
                  }
                  input.popLimit(limit);
                  break;
                }
                case 160: {
                  if (!((mutable_bitField0_ & 0x10000000) != 0)) {
                    companiontype_ = newIntList();
                    mutable_bitField0_ |= 0x10000000;
                  }
                  companiontype_.addInt(input.readInt32());
                  break;
                }
                case 162: {
                  int length = input.readRawVarint32();
                  int limit = input.pushLimit(length);
                  if (!((mutable_bitField0_ & 0x10000000) != 0) && input.getBytesUntilLimit() > 0) {
                    companiontype_ = newIntList();
                    mutable_bitField0_ |= 0x10000000;
                  }
                  while (input.getBytesUntilLimit() > 0) {
                    companiontype_.addInt(input.readInt32());
                  }
                  input.popLimit(limit);
                  break;
                }
                case 168: {
                  if (!((mutable_bitField0_ & 0x00000020) != 0)) {
                    protocols_ = newIntList();
                    mutable_bitField0_ |= 0x00000020;
                  }
                  protocols_.addInt(input.readInt32());
                  break;
                }
                case 170: {
                  int length = input.readRawVarint32();
                  int limit = input.pushLimit(length);
                  if (!((mutable_bitField0_ & 0x00000020) != 0) && input.getBytesUntilLimit() > 0) {
                    protocols_ = newIntList();
                    mutable_bitField0_ |= 0x00000020;
                  }
                  while (input.getBytesUntilLimit() > 0) {
                    protocols_.addInt(input.readInt32());
                  }
                  input.popLimit(limit);
                  break;
                }
                case 178: {
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd.Builder subBuilder = null;
                  if (((bitField0_ & 0x00100000) != 0)) {
                    subBuilder = companionad21_.toBuilder();
                  }
                  companionad21_ = input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd.PARSER, extensionRegistry);
                  if (subBuilder != null) {
                    subBuilder.mergeFrom(companionad21_);
                    companionad21_ = subBuilder.buildPartial();
                  }
                  bitField0_ |= 0x00100000;
                  break;
                }
                case 184: {
                  bitField0_ |= 0x00000200;
                  skip_ = input.readBool();
                  break;
                }
                case 192: {
                  bitField0_ |= 0x00000400;
                  skipmin_ = input.readInt32();
                  break;
                }
                case 200: {
                  bitField0_ |= 0x00000800;
                  skipafter_ = input.readInt32();
                  break;
                }
                case 208: {
                  bitField0_ |= 0x00800000;
                  placement_ = input.readInt32();
                  break;
                }
                case 216: {
                  bitField0_ |= 0x02000000;
                  playbackend_ = input.readInt32();
                  break;
                }
                case 224: {
                  bitField0_ |= 0x00000080;
                  maxseq_ = input.readInt32();
                  break;
                }
                case 232: {
                  bitField0_ |= 0x00000100;
                  poddur_ = input.readInt32();
                  break;
                }
                case 242: {
                  com.google.protobuf.ByteString bs = input.readBytes();
                  bitField0_ |= 0x00200000;
                  podid_ = bs;
                  break;
                }
                case 248: {
                  bitField0_ |= 0x00400000;
                  podseq_ = input.readInt32();
                  break;
                }
                case 256: {
                  if (!((mutable_bitField0_ & 0x80000000) != 0)) {
                    rqddurs_ = newIntList();
                    mutable_bitField0_ |= 0x80000000;
                  }
                  rqddurs_.addInt(input.readInt32());
                  break;
                }
                case 258: {
                  int length = input.readRawVarint32();
                  int limit = input.pushLimit(length);
                  if (!((mutable_bitField0_ & 0x80000000) != 0) && input.getBytesUntilLimit() > 0) {
                    rqddurs_ = newIntList();
                    mutable_bitField0_ |= 0x80000000;
                  }
                  while (input.getBytesUntilLimit() > 0) {
                    rqddurs_.addInt(input.readInt32());
                  }
                  input.popLimit(limit);
                  break;
                }
                case 264: {
                  bitField0_ |= 0x00002000;
                  slotinpod_ = input.readInt32();
                  break;
                }
                case 273: {
                  bitField0_ |= 0x00004000;
                  mincpmpersec_ = input.readDouble();
                  break;
                }
                case 280: {
                  bitField0_ |= 0x01000000;
                  plcmt_ = input.readInt32();
                  break;
                }
                default: {
                  if (!parseUnknownField(
                      input, unknownFields, extensionRegistry, tag)) {
                    done = true;
                  }
                  break;
                }
              }
            }
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            throw e.setUnfinishedMessage(this);
          } catch (java.io.IOException e) {
            throw new com.google.protobuf.InvalidProtocolBufferException(
                e).setUnfinishedMessage(this);
          } finally {
            if (((mutable_bitField0_ & 0x00000001) != 0)) {
              mimes_ = mimes_.getUnmodifiableView();
            }
            if (((mutable_bitField0_ & 0x00020000) != 0)) {
              battr_.makeImmutable(); // C
            }
            if (((mutable_bitField0_ & 0x00400000) != 0)) {
              playbackmethod_.makeImmutable(); // C
            }
            if (((mutable_bitField0_ & 0x00800000) != 0)) {
              delivery_.makeImmutable(); // C
            }
            if (((mutable_bitField0_ & 0x02000000) != 0)) {
              companionad_ = java.util.Collections.unmodifiableList(companionad_);
            }
            if (((mutable_bitField0_ & 0x08000000) != 0)) {
              api_.makeImmutable(); // C
            }
            if (((mutable_bitField0_ & 0x10000000) != 0)) {
              companiontype_.makeImmutable(); // C
            }
            if (((mutable_bitField0_ & 0x00000020) != 0)) {
              protocols_.makeImmutable(); // C
            }
            if (((mutable_bitField0_ & 0x80000000) != 0)) {
              rqddurs_.makeImmutable(); // C
            }
            this.unknownFields = unknownFields.build();
            makeExtensionsImmutable();
          }
        }
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Video_descriptor;
        }

        @java.lang.Override
        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Video_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.Builder.class);
        }

        public interface CompanionAdOrBuilder extends
            // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.BidRequest.Imp.Video.CompanionAd)
            com.google.protobuf.GeneratedMessageV3.
                ExtendableMessageOrBuilder<CompanionAd> {

          /**
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner banner = 1;</code>
           */
          java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner> 
              getBannerList();
          /**
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner banner = 1;</code>
           */
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner getBanner(int index);
          /**
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner banner = 1;</code>
           */
          int getBannerCount();
          /**
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner banner = 1;</code>
           */
          java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.BannerOrBuilder> 
              getBannerOrBuilderList();
          /**
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner banner = 1;</code>
           */
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.BannerOrBuilder getBannerOrBuilder(
              int index);
        }
        /**
         * <pre>
         * OpenRTB 2.1 compatibility.
         * </pre>
         *
         * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Imp.Video.CompanionAd}
         */
        public static final class CompanionAd extends
            com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
              CompanionAd> implements
            // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.BidRequest.Imp.Video.CompanionAd)
            CompanionAdOrBuilder {
        private static final long serialVersionUID = 0L;
          // Use CompanionAd.newBuilder() to construct.
          private CompanionAd(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd, ?> builder) {
            super(builder);
          }
          private CompanionAd() {
            banner_ = java.util.Collections.emptyList();
          }

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

          @java.lang.Override
          public final com.google.protobuf.UnknownFieldSet
          getUnknownFields() {
            return this.unknownFields;
          }
          private CompanionAd(
              com.google.protobuf.CodedInputStream input,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.protobuf.InvalidProtocolBufferException {
            this();
            if (extensionRegistry == null) {
              throw new java.lang.NullPointerException();
            }
            int mutable_bitField0_ = 0;
            com.google.protobuf.UnknownFieldSet.Builder unknownFields =
                com.google.protobuf.UnknownFieldSet.newBuilder();
            try {
              boolean done = false;
              while (!done) {
                int tag = input.readTag();
                switch (tag) {
                  case 0:
                    done = true;
                    break;
                  case 10: {
                    if (!((mutable_bitField0_ & 0x00000001) != 0)) {
                      banner_ = new java.util.ArrayList<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner>();
                      mutable_bitField0_ |= 0x00000001;
                    }
                    banner_.add(
                        input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.PARSER, extensionRegistry));
                    break;
                  }
                  default: {
                    if (!parseUnknownField(
                        input, unknownFields, extensionRegistry, tag)) {
                      done = true;
                    }
                    break;
                  }
                }
              }
            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
              throw e.setUnfinishedMessage(this);
            } catch (java.io.IOException e) {
              throw new com.google.protobuf.InvalidProtocolBufferException(
                  e).setUnfinishedMessage(this);
            } finally {
              if (((mutable_bitField0_ & 0x00000001) != 0)) {
                banner_ = java.util.Collections.unmodifiableList(banner_);
              }
              this.unknownFields = unknownFields.build();
              makeExtensionsImmutable();
            }
          }
          public static final com.google.protobuf.Descriptors.Descriptor
              getDescriptor() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Video_CompanionAd_descriptor;
          }

          @java.lang.Override
          protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
              internalGetFieldAccessorTable() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Video_CompanionAd_fieldAccessorTable
                .ensureFieldAccessorsInitialized(
                    com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd.Builder.class);
          }

          public static final int BANNER_FIELD_NUMBER = 1;
          private java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner> banner_;
          /**
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner banner = 1;</code>
           */
          @java.lang.Override
          public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner> getBannerList() {
            return banner_;
          }
          /**
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner banner = 1;</code>
           */
          @java.lang.Override
          public java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.BannerOrBuilder> 
              getBannerOrBuilderList() {
            return banner_;
          }
          /**
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner banner = 1;</code>
           */
          @java.lang.Override
          public int getBannerCount() {
            return banner_.size();
          }
          /**
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner banner = 1;</code>
           */
          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner getBanner(int index) {
            return banner_.get(index);
          }
          /**
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner banner = 1;</code>
           */
          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.BannerOrBuilder getBannerOrBuilder(
              int index) {
            return banner_.get(index);
          }

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

            for (int i = 0; i < getBannerCount(); i++) {
              if (!getBanner(i).isInitialized()) {
                memoizedIsInitialized = 0;
                return false;
              }
            }
            if (!extensionsAreInitialized()) {
              memoizedIsInitialized = 0;
              return false;
            }
            memoizedIsInitialized = 1;
            return true;
          }

          @java.lang.Override
          public void writeTo(com.google.protobuf.CodedOutputStream output)
                              throws java.io.IOException {
            com.google.protobuf.GeneratedMessageV3
              .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd>.ExtensionWriter
                extensionWriter = newExtensionWriter();
            for (int i = 0; i < banner_.size(); i++) {
              output.writeMessage(1, banner_.get(i));
            }
            extensionWriter.writeUntil(10000, output);
            unknownFields.writeTo(output);
          }

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

            size = 0;
            for (int i = 0; i < banner_.size(); i++) {
              size += com.google.protobuf.CodedOutputStream
                .computeMessageSize(1, banner_.get(i));
            }
            size += extensionsSerializedSize();
            size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd)) {
              return super.equals(obj);
            }
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd other = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd) obj;

            if (!getBannerList()
                .equals(other.getBannerList())) return false;
            if (!unknownFields.equals(other.unknownFields)) return false;
            if (!getExtensionFields().equals(other.getExtensionFields()))
              return false;
            return true;
          }

          @java.lang.Override
          public int hashCode() {
            if (memoizedHashCode != 0) {
              return memoizedHashCode;
            }
            int hash = 41;
            hash = (19 * hash) + getDescriptor().hashCode();
            if (getBannerCount() > 0) {
              hash = (37 * hash) + BANNER_FIELD_NUMBER;
              hash = (53 * hash) + getBannerList().hashCode();
            }
            hash = hashFields(hash, getExtensionFields());
            hash = (29 * hash) + unknownFields.hashCode();
            memoizedHashCode = hash;
            return hash;
          }

          public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd parseFrom(
              java.nio.ByteBuffer data)
              throws com.google.protobuf.InvalidProtocolBufferException {
            return PARSER.parseFrom(data);
          }
          public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd parseFrom(
              java.nio.ByteBuffer data,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.protobuf.InvalidProtocolBufferException {
            return PARSER.parseFrom(data, extensionRegistry);
          }
          public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd parseFrom(
              com.google.protobuf.ByteString data)
              throws com.google.protobuf.InvalidProtocolBufferException {
            return PARSER.parseFrom(data);
          }
          public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd parseFrom(
              com.google.protobuf.ByteString data,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.protobuf.InvalidProtocolBufferException {
            return PARSER.parseFrom(data, extensionRegistry);
          }
          public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd parseFrom(byte[] data)
              throws com.google.protobuf.InvalidProtocolBufferException {
            return PARSER.parseFrom(data);
          }
          public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd parseFrom(
              byte[] data,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.protobuf.InvalidProtocolBufferException {
            return PARSER.parseFrom(data, extensionRegistry);
          }
          public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd parseFrom(java.io.InputStream input)
              throws java.io.IOException {
            return com.google.protobuf.GeneratedMessageV3
                .parseWithIOException(PARSER, input);
          }
          public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd parseDelimitedFrom(java.io.InputStream input)
              throws java.io.IOException {
            return com.google.protobuf.GeneratedMessageV3
                .parseDelimitedWithIOException(PARSER, input);
          }
          public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd parseFrom(
              com.google.protobuf.CodedInputStream input)
              throws java.io.IOException {
            return com.google.protobuf.GeneratedMessageV3
                .parseWithIOException(PARSER, input);
          }
          public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd 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>
           * OpenRTB 2.1 compatibility.
           * </pre>
           *
           * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Imp.Video.CompanionAd}
           */
          public static final class Builder extends
              com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd, Builder> implements
              // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.BidRequest.Imp.Video.CompanionAd)
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAdOrBuilder {
            public static final com.google.protobuf.Descriptors.Descriptor
                getDescriptor() {
              return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Video_CompanionAd_descriptor;
            }

            @java.lang.Override
            protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
                internalGetFieldAccessorTable() {
              return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Video_CompanionAd_fieldAccessorTable
                  .ensureFieldAccessorsInitialized(
                      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd.Builder.class);
            }

            // Construct using com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd.newBuilder()
            private Builder() {
              maybeForceBuilderInitialization();
            }

            private Builder(
                com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
              super(parent);
              maybeForceBuilderInitialization();
            }
            private void maybeForceBuilderInitialization() {
              if (com.google.protobuf.GeneratedMessageV3
                      .alwaysUseFieldBuilders) {
                getBannerFieldBuilder();
              }
            }
            @java.lang.Override
            public Builder clear() {
              super.clear();
              if (bannerBuilder_ == null) {
                banner_ = java.util.Collections.emptyList();
                bitField0_ = (bitField0_ & ~0x00000001);
              } else {
                bannerBuilder_.clear();
              }
              return this;
            }

            @java.lang.Override
            public com.google.protobuf.Descriptors.Descriptor
                getDescriptorForType() {
              return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Video_CompanionAd_descriptor;
            }

            @java.lang.Override
            public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd getDefaultInstanceForType() {
              return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd.getDefaultInstance();
            }

            @java.lang.Override
            public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd build() {
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd result = buildPartial();
              if (!result.isInitialized()) {
                throw newUninitializedMessageException(result);
              }
              return result;
            }

            @java.lang.Override
            public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd buildPartial() {
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd result = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd(this);
              int from_bitField0_ = bitField0_;
              if (bannerBuilder_ == null) {
                if (((bitField0_ & 0x00000001) != 0)) {
                  banner_ = java.util.Collections.unmodifiableList(banner_);
                  bitField0_ = (bitField0_ & ~0x00000001);
                }
                result.banner_ = banner_;
              } else {
                result.banner_ = bannerBuilder_.build();
              }
              onBuilt();
              return result;
            }

            @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 <Type> Builder setExtension(
                com.google.protobuf.GeneratedMessage.GeneratedExtension<
                    com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd, Type> extension,
                Type value) {
              return super.setExtension(extension, value);
            }
            @java.lang.Override
            public <Type> Builder setExtension(
                com.google.protobuf.GeneratedMessage.GeneratedExtension<
                    com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd, java.util.List<Type>> extension,
                int index, Type value) {
              return super.setExtension(extension, index, value);
            }
            @java.lang.Override
            public <Type> Builder addExtension(
                com.google.protobuf.GeneratedMessage.GeneratedExtension<
                    com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd, java.util.List<Type>> extension,
                Type value) {
              return super.addExtension(extension, value);
            }
            @java.lang.Override
            public <Type> Builder clearExtension(
                com.google.protobuf.GeneratedMessage.GeneratedExtension<
                    com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd, ?> extension) {
              return super.clearExtension(extension);
            }
            @java.lang.Override
            public Builder mergeFrom(com.google.protobuf.Message other) {
              if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd) {
                return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd)other);
              } else {
                super.mergeFrom(other);
                return this;
              }
            }

            public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd other) {
              if (other == com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd.getDefaultInstance()) return this;
              if (bannerBuilder_ == null) {
                if (!other.banner_.isEmpty()) {
                  if (banner_.isEmpty()) {
                    banner_ = other.banner_;
                    bitField0_ = (bitField0_ & ~0x00000001);
                  } else {
                    ensureBannerIsMutable();
                    banner_.addAll(other.banner_);
                  }
                  onChanged();
                }
              } else {
                if (!other.banner_.isEmpty()) {
                  if (bannerBuilder_.isEmpty()) {
                    bannerBuilder_.dispose();
                    bannerBuilder_ = null;
                    banner_ = other.banner_;
                    bitField0_ = (bitField0_ & ~0x00000001);
                    bannerBuilder_ = 
                      com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
                         getBannerFieldBuilder() : null;
                  } else {
                    bannerBuilder_.addAllMessages(other.banner_);
                  }
                }
              }
              this.mergeExtensionFields(other);
              this.mergeUnknownFields(other.unknownFields);
              onChanged();
              return this;
            }

            @java.lang.Override
            public final boolean isInitialized() {
              for (int i = 0; i < getBannerCount(); i++) {
                if (!getBanner(i).isInitialized()) {
                  return false;
                }
              }
              if (!extensionsAreInitialized()) {
                return false;
              }
              return true;
            }

            @java.lang.Override
            public Builder mergeFrom(
                com.google.protobuf.CodedInputStream input,
                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
                throws java.io.IOException {
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd parsedMessage = null;
              try {
                parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
              } catch (com.google.protobuf.InvalidProtocolBufferException e) {
                parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd) e.getUnfinishedMessage();
                throw e.unwrapIOException();
              } finally {
                if (parsedMessage != null) {
                  mergeFrom(parsedMessage);
                }
              }
              return this;
            }
            private int bitField0_;

            private java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner> banner_ =
              java.util.Collections.emptyList();
            private void ensureBannerIsMutable() {
              if (!((bitField0_ & 0x00000001) != 0)) {
                banner_ = new java.util.ArrayList<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner>(banner_);
                bitField0_ |= 0x00000001;
               }
            }

            private com.google.protobuf.RepeatedFieldBuilderV3<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.BannerOrBuilder> bannerBuilder_;

            /**
             * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner banner = 1;</code>
             */
            public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner> getBannerList() {
              if (bannerBuilder_ == null) {
                return java.util.Collections.unmodifiableList(banner_);
              } else {
                return bannerBuilder_.getMessageList();
              }
            }
            /**
             * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner banner = 1;</code>
             */
            public int getBannerCount() {
              if (bannerBuilder_ == null) {
                return banner_.size();
              } else {
                return bannerBuilder_.getCount();
              }
            }
            /**
             * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner banner = 1;</code>
             */
            public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner getBanner(int index) {
              if (bannerBuilder_ == null) {
                return banner_.get(index);
              } else {
                return bannerBuilder_.getMessage(index);
              }
            }
            /**
             * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner banner = 1;</code>
             */
            public Builder setBanner(
                int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner value) {
              if (bannerBuilder_ == null) {
                if (value == null) {
                  throw new NullPointerException();
                }
                ensureBannerIsMutable();
                banner_.set(index, value);
                onChanged();
              } else {
                bannerBuilder_.setMessage(index, value);
              }
              return this;
            }
            /**
             * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner banner = 1;</code>
             */
            public Builder setBanner(
                int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Builder builderForValue) {
              if (bannerBuilder_ == null) {
                ensureBannerIsMutable();
                banner_.set(index, builderForValue.build());
                onChanged();
              } else {
                bannerBuilder_.setMessage(index, builderForValue.build());
              }
              return this;
            }
            /**
             * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner banner = 1;</code>
             */
            public Builder addBanner(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner value) {
              if (bannerBuilder_ == null) {
                if (value == null) {
                  throw new NullPointerException();
                }
                ensureBannerIsMutable();
                banner_.add(value);
                onChanged();
              } else {
                bannerBuilder_.addMessage(value);
              }
              return this;
            }
            /**
             * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner banner = 1;</code>
             */
            public Builder addBanner(
                int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner value) {
              if (bannerBuilder_ == null) {
                if (value == null) {
                  throw new NullPointerException();
                }
                ensureBannerIsMutable();
                banner_.add(index, value);
                onChanged();
              } else {
                bannerBuilder_.addMessage(index, value);
              }
              return this;
            }
            /**
             * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner banner = 1;</code>
             */
            public Builder addBanner(
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Builder builderForValue) {
              if (bannerBuilder_ == null) {
                ensureBannerIsMutable();
                banner_.add(builderForValue.build());
                onChanged();
              } else {
                bannerBuilder_.addMessage(builderForValue.build());
              }
              return this;
            }
            /**
             * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner banner = 1;</code>
             */
            public Builder addBanner(
                int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Builder builderForValue) {
              if (bannerBuilder_ == null) {
                ensureBannerIsMutable();
                banner_.add(index, builderForValue.build());
                onChanged();
              } else {
                bannerBuilder_.addMessage(index, builderForValue.build());
              }
              return this;
            }
            /**
             * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner banner = 1;</code>
             */
            public Builder addAllBanner(
                java.lang.Iterable<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner> values) {
              if (bannerBuilder_ == null) {
                ensureBannerIsMutable();
                com.google.protobuf.AbstractMessageLite.Builder.addAll(
                    values, banner_);
                onChanged();
              } else {
                bannerBuilder_.addAllMessages(values);
              }
              return this;
            }
            /**
             * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner banner = 1;</code>
             */
            public Builder clearBanner() {
              if (bannerBuilder_ == null) {
                banner_ = java.util.Collections.emptyList();
                bitField0_ = (bitField0_ & ~0x00000001);
                onChanged();
              } else {
                bannerBuilder_.clear();
              }
              return this;
            }
            /**
             * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner banner = 1;</code>
             */
            public Builder removeBanner(int index) {
              if (bannerBuilder_ == null) {
                ensureBannerIsMutable();
                banner_.remove(index);
                onChanged();
              } else {
                bannerBuilder_.remove(index);
              }
              return this;
            }
            /**
             * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner banner = 1;</code>
             */
            public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Builder getBannerBuilder(
                int index) {
              return getBannerFieldBuilder().getBuilder(index);
            }
            /**
             * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner banner = 1;</code>
             */
            public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.BannerOrBuilder getBannerOrBuilder(
                int index) {
              if (bannerBuilder_ == null) {
                return banner_.get(index);  } else {
                return bannerBuilder_.getMessageOrBuilder(index);
              }
            }
            /**
             * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner banner = 1;</code>
             */
            public java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.BannerOrBuilder> 
                 getBannerOrBuilderList() {
              if (bannerBuilder_ != null) {
                return bannerBuilder_.getMessageOrBuilderList();
              } else {
                return java.util.Collections.unmodifiableList(banner_);
              }
            }
            /**
             * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner banner = 1;</code>
             */
            public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Builder addBannerBuilder() {
              return getBannerFieldBuilder().addBuilder(
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.getDefaultInstance());
            }
            /**
             * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner banner = 1;</code>
             */
            public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Builder addBannerBuilder(
                int index) {
              return getBannerFieldBuilder().addBuilder(
                  index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.getDefaultInstance());
            }
            /**
             * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner banner = 1;</code>
             */
            public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Builder> 
                 getBannerBuilderList() {
              return getBannerFieldBuilder().getBuilderList();
            }
            private com.google.protobuf.RepeatedFieldBuilderV3<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.BannerOrBuilder> 
                getBannerFieldBuilder() {
              if (bannerBuilder_ == null) {
                bannerBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
                    com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.BannerOrBuilder>(
                        banner_,
                        ((bitField0_ & 0x00000001) != 0),
                        getParentForChildren(),
                        isClean());
                banner_ = null;
              }
              return bannerBuilder_;
            }
            @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:com.iabtechlab.openrtb.v2.BidRequest.Imp.Video.CompanionAd)
          }

          // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.BidRequest.Imp.Video.CompanionAd)
          private static final com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd DEFAULT_INSTANCE;
          static {
            DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd();
          }

          public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd getDefaultInstance() {
            return DEFAULT_INSTANCE;
          }

          @java.lang.Deprecated public static final com.google.protobuf.Parser<CompanionAd>
              PARSER = new com.google.protobuf.AbstractParser<CompanionAd>() {
            @java.lang.Override
            public CompanionAd parsePartialFrom(
                com.google.protobuf.CodedInputStream input,
                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
                throws com.google.protobuf.InvalidProtocolBufferException {
              return new CompanionAd(input, extensionRegistry);
            }
          };

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

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

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd getDefaultInstanceForType() {
            return DEFAULT_INSTANCE;
          }

        }

        private int bitField0_;
        public static final int MIMES_FIELD_NUMBER = 1;
        private com.google.protobuf.LazyStringList mimes_;
        /**
         * <pre>
         * Whitelist of content MIME types supported. Popular MIME types include,
         * but are not limited to "image/jpg", "image/gif" and
         * "application/x-shockwave-flash".
         * REQUIRED by the OpenRTB specification: at least 1 element.
         * </pre>
         *
         * <code>repeated string mimes = 1;</code>
         * @return A list containing the mimes.
         */
        public com.google.protobuf.ProtocolStringList
            getMimesList() {
          return mimes_;
        }
        /**
         * <pre>
         * Whitelist of content MIME types supported. Popular MIME types include,
         * but are not limited to "image/jpg", "image/gif" and
         * "application/x-shockwave-flash".
         * REQUIRED by the OpenRTB specification: at least 1 element.
         * </pre>
         *
         * <code>repeated string mimes = 1;</code>
         * @return The count of mimes.
         */
        public int getMimesCount() {
          return mimes_.size();
        }
        /**
         * <pre>
         * Whitelist of content MIME types supported. Popular MIME types include,
         * but are not limited to "image/jpg", "image/gif" and
         * "application/x-shockwave-flash".
         * REQUIRED by the OpenRTB specification: at least 1 element.
         * </pre>
         *
         * <code>repeated string mimes = 1;</code>
         * @param index The index of the element to return.
         * @return The mimes at the given index.
         */
        public java.lang.String getMimes(int index) {
          return mimes_.get(index);
        }
        /**
         * <pre>
         * Whitelist of content MIME types supported. Popular MIME types include,
         * but are not limited to "image/jpg", "image/gif" and
         * "application/x-shockwave-flash".
         * REQUIRED by the OpenRTB specification: at least 1 element.
         * </pre>
         *
         * <code>repeated string mimes = 1;</code>
         * @param index The index of the value to return.
         * @return The bytes of the mimes at the given index.
         */
        public com.google.protobuf.ByteString
            getMimesBytes(int index) {
          return mimes_.getByteString(index);
        }

        public static final int LINEARITY_FIELD_NUMBER = 2;
        private int linearity_;
        /**
         * <pre>
         * Indicates if the impression must be linear, nonlinear, etc.
         * If none specified, assume all are allowed.
         * Refer to enum com.iabtechlab.adcom.v1.enums.LinearityMode for generic values.
         * </pre>
         *
         * <code>optional int32 linearity = 2;</code>
         * @return Whether the linearity field is set.
         */
        @java.lang.Override
        public boolean hasLinearity() {
          return ((bitField0_ & 0x00000001) != 0);
        }
        /**
         * <pre>
         * Indicates if the impression must be linear, nonlinear, etc.
         * If none specified, assume all are allowed.
         * Refer to enum com.iabtechlab.adcom.v1.enums.LinearityMode for generic values.
         * </pre>
         *
         * <code>optional int32 linearity = 2;</code>
         * @return The linearity.
         */
        @java.lang.Override
        public int getLinearity() {
          return linearity_;
        }

        public static final int MINDURATION_FIELD_NUMBER = 3;
        private int minduration_;
        /**
         * <pre>
         * Minimum video ad duration in seconds.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional int32 minduration = 3;</code>
         * @return Whether the minduration field is set.
         */
        @java.lang.Override
        public boolean hasMinduration() {
          return ((bitField0_ & 0x00000002) != 0);
        }
        /**
         * <pre>
         * Minimum video ad duration in seconds.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional int32 minduration = 3;</code>
         * @return The minduration.
         */
        @java.lang.Override
        public int getMinduration() {
          return minduration_;
        }

        public static final int MAXDURATION_FIELD_NUMBER = 4;
        private int maxduration_;
        /**
         * <pre>
         * Maximum video ad duration in seconds.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional int32 maxduration = 4;</code>
         * @return Whether the maxduration field is set.
         */
        @java.lang.Override
        public boolean hasMaxduration() {
          return ((bitField0_ & 0x00000004) != 0);
        }
        /**
         * <pre>
         * Maximum video ad duration in seconds.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional int32 maxduration = 4;</code>
         * @return The maxduration.
         */
        @java.lang.Override
        public int getMaxduration() {
          return maxduration_;
        }

        public static final int PROTOCOL_FIELD_NUMBER = 5;
        private int protocol_;
        /**
         * <pre>
         * Deprecated; use protocols.
         * Refer to enum com.iabtechlab.adcom.v1.Creative.AudioVideoType for generic values.
         * </pre>
         *
         * <code>optional int32 protocol = 5 [deprecated = true];</code>
         * @return Whether the protocol field is set.
         */
        @java.lang.Override
        @java.lang.Deprecated public boolean hasProtocol() {
          return ((bitField0_ & 0x00000008) != 0);
        }
        /**
         * <pre>
         * Deprecated; use protocols.
         * Refer to enum com.iabtechlab.adcom.v1.Creative.AudioVideoType for generic values.
         * </pre>
         *
         * <code>optional int32 protocol = 5 [deprecated = true];</code>
         * @return The protocol.
         */
        @java.lang.Override
        @java.lang.Deprecated public int getProtocol() {
          return protocol_;
        }

        public static final int PROTOCOLS_FIELD_NUMBER = 21;
        private com.google.protobuf.Internal.IntList protocols_;
        /**
         * <pre>
         * Array of supported video bid response protocols.
         * At least one supported protocol must be specified.
         * Refer to enum com.iabtechlab.adcom.v1.Creative.AudioVideoType for generic values.
         * </pre>
         *
         * <code>repeated int32 protocols = 21 [packed = true];</code>
         * @return A list containing the protocols.
         */
        @java.lang.Override
        public java.util.List<java.lang.Integer>
            getProtocolsList() {
          return protocols_;
        }
        /**
         * <pre>
         * Array of supported video bid response protocols.
         * At least one supported protocol must be specified.
         * Refer to enum com.iabtechlab.adcom.v1.Creative.AudioVideoType for generic values.
         * </pre>
         *
         * <code>repeated int32 protocols = 21 [packed = true];</code>
         * @return The count of protocols.
         */
        public int getProtocolsCount() {
          return protocols_.size();
        }
        /**
         * <pre>
         * Array of supported video bid response protocols.
         * At least one supported protocol must be specified.
         * Refer to enum com.iabtechlab.adcom.v1.Creative.AudioVideoType for generic values.
         * </pre>
         *
         * <code>repeated int32 protocols = 21 [packed = true];</code>
         * @param index The index of the element to return.
         * @return The protocols at the given index.
         */
        public int getProtocols(int index) {
          return protocols_.getInt(index);
        }
        private int protocolsMemoizedSerializedSize = -1;

        public static final int W_FIELD_NUMBER = 6;
        private int w_;
        /**
         * <pre>
         * Width of the video player in device independent pixels (DIPS).
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional int32 w = 6;</code>
         * @return Whether the w field is set.
         */
        @java.lang.Override
        public boolean hasW() {
          return ((bitField0_ & 0x00000010) != 0);
        }
        /**
         * <pre>
         * Width of the video player in device independent pixels (DIPS).
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional int32 w = 6;</code>
         * @return The w.
         */
        @java.lang.Override
        public int getW() {
          return w_;
        }

        public static final int H_FIELD_NUMBER = 7;
        private int h_;
        /**
         * <pre>
         * Height of the video player in device independent pixels (DIPS).
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional int32 h = 7;</code>
         * @return Whether the h field is set.
         */
        @java.lang.Override
        public boolean hasH() {
          return ((bitField0_ & 0x00000020) != 0);
        }
        /**
         * <pre>
         * Height of the video player in device independent pixels (DIPS).
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional int32 h = 7;</code>
         * @return The h.
         */
        @java.lang.Override
        public int getH() {
          return h_;
        }

        public static final int STARTDELAY_FIELD_NUMBER = 8;
        private int startdelay_;
        /**
         * <pre>
         * Indicates the start delay in seconds for pre-roll, mid-roll, or
         * post-roll ad placements.
         * Refer to enum com.iabtechlab.adcom.v1.StartDelayMode for generic values.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional int32 startdelay = 8;</code>
         * @return Whether the startdelay field is set.
         */
        @java.lang.Override
        public boolean hasStartdelay() {
          return ((bitField0_ & 0x00000040) != 0);
        }
        /**
         * <pre>
         * Indicates the start delay in seconds for pre-roll, mid-roll, or
         * post-roll ad placements.
         * Refer to enum com.iabtechlab.adcom.v1.StartDelayMode for generic values.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional int32 startdelay = 8;</code>
         * @return The startdelay.
         */
        @java.lang.Override
        public int getStartdelay() {
          return startdelay_;
        }

        public static final int MAXSEQ_FIELD_NUMBER = 28;
        private int maxseq_;
        /**
         * <pre>
         * Indicates the maximum number of ads that may be served into a
         * “dynamic” video ad pod (where the precise number of ads is not
         * predetermined by the seller).
         * </pre>
         *
         * <code>optional int32 maxseq = 28;</code>
         * @return Whether the maxseq field is set.
         */
        @java.lang.Override
        public boolean hasMaxseq() {
          return ((bitField0_ & 0x00000080) != 0);
        }
        /**
         * <pre>
         * Indicates the maximum number of ads that may be served into a
         * “dynamic” video ad pod (where the precise number of ads is not
         * predetermined by the seller).
         * </pre>
         *
         * <code>optional int32 maxseq = 28;</code>
         * @return The maxseq.
         */
        @java.lang.Override
        public int getMaxseq() {
          return maxseq_;
        }

        public static final int PODDUR_FIELD_NUMBER = 29;
        private int poddur_;
        /**
         * <pre>
         * Indicates the total amount of time in seconds that advertisers may
         * fill for a “dynamic” video ad pod (See Section 7.6 for more details),
         * or the dynamic portion of a “hybrid” ad pod. This field is required
         * only for the dynamic portion(s) of video ad pods. This field refers to
         * the length of the entire ad break, whereas
         * minduration/maxduration/rqddurs are constraints relating to the slots
         * that make up the pod.
         * </pre>
         *
         * <code>optional int32 poddur = 29;</code>
         * @return Whether the poddur field is set.
         */
        @java.lang.Override
        public boolean hasPoddur() {
          return ((bitField0_ & 0x00000100) != 0);
        }
        /**
         * <pre>
         * Indicates the total amount of time in seconds that advertisers may
         * fill for a “dynamic” video ad pod (See Section 7.6 for more details),
         * or the dynamic portion of a “hybrid” ad pod. This field is required
         * only for the dynamic portion(s) of video ad pods. This field refers to
         * the length of the entire ad break, whereas
         * minduration/maxduration/rqddurs are constraints relating to the slots
         * that make up the pod.
         * </pre>
         *
         * <code>optional int32 poddur = 29;</code>
         * @return The poddur.
         */
        @java.lang.Override
        public int getPoddur() {
          return poddur_;
        }

        public static final int SKIP_FIELD_NUMBER = 23;
        private boolean skip_;
        /**
         * <pre>
         * Indicates if the player will allow the video to be skipped,
         * where 0 = no, 1 = yes.
         * If a bidder sends markup/creative that is itself skippable, the
         * Bid object should include the attr array with an element of
         * 16 indicating skippable video.
         * </pre>
         *
         * <code>optional bool skip = 23;</code>
         * @return Whether the skip field is set.
         */
        @java.lang.Override
        public boolean hasSkip() {
          return ((bitField0_ & 0x00000200) != 0);
        }
        /**
         * <pre>
         * Indicates if the player will allow the video to be skipped,
         * where 0 = no, 1 = yes.
         * If a bidder sends markup/creative that is itself skippable, the
         * Bid object should include the attr array with an element of
         * 16 indicating skippable video.
         * </pre>
         *
         * <code>optional bool skip = 23;</code>
         * @return The skip.
         */
        @java.lang.Override
        public boolean getSkip() {
          return skip_;
        }

        public static final int SKIPMIN_FIELD_NUMBER = 24;
        private int skipmin_;
        /**
         * <pre>
         * Videos of total duration greater than this number of seconds
         * can be skippable; only applicable if the ad is skippable.
         * </pre>
         *
         * <code>optional int32 skipmin = 24;</code>
         * @return Whether the skipmin field is set.
         */
        @java.lang.Override
        public boolean hasSkipmin() {
          return ((bitField0_ & 0x00000400) != 0);
        }
        /**
         * <pre>
         * Videos of total duration greater than this number of seconds
         * can be skippable; only applicable if the ad is skippable.
         * </pre>
         *
         * <code>optional int32 skipmin = 24;</code>
         * @return The skipmin.
         */
        @java.lang.Override
        public int getSkipmin() {
          return skipmin_;
        }

        public static final int SKIPAFTER_FIELD_NUMBER = 25;
        private int skipafter_;
        /**
         * <pre>
         * Number of seconds a video must play before skipping is
         * enabled; only applicable if the ad is skippable.
         * </pre>
         *
         * <code>optional int32 skipafter = 25;</code>
         * @return Whether the skipafter field is set.
         */
        @java.lang.Override
        public boolean hasSkipafter() {
          return ((bitField0_ & 0x00000800) != 0);
        }
        /**
         * <pre>
         * Number of seconds a video must play before skipping is
         * enabled; only applicable if the ad is skippable.
         * </pre>
         *
         * <code>optional int32 skipafter = 25;</code>
         * @return The skipafter.
         */
        @java.lang.Override
        public int getSkipafter() {
          return skipafter_;
        }

        public static final int SEQUENCE_FIELD_NUMBER = 9;
        private int sequence_;
        /**
         * <pre>
         * If multiple ad impressions are offered in the same bid request,
         * the sequence number will allow for the coordinated delivery of
         * multiple creatives.
         * </pre>
         *
         * <code>optional int32 sequence = 9 [default = 1, deprecated = true];</code>
         * @return Whether the sequence field is set.
         */
        @java.lang.Override
        @java.lang.Deprecated public boolean hasSequence() {
          return ((bitField0_ & 0x00001000) != 0);
        }
        /**
         * <pre>
         * If multiple ad impressions are offered in the same bid request,
         * the sequence number will allow for the coordinated delivery of
         * multiple creatives.
         * </pre>
         *
         * <code>optional int32 sequence = 9 [default = 1, deprecated = true];</code>
         * @return The sequence.
         */
        @java.lang.Override
        @java.lang.Deprecated public int getSequence() {
          return sequence_;
        }

        public static final int SLOTINPOD_FIELD_NUMBER = 33;
        private int slotinpod_;
        /**
         * <pre>
         * For video ad pods, this value indicates that the seller can guarantee
         * delivery against the indicated slot position in the pod.
         * </pre>
         *
         * <code>optional int32 slotinpod = 33 [default = 0];</code>
         * @return Whether the slotinpod field is set.
         */
        @java.lang.Override
        public boolean hasSlotinpod() {
          return ((bitField0_ & 0x00002000) != 0);
        }
        /**
         * <pre>
         * For video ad pods, this value indicates that the seller can guarantee
         * delivery against the indicated slot position in the pod.
         * </pre>
         *
         * <code>optional int32 slotinpod = 33 [default = 0];</code>
         * @return The slotinpod.
         */
        @java.lang.Override
        public int getSlotinpod() {
          return slotinpod_;
        }

        public static final int MINCPMPERSEC_FIELD_NUMBER = 34;
        private double mincpmpersec_;
        /**
         * <pre>
         * Minimum CPM per second. This is a price floor for the "dynamic"
         * portion of a video ad pod, relative to the duration of bids an
         * advertiser may submit.
         * </pre>
         *
         * <code>optional double mincpmpersec = 34;</code>
         * @return Whether the mincpmpersec field is set.
         */
        @java.lang.Override
        public boolean hasMincpmpersec() {
          return ((bitField0_ & 0x00004000) != 0);
        }
        /**
         * <pre>
         * Minimum CPM per second. This is a price floor for the "dynamic"
         * portion of a video ad pod, relative to the duration of bids an
         * advertiser may submit.
         * </pre>
         *
         * <code>optional double mincpmpersec = 34;</code>
         * @return The mincpmpersec.
         */
        @java.lang.Override
        public double getMincpmpersec() {
          return mincpmpersec_;
        }

        public static final int BATTR_FIELD_NUMBER = 10;
        private com.google.protobuf.Internal.IntList battr_;
        /**
         * <pre>
         * Blocked creative attributes.
         * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
         * </pre>
         *
         * <code>repeated int32 battr = 10 [packed = true];</code>
         * @return A list containing the battr.
         */
        @java.lang.Override
        public java.util.List<java.lang.Integer>
            getBattrList() {
          return battr_;
        }
        /**
         * <pre>
         * Blocked creative attributes.
         * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
         * </pre>
         *
         * <code>repeated int32 battr = 10 [packed = true];</code>
         * @return The count of battr.
         */
        public int getBattrCount() {
          return battr_.size();
        }
        /**
         * <pre>
         * Blocked creative attributes.
         * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
         * </pre>
         *
         * <code>repeated int32 battr = 10 [packed = true];</code>
         * @param index The index of the element to return.
         * @return The battr at the given index.
         */
        public int getBattr(int index) {
          return battr_.getInt(index);
        }
        private int battrMemoizedSerializedSize = -1;

        public static final int MAXEXTENDED_FIELD_NUMBER = 11;
        private int maxextended_;
        /**
         * <pre>
         * Maximum extended video ad duration, if extension is allowed.
         * If blank or 0, extension is not allowed. If -1, extension is allowed,
         * and there is no time limit imposed. If greater than 0, then the value
         * represents the number of seconds of extended play supported beyond
         * the maxduration value.
         * </pre>
         *
         * <code>optional int32 maxextended = 11;</code>
         * @return Whether the maxextended field is set.
         */
        @java.lang.Override
        public boolean hasMaxextended() {
          return ((bitField0_ & 0x00008000) != 0);
        }
        /**
         * <pre>
         * Maximum extended video ad duration, if extension is allowed.
         * If blank or 0, extension is not allowed. If -1, extension is allowed,
         * and there is no time limit imposed. If greater than 0, then the value
         * represents the number of seconds of extended play supported beyond
         * the maxduration value.
         * </pre>
         *
         * <code>optional int32 maxextended = 11;</code>
         * @return The maxextended.
         */
        @java.lang.Override
        public int getMaxextended() {
          return maxextended_;
        }

        public static final int MINBITRATE_FIELD_NUMBER = 12;
        private int minbitrate_;
        /**
         * <pre>
         * Minimum bit rate in Kbps.
         * </pre>
         *
         * <code>optional int32 minbitrate = 12;</code>
         * @return Whether the minbitrate field is set.
         */
        @java.lang.Override
        public boolean hasMinbitrate() {
          return ((bitField0_ & 0x00010000) != 0);
        }
        /**
         * <pre>
         * Minimum bit rate in Kbps.
         * </pre>
         *
         * <code>optional int32 minbitrate = 12;</code>
         * @return The minbitrate.
         */
        @java.lang.Override
        public int getMinbitrate() {
          return minbitrate_;
        }

        public static final int MAXBITRATE_FIELD_NUMBER = 13;
        private int maxbitrate_;
        /**
         * <pre>
         * Maximum bit rate in Kbps.
         * </pre>
         *
         * <code>optional int32 maxbitrate = 13;</code>
         * @return Whether the maxbitrate field is set.
         */
        @java.lang.Override
        public boolean hasMaxbitrate() {
          return ((bitField0_ & 0x00020000) != 0);
        }
        /**
         * <pre>
         * Maximum bit rate in Kbps.
         * </pre>
         *
         * <code>optional int32 maxbitrate = 13;</code>
         * @return The maxbitrate.
         */
        @java.lang.Override
        public int getMaxbitrate() {
          return maxbitrate_;
        }

        public static final int BOXINGALLOWED_FIELD_NUMBER = 14;
        private boolean boxingallowed_;
        /**
         * <pre>
         * Indicates if letter-boxing of 4:3 content into a 16:9 window is
         * allowed, where 0 = no, 1 = yes.
         * </pre>
         *
         * <code>optional bool boxingallowed = 14 [default = true];</code>
         * @return Whether the boxingallowed field is set.
         */
        @java.lang.Override
        public boolean hasBoxingallowed() {
          return ((bitField0_ & 0x00040000) != 0);
        }
        /**
         * <pre>
         * Indicates if letter-boxing of 4:3 content into a 16:9 window is
         * allowed, where 0 = no, 1 = yes.
         * </pre>
         *
         * <code>optional bool boxingallowed = 14 [default = true];</code>
         * @return The boxingallowed.
         */
        @java.lang.Override
        public boolean getBoxingallowed() {
          return boxingallowed_;
        }

        public static final int PLAYBACKMETHOD_FIELD_NUMBER = 15;
        private com.google.protobuf.Internal.IntList playbackmethod_;
        /**
         * <pre>
         * Playback methods that may be in use. If none are specified, any
         * method may be used. Only one method is typically used in practice.
         * As a result, this array may be converted to an integer in a future
         * version of the specification. It is strongly advised to use only
         * the first element of this array in preparation for this change.
         * Refer to enum com.iabtechlab.adcom.v1.PlaybackMethod for generic values.
         * </pre>
         *
         * <code>repeated int32 playbackmethod = 15 [packed = true];</code>
         * @return A list containing the playbackmethod.
         */
        @java.lang.Override
        public java.util.List<java.lang.Integer>
            getPlaybackmethodList() {
          return playbackmethod_;
        }
        /**
         * <pre>
         * Playback methods that may be in use. If none are specified, any
         * method may be used. Only one method is typically used in practice.
         * As a result, this array may be converted to an integer in a future
         * version of the specification. It is strongly advised to use only
         * the first element of this array in preparation for this change.
         * Refer to enum com.iabtechlab.adcom.v1.PlaybackMethod for generic values.
         * </pre>
         *
         * <code>repeated int32 playbackmethod = 15 [packed = true];</code>
         * @return The count of playbackmethod.
         */
        public int getPlaybackmethodCount() {
          return playbackmethod_.size();
        }
        /**
         * <pre>
         * Playback methods that may be in use. If none are specified, any
         * method may be used. Only one method is typically used in practice.
         * As a result, this array may be converted to an integer in a future
         * version of the specification. It is strongly advised to use only
         * the first element of this array in preparation for this change.
         * Refer to enum com.iabtechlab.adcom.v1.PlaybackMethod for generic values.
         * </pre>
         *
         * <code>repeated int32 playbackmethod = 15 [packed = true];</code>
         * @param index The index of the element to return.
         * @return The playbackmethod at the given index.
         */
        public int getPlaybackmethod(int index) {
          return playbackmethod_.getInt(index);
        }
        private int playbackmethodMemoizedSerializedSize = -1;

        public static final int DELIVERY_FIELD_NUMBER = 16;
        private com.google.protobuf.Internal.IntList delivery_;
        /**
         * <pre>
         * Supported delivery methods (e.g., streaming, progressive).
         * If none specified, assume all are supported.
         * Refer to enum com.iabtechlab.adcom.v1.enums.DeliveryMethod for generic values.
         * </pre>
         *
         * <code>repeated int32 delivery = 16 [packed = true];</code>
         * @return A list containing the delivery.
         */
        @java.lang.Override
        public java.util.List<java.lang.Integer>
            getDeliveryList() {
          return delivery_;
        }
        /**
         * <pre>
         * Supported delivery methods (e.g., streaming, progressive).
         * If none specified, assume all are supported.
         * Refer to enum com.iabtechlab.adcom.v1.enums.DeliveryMethod for generic values.
         * </pre>
         *
         * <code>repeated int32 delivery = 16 [packed = true];</code>
         * @return The count of delivery.
         */
        public int getDeliveryCount() {
          return delivery_.size();
        }
        /**
         * <pre>
         * Supported delivery methods (e.g., streaming, progressive).
         * If none specified, assume all are supported.
         * Refer to enum com.iabtechlab.adcom.v1.enums.DeliveryMethod for generic values.
         * </pre>
         *
         * <code>repeated int32 delivery = 16 [packed = true];</code>
         * @param index The index of the element to return.
         * @return The delivery at the given index.
         */
        public int getDelivery(int index) {
          return delivery_.getInt(index);
        }
        private int deliveryMemoizedSerializedSize = -1;

        public static final int POS_FIELD_NUMBER = 17;
        private int pos_;
        /**
         * <pre>
         * Ad position on screen.
         * Refer to enum com.iabtechlab.adcom.v1.PlacementPosition for generic values.
         * </pre>
         *
         * <code>optional int32 pos = 17;</code>
         * @return Whether the pos field is set.
         */
        @java.lang.Override
        public boolean hasPos() {
          return ((bitField0_ & 0x00080000) != 0);
        }
        /**
         * <pre>
         * Ad position on screen.
         * Refer to enum com.iabtechlab.adcom.v1.PlacementPosition for generic values.
         * </pre>
         *
         * <code>optional int32 pos = 17;</code>
         * @return The pos.
         */
        @java.lang.Override
        public int getPos() {
          return pos_;
        }

        public static final int COMPANIONAD_FIELD_NUMBER = 18;
        private java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner> companionad_;
        /**
         * <pre>
         * Array of Banner objects (Section 3.2.3) if companion ads are available.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 18;</code>
         */
        @java.lang.Override
        public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner> getCompanionadList() {
          return companionad_;
        }
        /**
         * <pre>
         * Array of Banner objects (Section 3.2.3) if companion ads are available.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 18;</code>
         */
        @java.lang.Override
        public java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.BannerOrBuilder> 
            getCompanionadOrBuilderList() {
          return companionad_;
        }
        /**
         * <pre>
         * Array of Banner objects (Section 3.2.3) if companion ads are available.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 18;</code>
         */
        @java.lang.Override
        public int getCompanionadCount() {
          return companionad_.size();
        }
        /**
         * <pre>
         * Array of Banner objects (Section 3.2.3) if companion ads are available.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 18;</code>
         */
        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner getCompanionad(int index) {
          return companionad_.get(index);
        }
        /**
         * <pre>
         * Array of Banner objects (Section 3.2.3) if companion ads are available.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 18;</code>
         */
        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.BannerOrBuilder getCompanionadOrBuilder(
            int index) {
          return companionad_.get(index);
        }

        public static final int COMPANIONAD_21_FIELD_NUMBER = 22;
        private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd companionad21_;
        /**
         * <pre>
         * Companion ads in OpenRTB 2.1 format. (Or to be precise, interpretations
         * based on the buggy sample message in 5.1.4, fixed later in 2.2.)
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Video.CompanionAd companionad_21 = 22 [deprecated = true];</code>
         * @return Whether the companionad21 field is set.
         */
        @java.lang.Override
        @java.lang.Deprecated public boolean hasCompanionad21() {
          return ((bitField0_ & 0x00100000) != 0);
        }
        /**
         * <pre>
         * Companion ads in OpenRTB 2.1 format. (Or to be precise, interpretations
         * based on the buggy sample message in 5.1.4, fixed later in 2.2.)
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Video.CompanionAd companionad_21 = 22 [deprecated = true];</code>
         * @return The companionad21.
         */
        @java.lang.Override
        @java.lang.Deprecated public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd getCompanionad21() {
          return companionad21_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd.getDefaultInstance() : companionad21_;
        }
        /**
         * <pre>
         * Companion ads in OpenRTB 2.1 format. (Or to be precise, interpretations
         * based on the buggy sample message in 5.1.4, fixed later in 2.2.)
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Video.CompanionAd companionad_21 = 22 [deprecated = true];</code>
         */
        @java.lang.Override
        @java.lang.Deprecated public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAdOrBuilder getCompanionad21OrBuilder() {
          return companionad21_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd.getDefaultInstance() : companionad21_;
        }

        public static final int API_FIELD_NUMBER = 19;
        private com.google.protobuf.Internal.IntList api_;
        /**
         * <pre>
         * List of supported API frameworks for this impression.
         * If an API is not explicitly listed, it is assumed not to be supported.
         * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
         * </pre>
         *
         * <code>repeated int32 api = 19 [packed = true];</code>
         * @return A list containing the api.
         */
        @java.lang.Override
        public java.util.List<java.lang.Integer>
            getApiList() {
          return api_;
        }
        /**
         * <pre>
         * List of supported API frameworks for this impression.
         * If an API is not explicitly listed, it is assumed not to be supported.
         * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
         * </pre>
         *
         * <code>repeated int32 api = 19 [packed = true];</code>
         * @return The count of api.
         */
        public int getApiCount() {
          return api_.size();
        }
        /**
         * <pre>
         * List of supported API frameworks for this impression.
         * If an API is not explicitly listed, it is assumed not to be supported.
         * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
         * </pre>
         *
         * <code>repeated int32 api = 19 [packed = true];</code>
         * @param index The index of the element to return.
         * @return The api at the given index.
         */
        public int getApi(int index) {
          return api_.getInt(index);
        }
        private int apiMemoizedSerializedSize = -1;

        public static final int COMPANIONTYPE_FIELD_NUMBER = 20;
        private com.google.protobuf.Internal.IntList companiontype_;
        /**
         * <pre>
         * Supported VAST companion ad types.  Recommended if companion Banner
         * objects are included via the companionad array.
         * Refer to enum com.iabtechlab.adcom.v1.CompanionType for generic values.
         * </pre>
         *
         * <code>repeated int32 companiontype = 20 [packed = true];</code>
         * @return A list containing the companiontype.
         */
        @java.lang.Override
        public java.util.List<java.lang.Integer>
            getCompaniontypeList() {
          return companiontype_;
        }
        /**
         * <pre>
         * Supported VAST companion ad types.  Recommended if companion Banner
         * objects are included via the companionad array.
         * Refer to enum com.iabtechlab.adcom.v1.CompanionType for generic values.
         * </pre>
         *
         * <code>repeated int32 companiontype = 20 [packed = true];</code>
         * @return The count of companiontype.
         */
        public int getCompaniontypeCount() {
          return companiontype_.size();
        }
        /**
         * <pre>
         * Supported VAST companion ad types.  Recommended if companion Banner
         * objects are included via the companionad array.
         * Refer to enum com.iabtechlab.adcom.v1.CompanionType for generic values.
         * </pre>
         *
         * <code>repeated int32 companiontype = 20 [packed = true];</code>
         * @param index The index of the element to return.
         * @return The companiontype at the given index.
         */
        public int getCompaniontype(int index) {
          return companiontype_.getInt(index);
        }
        private int companiontypeMemoizedSerializedSize = -1;

        public static final int PODID_FIELD_NUMBER = 30;
        private volatile java.lang.Object podid_;
        /**
         * <pre>
         * Unique identifier indicating that an impression opportunity belongs to
         * a video ad pod. If multiple impression opportunities within a bid
         * request share the same podid, this indicates that those impression
         * opportunities belong to the same video ad pod.
         * </pre>
         *
         * <code>optional string podid = 30;</code>
         * @return Whether the podid field is set.
         */
        @java.lang.Override
        public boolean hasPodid() {
          return ((bitField0_ & 0x00200000) != 0);
        }
        /**
         * <pre>
         * Unique identifier indicating that an impression opportunity belongs to
         * a video ad pod. If multiple impression opportunities within a bid
         * request share the same podid, this indicates that those impression
         * opportunities belong to the same video ad pod.
         * </pre>
         *
         * <code>optional string podid = 30;</code>
         * @return The podid.
         */
        @java.lang.Override
        public java.lang.String getPodid() {
          java.lang.Object ref = podid_;
          if (ref instanceof java.lang.String) {
            return (java.lang.String) ref;
          } else {
            com.google.protobuf.ByteString bs = 
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              podid_ = s;
            }
            return s;
          }
        }
        /**
         * <pre>
         * Unique identifier indicating that an impression opportunity belongs to
         * a video ad pod. If multiple impression opportunities within a bid
         * request share the same podid, this indicates that those impression
         * opportunities belong to the same video ad pod.
         * </pre>
         *
         * <code>optional string podid = 30;</code>
         * @return The bytes for podid.
         */
        @java.lang.Override
        public com.google.protobuf.ByteString
            getPodidBytes() {
          java.lang.Object ref = podid_;
          if (ref instanceof java.lang.String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            podid_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }

        public static final int PODSEQ_FIELD_NUMBER = 31;
        private int podseq_;
        /**
         * <pre>
         * The sequence (position) of the video ad pod within a content stream.
         * </pre>
         *
         * <code>optional int32 podseq = 31 [default = 0];</code>
         * @return Whether the podseq field is set.
         */
        @java.lang.Override
        public boolean hasPodseq() {
          return ((bitField0_ & 0x00400000) != 0);
        }
        /**
         * <pre>
         * The sequence (position) of the video ad pod within a content stream.
         * </pre>
         *
         * <code>optional int32 podseq = 31 [default = 0];</code>
         * @return The podseq.
         */
        @java.lang.Override
        public int getPodseq() {
          return podseq_;
        }

        public static final int RQDDURS_FIELD_NUMBER = 32;
        private com.google.protobuf.Internal.IntList rqddurs_;
        /**
         * <pre>
         * Precise acceptable durations for video creatives in seconds. This
         * field specifically targets the Live TV use case where non-exact ad
         * durations would result in undesirable ‘dead air’. This field is
         * mutually exclusive with minduration and maxduration; if rqddurs is
         * specified, minduration and maxduration must not be specified and vice
         * versa.
         * </pre>
         *
         * <code>repeated int32 rqddurs = 32 [packed = true];</code>
         * @return A list containing the rqddurs.
         */
        @java.lang.Override
        public java.util.List<java.lang.Integer>
            getRqddursList() {
          return rqddurs_;
        }
        /**
         * <pre>
         * Precise acceptable durations for video creatives in seconds. This
         * field specifically targets the Live TV use case where non-exact ad
         * durations would result in undesirable ‘dead air’. This field is
         * mutually exclusive with minduration and maxduration; if rqddurs is
         * specified, minduration and maxduration must not be specified and vice
         * versa.
         * </pre>
         *
         * <code>repeated int32 rqddurs = 32 [packed = true];</code>
         * @return The count of rqddurs.
         */
        public int getRqddursCount() {
          return rqddurs_.size();
        }
        /**
         * <pre>
         * Precise acceptable durations for video creatives in seconds. This
         * field specifically targets the Live TV use case where non-exact ad
         * durations would result in undesirable ‘dead air’. This field is
         * mutually exclusive with minduration and maxduration; if rqddurs is
         * specified, minduration and maxduration must not be specified and vice
         * versa.
         * </pre>
         *
         * <code>repeated int32 rqddurs = 32 [packed = true];</code>
         * @param index The index of the element to return.
         * @return The rqddurs at the given index.
         */
        public int getRqddurs(int index) {
          return rqddurs_.getInt(index);
        }
        private int rqddursMemoizedSerializedSize = -1;

        public static final int PLACEMENT_FIELD_NUMBER = 26;
        private int placement_;
        /**
         * <pre>
         * Placement type for the impression.
         * Refer to enum com.iabtechlab.adcom.v1.VideoPlacementSubtype for generic values.
         * </pre>
         *
         * <code>optional int32 placement = 26 [deprecated = true];</code>
         * @return Whether the placement field is set.
         */
        @java.lang.Override
        @java.lang.Deprecated public boolean hasPlacement() {
          return ((bitField0_ & 0x00800000) != 0);
        }
        /**
         * <pre>
         * Placement type for the impression.
         * Refer to enum com.iabtechlab.adcom.v1.VideoPlacementSubtype for generic values.
         * </pre>
         *
         * <code>optional int32 placement = 26 [deprecated = true];</code>
         * @return The placement.
         */
        @java.lang.Override
        @java.lang.Deprecated public int getPlacement() {
          return placement_;
        }

        public static final int PLCMT_FIELD_NUMBER = 35;
        private int plcmt_;
        /**
         * <pre>
         * Video placement type for the impression.
         * Refer to enum com.iabtechlab.adcom.v1.VideoPlcmtSubtype for generic values.
         * </pre>
         *
         * <code>optional int32 plcmt = 35;</code>
         * @return Whether the plcmt field is set.
         */
        @java.lang.Override
        public boolean hasPlcmt() {
          return ((bitField0_ & 0x01000000) != 0);
        }
        /**
         * <pre>
         * Video placement type for the impression.
         * Refer to enum com.iabtechlab.adcom.v1.VideoPlcmtSubtype for generic values.
         * </pre>
         *
         * <code>optional int32 plcmt = 35;</code>
         * @return The plcmt.
         */
        @java.lang.Override
        public int getPlcmt() {
          return plcmt_;
        }

        public static final int PLAYBACKEND_FIELD_NUMBER = 27;
        private int playbackend_;
        /**
         * <pre>
         * The event that causes playback to end.
         * Refer to enum com.iabtechlab.adcom.v1.PlaybackCessationMode for generic values.
         * </pre>
         *
         * <code>optional int32 playbackend = 27;</code>
         * @return Whether the playbackend field is set.
         */
        @java.lang.Override
        public boolean hasPlaybackend() {
          return ((bitField0_ & 0x02000000) != 0);
        }
        /**
         * <pre>
         * The event that causes playback to end.
         * Refer to enum com.iabtechlab.adcom.v1.PlaybackCessationMode for generic values.
         * </pre>
         *
         * <code>optional int32 playbackend = 27;</code>
         * @return The playbackend.
         */
        @java.lang.Override
        public int getPlaybackend() {
          return playbackend_;
        }

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

          for (int i = 0; i < getCompanionadCount(); i++) {
            if (!getCompanionad(i).isInitialized()) {
              memoizedIsInitialized = 0;
              return false;
            }
          }
          if (hasCompanionad21()) {
            if (!getCompanionad21().isInitialized()) {
              memoizedIsInitialized = 0;
              return false;
            }
          }
          if (!extensionsAreInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
          memoizedIsInitialized = 1;
          return true;
        }

        @java.lang.Override
        public void writeTo(com.google.protobuf.CodedOutputStream output)
                            throws java.io.IOException {
          getSerializedSize();
          com.google.protobuf.GeneratedMessageV3
            .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video>.ExtensionWriter
              extensionWriter = newExtensionWriter();
          for (int i = 0; i < mimes_.size(); i++) {
            com.google.protobuf.GeneratedMessageV3.writeString(output, 1, mimes_.getRaw(i));
          }
          if (((bitField0_ & 0x00000001) != 0)) {
            output.writeInt32(2, linearity_);
          }
          if (((bitField0_ & 0x00000002) != 0)) {
            output.writeInt32(3, minduration_);
          }
          if (((bitField0_ & 0x00000004) != 0)) {
            output.writeInt32(4, maxduration_);
          }
          if (((bitField0_ & 0x00000008) != 0)) {
            output.writeInt32(5, protocol_);
          }
          if (((bitField0_ & 0x00000010) != 0)) {
            output.writeInt32(6, w_);
          }
          if (((bitField0_ & 0x00000020) != 0)) {
            output.writeInt32(7, h_);
          }
          if (((bitField0_ & 0x00000040) != 0)) {
            output.writeInt32(8, startdelay_);
          }
          if (((bitField0_ & 0x00001000) != 0)) {
            output.writeInt32(9, sequence_);
          }
          if (getBattrList().size() > 0) {
            output.writeUInt32NoTag(82);
            output.writeUInt32NoTag(battrMemoizedSerializedSize);
          }
          for (int i = 0; i < battr_.size(); i++) {
            output.writeInt32NoTag(battr_.getInt(i));
          }
          if (((bitField0_ & 0x00008000) != 0)) {
            output.writeInt32(11, maxextended_);
          }
          if (((bitField0_ & 0x00010000) != 0)) {
            output.writeInt32(12, minbitrate_);
          }
          if (((bitField0_ & 0x00020000) != 0)) {
            output.writeInt32(13, maxbitrate_);
          }
          if (((bitField0_ & 0x00040000) != 0)) {
            output.writeBool(14, boxingallowed_);
          }
          if (getPlaybackmethodList().size() > 0) {
            output.writeUInt32NoTag(122);
            output.writeUInt32NoTag(playbackmethodMemoizedSerializedSize);
          }
          for (int i = 0; i < playbackmethod_.size(); i++) {
            output.writeInt32NoTag(playbackmethod_.getInt(i));
          }
          if (getDeliveryList().size() > 0) {
            output.writeUInt32NoTag(130);
            output.writeUInt32NoTag(deliveryMemoizedSerializedSize);
          }
          for (int i = 0; i < delivery_.size(); i++) {
            output.writeInt32NoTag(delivery_.getInt(i));
          }
          if (((bitField0_ & 0x00080000) != 0)) {
            output.writeInt32(17, pos_);
          }
          for (int i = 0; i < companionad_.size(); i++) {
            output.writeMessage(18, companionad_.get(i));
          }
          if (getApiList().size() > 0) {
            output.writeUInt32NoTag(154);
            output.writeUInt32NoTag(apiMemoizedSerializedSize);
          }
          for (int i = 0; i < api_.size(); i++) {
            output.writeInt32NoTag(api_.getInt(i));
          }
          if (getCompaniontypeList().size() > 0) {
            output.writeUInt32NoTag(162);
            output.writeUInt32NoTag(companiontypeMemoizedSerializedSize);
          }
          for (int i = 0; i < companiontype_.size(); i++) {
            output.writeInt32NoTag(companiontype_.getInt(i));
          }
          if (getProtocolsList().size() > 0) {
            output.writeUInt32NoTag(170);
            output.writeUInt32NoTag(protocolsMemoizedSerializedSize);
          }
          for (int i = 0; i < protocols_.size(); i++) {
            output.writeInt32NoTag(protocols_.getInt(i));
          }
          if (((bitField0_ & 0x00100000) != 0)) {
            output.writeMessage(22, getCompanionad21());
          }
          if (((bitField0_ & 0x00000200) != 0)) {
            output.writeBool(23, skip_);
          }
          if (((bitField0_ & 0x00000400) != 0)) {
            output.writeInt32(24, skipmin_);
          }
          if (((bitField0_ & 0x00000800) != 0)) {
            output.writeInt32(25, skipafter_);
          }
          if (((bitField0_ & 0x00800000) != 0)) {
            output.writeInt32(26, placement_);
          }
          if (((bitField0_ & 0x02000000) != 0)) {
            output.writeInt32(27, playbackend_);
          }
          if (((bitField0_ & 0x00000080) != 0)) {
            output.writeInt32(28, maxseq_);
          }
          if (((bitField0_ & 0x00000100) != 0)) {
            output.writeInt32(29, poddur_);
          }
          if (((bitField0_ & 0x00200000) != 0)) {
            com.google.protobuf.GeneratedMessageV3.writeString(output, 30, podid_);
          }
          if (((bitField0_ & 0x00400000) != 0)) {
            output.writeInt32(31, podseq_);
          }
          if (getRqddursList().size() > 0) {
            output.writeUInt32NoTag(258);
            output.writeUInt32NoTag(rqddursMemoizedSerializedSize);
          }
          for (int i = 0; i < rqddurs_.size(); i++) {
            output.writeInt32NoTag(rqddurs_.getInt(i));
          }
          if (((bitField0_ & 0x00002000) != 0)) {
            output.writeInt32(33, slotinpod_);
          }
          if (((bitField0_ & 0x00004000) != 0)) {
            output.writeDouble(34, mincpmpersec_);
          }
          if (((bitField0_ & 0x01000000) != 0)) {
            output.writeInt32(35, plcmt_);
          }
          extensionWriter.writeUntil(10000, output);
          unknownFields.writeTo(output);
        }

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

          size = 0;
          {
            int dataSize = 0;
            for (int i = 0; i < mimes_.size(); i++) {
              dataSize += computeStringSizeNoTag(mimes_.getRaw(i));
            }
            size += dataSize;
            size += 1 * getMimesList().size();
          }
          if (((bitField0_ & 0x00000001) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(2, linearity_);
          }
          if (((bitField0_ & 0x00000002) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(3, minduration_);
          }
          if (((bitField0_ & 0x00000004) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(4, maxduration_);
          }
          if (((bitField0_ & 0x00000008) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(5, protocol_);
          }
          if (((bitField0_ & 0x00000010) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(6, w_);
          }
          if (((bitField0_ & 0x00000020) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(7, h_);
          }
          if (((bitField0_ & 0x00000040) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(8, startdelay_);
          }
          if (((bitField0_ & 0x00001000) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(9, sequence_);
          }
          {
            int dataSize = 0;
            for (int i = 0; i < battr_.size(); i++) {
              dataSize += com.google.protobuf.CodedOutputStream
                .computeInt32SizeNoTag(battr_.getInt(i));
            }
            size += dataSize;
            if (!getBattrList().isEmpty()) {
              size += 1;
              size += com.google.protobuf.CodedOutputStream
                  .computeInt32SizeNoTag(dataSize);
            }
            battrMemoizedSerializedSize = dataSize;
          }
          if (((bitField0_ & 0x00008000) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(11, maxextended_);
          }
          if (((bitField0_ & 0x00010000) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(12, minbitrate_);
          }
          if (((bitField0_ & 0x00020000) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(13, maxbitrate_);
          }
          if (((bitField0_ & 0x00040000) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeBoolSize(14, boxingallowed_);
          }
          {
            int dataSize = 0;
            for (int i = 0; i < playbackmethod_.size(); i++) {
              dataSize += com.google.protobuf.CodedOutputStream
                .computeInt32SizeNoTag(playbackmethod_.getInt(i));
            }
            size += dataSize;
            if (!getPlaybackmethodList().isEmpty()) {
              size += 1;
              size += com.google.protobuf.CodedOutputStream
                  .computeInt32SizeNoTag(dataSize);
            }
            playbackmethodMemoizedSerializedSize = dataSize;
          }
          {
            int dataSize = 0;
            for (int i = 0; i < delivery_.size(); i++) {
              dataSize += com.google.protobuf.CodedOutputStream
                .computeInt32SizeNoTag(delivery_.getInt(i));
            }
            size += dataSize;
            if (!getDeliveryList().isEmpty()) {
              size += 2;
              size += com.google.protobuf.CodedOutputStream
                  .computeInt32SizeNoTag(dataSize);
            }
            deliveryMemoizedSerializedSize = dataSize;
          }
          if (((bitField0_ & 0x00080000) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(17, pos_);
          }
          for (int i = 0; i < companionad_.size(); i++) {
            size += com.google.protobuf.CodedOutputStream
              .computeMessageSize(18, companionad_.get(i));
          }
          {
            int dataSize = 0;
            for (int i = 0; i < api_.size(); i++) {
              dataSize += com.google.protobuf.CodedOutputStream
                .computeInt32SizeNoTag(api_.getInt(i));
            }
            size += dataSize;
            if (!getApiList().isEmpty()) {
              size += 2;
              size += com.google.protobuf.CodedOutputStream
                  .computeInt32SizeNoTag(dataSize);
            }
            apiMemoizedSerializedSize = dataSize;
          }
          {
            int dataSize = 0;
            for (int i = 0; i < companiontype_.size(); i++) {
              dataSize += com.google.protobuf.CodedOutputStream
                .computeInt32SizeNoTag(companiontype_.getInt(i));
            }
            size += dataSize;
            if (!getCompaniontypeList().isEmpty()) {
              size += 2;
              size += com.google.protobuf.CodedOutputStream
                  .computeInt32SizeNoTag(dataSize);
            }
            companiontypeMemoizedSerializedSize = dataSize;
          }
          {
            int dataSize = 0;
            for (int i = 0; i < protocols_.size(); i++) {
              dataSize += com.google.protobuf.CodedOutputStream
                .computeInt32SizeNoTag(protocols_.getInt(i));
            }
            size += dataSize;
            if (!getProtocolsList().isEmpty()) {
              size += 2;
              size += com.google.protobuf.CodedOutputStream
                  .computeInt32SizeNoTag(dataSize);
            }
            protocolsMemoizedSerializedSize = dataSize;
          }
          if (((bitField0_ & 0x00100000) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeMessageSize(22, getCompanionad21());
          }
          if (((bitField0_ & 0x00000200) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeBoolSize(23, skip_);
          }
          if (((bitField0_ & 0x00000400) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(24, skipmin_);
          }
          if (((bitField0_ & 0x00000800) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(25, skipafter_);
          }
          if (((bitField0_ & 0x00800000) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(26, placement_);
          }
          if (((bitField0_ & 0x02000000) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(27, playbackend_);
          }
          if (((bitField0_ & 0x00000080) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(28, maxseq_);
          }
          if (((bitField0_ & 0x00000100) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(29, poddur_);
          }
          if (((bitField0_ & 0x00200000) != 0)) {
            size += com.google.protobuf.GeneratedMessageV3.computeStringSize(30, podid_);
          }
          if (((bitField0_ & 0x00400000) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(31, podseq_);
          }
          {
            int dataSize = 0;
            for (int i = 0; i < rqddurs_.size(); i++) {
              dataSize += com.google.protobuf.CodedOutputStream
                .computeInt32SizeNoTag(rqddurs_.getInt(i));
            }
            size += dataSize;
            if (!getRqddursList().isEmpty()) {
              size += 2;
              size += com.google.protobuf.CodedOutputStream
                  .computeInt32SizeNoTag(dataSize);
            }
            rqddursMemoizedSerializedSize = dataSize;
          }
          if (((bitField0_ & 0x00002000) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(33, slotinpod_);
          }
          if (((bitField0_ & 0x00004000) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeDoubleSize(34, mincpmpersec_);
          }
          if (((bitField0_ & 0x01000000) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(35, plcmt_);
          }
          size += extensionsSerializedSize();
          size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video)) {
            return super.equals(obj);
          }
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video other = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video) obj;

          if (!getMimesList()
              .equals(other.getMimesList())) return false;
          if (hasLinearity() != other.hasLinearity()) return false;
          if (hasLinearity()) {
            if (getLinearity()
                != other.getLinearity()) return false;
          }
          if (hasMinduration() != other.hasMinduration()) return false;
          if (hasMinduration()) {
            if (getMinduration()
                != other.getMinduration()) return false;
          }
          if (hasMaxduration() != other.hasMaxduration()) return false;
          if (hasMaxduration()) {
            if (getMaxduration()
                != other.getMaxduration()) return false;
          }
          if (hasProtocol() != other.hasProtocol()) return false;
          if (hasProtocol()) {
            if (getProtocol()
                != other.getProtocol()) return false;
          }
          if (!getProtocolsList()
              .equals(other.getProtocolsList())) return false;
          if (hasW() != other.hasW()) return false;
          if (hasW()) {
            if (getW()
                != other.getW()) return false;
          }
          if (hasH() != other.hasH()) return false;
          if (hasH()) {
            if (getH()
                != other.getH()) return false;
          }
          if (hasStartdelay() != other.hasStartdelay()) return false;
          if (hasStartdelay()) {
            if (getStartdelay()
                != other.getStartdelay()) return false;
          }
          if (hasMaxseq() != other.hasMaxseq()) return false;
          if (hasMaxseq()) {
            if (getMaxseq()
                != other.getMaxseq()) return false;
          }
          if (hasPoddur() != other.hasPoddur()) return false;
          if (hasPoddur()) {
            if (getPoddur()
                != other.getPoddur()) return false;
          }
          if (hasSkip() != other.hasSkip()) return false;
          if (hasSkip()) {
            if (getSkip()
                != other.getSkip()) return false;
          }
          if (hasSkipmin() != other.hasSkipmin()) return false;
          if (hasSkipmin()) {
            if (getSkipmin()
                != other.getSkipmin()) return false;
          }
          if (hasSkipafter() != other.hasSkipafter()) return false;
          if (hasSkipafter()) {
            if (getSkipafter()
                != other.getSkipafter()) return false;
          }
          if (hasSequence() != other.hasSequence()) return false;
          if (hasSequence()) {
            if (getSequence()
                != other.getSequence()) return false;
          }
          if (hasSlotinpod() != other.hasSlotinpod()) return false;
          if (hasSlotinpod()) {
            if (getSlotinpod()
                != other.getSlotinpod()) return false;
          }
          if (hasMincpmpersec() != other.hasMincpmpersec()) return false;
          if (hasMincpmpersec()) {
            if (java.lang.Double.doubleToLongBits(getMincpmpersec())
                != java.lang.Double.doubleToLongBits(
                    other.getMincpmpersec())) return false;
          }
          if (!getBattrList()
              .equals(other.getBattrList())) return false;
          if (hasMaxextended() != other.hasMaxextended()) return false;
          if (hasMaxextended()) {
            if (getMaxextended()
                != other.getMaxextended()) return false;
          }
          if (hasMinbitrate() != other.hasMinbitrate()) return false;
          if (hasMinbitrate()) {
            if (getMinbitrate()
                != other.getMinbitrate()) return false;
          }
          if (hasMaxbitrate() != other.hasMaxbitrate()) return false;
          if (hasMaxbitrate()) {
            if (getMaxbitrate()
                != other.getMaxbitrate()) return false;
          }
          if (hasBoxingallowed() != other.hasBoxingallowed()) return false;
          if (hasBoxingallowed()) {
            if (getBoxingallowed()
                != other.getBoxingallowed()) return false;
          }
          if (!getPlaybackmethodList()
              .equals(other.getPlaybackmethodList())) return false;
          if (!getDeliveryList()
              .equals(other.getDeliveryList())) return false;
          if (hasPos() != other.hasPos()) return false;
          if (hasPos()) {
            if (getPos()
                != other.getPos()) return false;
          }
          if (!getCompanionadList()
              .equals(other.getCompanionadList())) return false;
          if (hasCompanionad21() != other.hasCompanionad21()) return false;
          if (hasCompanionad21()) {
            if (!getCompanionad21()
                .equals(other.getCompanionad21())) return false;
          }
          if (!getApiList()
              .equals(other.getApiList())) return false;
          if (!getCompaniontypeList()
              .equals(other.getCompaniontypeList())) return false;
          if (hasPodid() != other.hasPodid()) return false;
          if (hasPodid()) {
            if (!getPodid()
                .equals(other.getPodid())) return false;
          }
          if (hasPodseq() != other.hasPodseq()) return false;
          if (hasPodseq()) {
            if (getPodseq()
                != other.getPodseq()) return false;
          }
          if (!getRqddursList()
              .equals(other.getRqddursList())) return false;
          if (hasPlacement() != other.hasPlacement()) return false;
          if (hasPlacement()) {
            if (getPlacement()
                != other.getPlacement()) return false;
          }
          if (hasPlcmt() != other.hasPlcmt()) return false;
          if (hasPlcmt()) {
            if (getPlcmt()
                != other.getPlcmt()) return false;
          }
          if (hasPlaybackend() != other.hasPlaybackend()) return false;
          if (hasPlaybackend()) {
            if (getPlaybackend()
                != other.getPlaybackend()) return false;
          }
          if (!unknownFields.equals(other.unknownFields)) return false;
          if (!getExtensionFields().equals(other.getExtensionFields()))
            return false;
          return true;
        }

        @java.lang.Override
        public int hashCode() {
          if (memoizedHashCode != 0) {
            return memoizedHashCode;
          }
          int hash = 41;
          hash = (19 * hash) + getDescriptor().hashCode();
          if (getMimesCount() > 0) {
            hash = (37 * hash) + MIMES_FIELD_NUMBER;
            hash = (53 * hash) + getMimesList().hashCode();
          }
          if (hasLinearity()) {
            hash = (37 * hash) + LINEARITY_FIELD_NUMBER;
            hash = (53 * hash) + getLinearity();
          }
          if (hasMinduration()) {
            hash = (37 * hash) + MINDURATION_FIELD_NUMBER;
            hash = (53 * hash) + getMinduration();
          }
          if (hasMaxduration()) {
            hash = (37 * hash) + MAXDURATION_FIELD_NUMBER;
            hash = (53 * hash) + getMaxduration();
          }
          if (hasProtocol()) {
            hash = (37 * hash) + PROTOCOL_FIELD_NUMBER;
            hash = (53 * hash) + getProtocol();
          }
          if (getProtocolsCount() > 0) {
            hash = (37 * hash) + PROTOCOLS_FIELD_NUMBER;
            hash = (53 * hash) + getProtocolsList().hashCode();
          }
          if (hasW()) {
            hash = (37 * hash) + W_FIELD_NUMBER;
            hash = (53 * hash) + getW();
          }
          if (hasH()) {
            hash = (37 * hash) + H_FIELD_NUMBER;
            hash = (53 * hash) + getH();
          }
          if (hasStartdelay()) {
            hash = (37 * hash) + STARTDELAY_FIELD_NUMBER;
            hash = (53 * hash) + getStartdelay();
          }
          if (hasMaxseq()) {
            hash = (37 * hash) + MAXSEQ_FIELD_NUMBER;
            hash = (53 * hash) + getMaxseq();
          }
          if (hasPoddur()) {
            hash = (37 * hash) + PODDUR_FIELD_NUMBER;
            hash = (53 * hash) + getPoddur();
          }
          if (hasSkip()) {
            hash = (37 * hash) + SKIP_FIELD_NUMBER;
            hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
                getSkip());
          }
          if (hasSkipmin()) {
            hash = (37 * hash) + SKIPMIN_FIELD_NUMBER;
            hash = (53 * hash) + getSkipmin();
          }
          if (hasSkipafter()) {
            hash = (37 * hash) + SKIPAFTER_FIELD_NUMBER;
            hash = (53 * hash) + getSkipafter();
          }
          if (hasSequence()) {
            hash = (37 * hash) + SEQUENCE_FIELD_NUMBER;
            hash = (53 * hash) + getSequence();
          }
          if (hasSlotinpod()) {
            hash = (37 * hash) + SLOTINPOD_FIELD_NUMBER;
            hash = (53 * hash) + getSlotinpod();
          }
          if (hasMincpmpersec()) {
            hash = (37 * hash) + MINCPMPERSEC_FIELD_NUMBER;
            hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
                java.lang.Double.doubleToLongBits(getMincpmpersec()));
          }
          if (getBattrCount() > 0) {
            hash = (37 * hash) + BATTR_FIELD_NUMBER;
            hash = (53 * hash) + getBattrList().hashCode();
          }
          if (hasMaxextended()) {
            hash = (37 * hash) + MAXEXTENDED_FIELD_NUMBER;
            hash = (53 * hash) + getMaxextended();
          }
          if (hasMinbitrate()) {
            hash = (37 * hash) + MINBITRATE_FIELD_NUMBER;
            hash = (53 * hash) + getMinbitrate();
          }
          if (hasMaxbitrate()) {
            hash = (37 * hash) + MAXBITRATE_FIELD_NUMBER;
            hash = (53 * hash) + getMaxbitrate();
          }
          if (hasBoxingallowed()) {
            hash = (37 * hash) + BOXINGALLOWED_FIELD_NUMBER;
            hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
                getBoxingallowed());
          }
          if (getPlaybackmethodCount() > 0) {
            hash = (37 * hash) + PLAYBACKMETHOD_FIELD_NUMBER;
            hash = (53 * hash) + getPlaybackmethodList().hashCode();
          }
          if (getDeliveryCount() > 0) {
            hash = (37 * hash) + DELIVERY_FIELD_NUMBER;
            hash = (53 * hash) + getDeliveryList().hashCode();
          }
          if (hasPos()) {
            hash = (37 * hash) + POS_FIELD_NUMBER;
            hash = (53 * hash) + getPos();
          }
          if (getCompanionadCount() > 0) {
            hash = (37 * hash) + COMPANIONAD_FIELD_NUMBER;
            hash = (53 * hash) + getCompanionadList().hashCode();
          }
          if (hasCompanionad21()) {
            hash = (37 * hash) + COMPANIONAD_21_FIELD_NUMBER;
            hash = (53 * hash) + getCompanionad21().hashCode();
          }
          if (getApiCount() > 0) {
            hash = (37 * hash) + API_FIELD_NUMBER;
            hash = (53 * hash) + getApiList().hashCode();
          }
          if (getCompaniontypeCount() > 0) {
            hash = (37 * hash) + COMPANIONTYPE_FIELD_NUMBER;
            hash = (53 * hash) + getCompaniontypeList().hashCode();
          }
          if (hasPodid()) {
            hash = (37 * hash) + PODID_FIELD_NUMBER;
            hash = (53 * hash) + getPodid().hashCode();
          }
          if (hasPodseq()) {
            hash = (37 * hash) + PODSEQ_FIELD_NUMBER;
            hash = (53 * hash) + getPodseq();
          }
          if (getRqddursCount() > 0) {
            hash = (37 * hash) + RQDDURS_FIELD_NUMBER;
            hash = (53 * hash) + getRqddursList().hashCode();
          }
          if (hasPlacement()) {
            hash = (37 * hash) + PLACEMENT_FIELD_NUMBER;
            hash = (53 * hash) + getPlacement();
          }
          if (hasPlcmt()) {
            hash = (37 * hash) + PLCMT_FIELD_NUMBER;
            hash = (53 * hash) + getPlcmt();
          }
          if (hasPlaybackend()) {
            hash = (37 * hash) + PLAYBACKEND_FIELD_NUMBER;
            hash = (53 * hash) + getPlaybackend();
          }
          hash = hashFields(hash, getExtensionFields());
          hash = (29 * hash) + unknownFields.hashCode();
          memoizedHashCode = hash;
          return hash;
        }

        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video parseFrom(
            java.nio.ByteBuffer data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video parseFrom(
            java.nio.ByteBuffer data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video parseFrom(
            com.google.protobuf.ByteString data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video parseFrom(
            com.google.protobuf.ByteString data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video parseFrom(byte[] data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video parseFrom(
            byte[] data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video parseFrom(java.io.InputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video parseDelimitedFrom(java.io.InputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseDelimitedWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video parseFrom(
            com.google.protobuf.CodedInputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video 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>
         * OpenRTB 2.0: This object represents an in-stream video impression.
         * Many of the fields are non-essential for minimally viable transactions,
         * but are included to offer fine control when needed. Video in OpenRTB
         * generally assumes compliance with the VAST standard. As such, the notion
         * of companion ads is supported by optionally including an array of Banner
         * objects (refer to the Banner object in Section 3.2.3) that define these
         * companion ads.
         * The presence of a Video as a subordinate of the Imp object indicates
         * that this impression is offered as a video type impression. At the
         * publisher's discretion, that same impression may also be offered as
         * banner and/or native by also including as Imp subordinates the Banner
         * and/or Native objects, respectively. However, any given bid for the
         * impression must conform to one of the offered types.
         * </pre>
         *
         * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Imp.Video}
         */
        public static final class Builder extends
            com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video, Builder> implements
            // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.BidRequest.Imp.Video)
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.VideoOrBuilder {
          public static final com.google.protobuf.Descriptors.Descriptor
              getDescriptor() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Video_descriptor;
          }

          @java.lang.Override
          protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
              internalGetFieldAccessorTable() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Video_fieldAccessorTable
                .ensureFieldAccessorsInitialized(
                    com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.Builder.class);
          }

          // Construct using com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.newBuilder()
          private Builder() {
            maybeForceBuilderInitialization();
          }

          private Builder(
              com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
            super(parent);
            maybeForceBuilderInitialization();
          }
          private void maybeForceBuilderInitialization() {
            if (com.google.protobuf.GeneratedMessageV3
                    .alwaysUseFieldBuilders) {
              getCompanionadFieldBuilder();
              getCompanionad21FieldBuilder();
            }
          }
          @java.lang.Override
          public Builder clear() {
            super.clear();
            mimes_ = com.google.protobuf.LazyStringArrayList.EMPTY;
            bitField0_ = (bitField0_ & ~0x00000001);
            linearity_ = 0;
            bitField0_ = (bitField0_ & ~0x00000002);
            minduration_ = 0;
            bitField0_ = (bitField0_ & ~0x00000004);
            maxduration_ = 0;
            bitField0_ = (bitField0_ & ~0x00000008);
            protocol_ = 0;
            bitField0_ = (bitField0_ & ~0x00000010);
            protocols_ = emptyIntList();
            bitField0_ = (bitField0_ & ~0x00000020);
            w_ = 0;
            bitField0_ = (bitField0_ & ~0x00000040);
            h_ = 0;
            bitField0_ = (bitField0_ & ~0x00000080);
            startdelay_ = 0;
            bitField0_ = (bitField0_ & ~0x00000100);
            maxseq_ = 0;
            bitField0_ = (bitField0_ & ~0x00000200);
            poddur_ = 0;
            bitField0_ = (bitField0_ & ~0x00000400);
            skip_ = false;
            bitField0_ = (bitField0_ & ~0x00000800);
            skipmin_ = 0;
            bitField0_ = (bitField0_ & ~0x00001000);
            skipafter_ = 0;
            bitField0_ = (bitField0_ & ~0x00002000);
            sequence_ = 1;
            bitField0_ = (bitField0_ & ~0x00004000);
            slotinpod_ = 0;
            bitField0_ = (bitField0_ & ~0x00008000);
            mincpmpersec_ = 0D;
            bitField0_ = (bitField0_ & ~0x00010000);
            battr_ = emptyIntList();
            bitField0_ = (bitField0_ & ~0x00020000);
            maxextended_ = 0;
            bitField0_ = (bitField0_ & ~0x00040000);
            minbitrate_ = 0;
            bitField0_ = (bitField0_ & ~0x00080000);
            maxbitrate_ = 0;
            bitField0_ = (bitField0_ & ~0x00100000);
            boxingallowed_ = true;
            bitField0_ = (bitField0_ & ~0x00200000);
            playbackmethod_ = emptyIntList();
            bitField0_ = (bitField0_ & ~0x00400000);
            delivery_ = emptyIntList();
            bitField0_ = (bitField0_ & ~0x00800000);
            pos_ = 0;
            bitField0_ = (bitField0_ & ~0x01000000);
            if (companionadBuilder_ == null) {
              companionad_ = java.util.Collections.emptyList();
              bitField0_ = (bitField0_ & ~0x02000000);
            } else {
              companionadBuilder_.clear();
            }
            if (companionad21Builder_ == null) {
              companionad21_ = null;
            } else {
              companionad21Builder_.clear();
            }
            bitField0_ = (bitField0_ & ~0x04000000);
            api_ = emptyIntList();
            bitField0_ = (bitField0_ & ~0x08000000);
            companiontype_ = emptyIntList();
            bitField0_ = (bitField0_ & ~0x10000000);
            podid_ = "";
            bitField0_ = (bitField0_ & ~0x20000000);
            podseq_ = 0;
            bitField0_ = (bitField0_ & ~0x40000000);
            rqddurs_ = emptyIntList();
            bitField0_ = (bitField0_ & ~0x80000000);
            placement_ = 0;
            bitField1_ = (bitField1_ & ~0x00000001);
            plcmt_ = 0;
            bitField1_ = (bitField1_ & ~0x00000002);
            playbackend_ = 0;
            bitField1_ = (bitField1_ & ~0x00000004);
            return this;
          }

          @java.lang.Override
          public com.google.protobuf.Descriptors.Descriptor
              getDescriptorForType() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Video_descriptor;
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video getDefaultInstanceForType() {
            return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.getDefaultInstance();
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video build() {
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video result = buildPartial();
            if (!result.isInitialized()) {
              throw newUninitializedMessageException(result);
            }
            return result;
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video buildPartial() {
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video result = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video(this);
            int from_bitField0_ = bitField0_;
            int from_bitField1_ = bitField1_;
            int to_bitField0_ = 0;
            if (((bitField0_ & 0x00000001) != 0)) {
              mimes_ = mimes_.getUnmodifiableView();
              bitField0_ = (bitField0_ & ~0x00000001);
            }
            result.mimes_ = mimes_;
            if (((from_bitField0_ & 0x00000002) != 0)) {
              result.linearity_ = linearity_;
              to_bitField0_ |= 0x00000001;
            }
            if (((from_bitField0_ & 0x00000004) != 0)) {
              result.minduration_ = minduration_;
              to_bitField0_ |= 0x00000002;
            }
            if (((from_bitField0_ & 0x00000008) != 0)) {
              result.maxduration_ = maxduration_;
              to_bitField0_ |= 0x00000004;
            }
            if (((from_bitField0_ & 0x00000010) != 0)) {
              result.protocol_ = protocol_;
              to_bitField0_ |= 0x00000008;
            }
            if (((bitField0_ & 0x00000020) != 0)) {
              protocols_.makeImmutable();
              bitField0_ = (bitField0_ & ~0x00000020);
            }
            result.protocols_ = protocols_;
            if (((from_bitField0_ & 0x00000040) != 0)) {
              result.w_ = w_;
              to_bitField0_ |= 0x00000010;
            }
            if (((from_bitField0_ & 0x00000080) != 0)) {
              result.h_ = h_;
              to_bitField0_ |= 0x00000020;
            }
            if (((from_bitField0_ & 0x00000100) != 0)) {
              result.startdelay_ = startdelay_;
              to_bitField0_ |= 0x00000040;
            }
            if (((from_bitField0_ & 0x00000200) != 0)) {
              result.maxseq_ = maxseq_;
              to_bitField0_ |= 0x00000080;
            }
            if (((from_bitField0_ & 0x00000400) != 0)) {
              result.poddur_ = poddur_;
              to_bitField0_ |= 0x00000100;
            }
            if (((from_bitField0_ & 0x00000800) != 0)) {
              result.skip_ = skip_;
              to_bitField0_ |= 0x00000200;
            }
            if (((from_bitField0_ & 0x00001000) != 0)) {
              result.skipmin_ = skipmin_;
              to_bitField0_ |= 0x00000400;
            }
            if (((from_bitField0_ & 0x00002000) != 0)) {
              result.skipafter_ = skipafter_;
              to_bitField0_ |= 0x00000800;
            }
            if (((from_bitField0_ & 0x00004000) != 0)) {
              to_bitField0_ |= 0x00001000;
            }
            result.sequence_ = sequence_;
            if (((from_bitField0_ & 0x00008000) != 0)) {
              result.slotinpod_ = slotinpod_;
              to_bitField0_ |= 0x00002000;
            }
            if (((from_bitField0_ & 0x00010000) != 0)) {
              result.mincpmpersec_ = mincpmpersec_;
              to_bitField0_ |= 0x00004000;
            }
            if (((bitField0_ & 0x00020000) != 0)) {
              battr_.makeImmutable();
              bitField0_ = (bitField0_ & ~0x00020000);
            }
            result.battr_ = battr_;
            if (((from_bitField0_ & 0x00040000) != 0)) {
              result.maxextended_ = maxextended_;
              to_bitField0_ |= 0x00008000;
            }
            if (((from_bitField0_ & 0x00080000) != 0)) {
              result.minbitrate_ = minbitrate_;
              to_bitField0_ |= 0x00010000;
            }
            if (((from_bitField0_ & 0x00100000) != 0)) {
              result.maxbitrate_ = maxbitrate_;
              to_bitField0_ |= 0x00020000;
            }
            if (((from_bitField0_ & 0x00200000) != 0)) {
              to_bitField0_ |= 0x00040000;
            }
            result.boxingallowed_ = boxingallowed_;
            if (((bitField0_ & 0x00400000) != 0)) {
              playbackmethod_.makeImmutable();
              bitField0_ = (bitField0_ & ~0x00400000);
            }
            result.playbackmethod_ = playbackmethod_;
            if (((bitField0_ & 0x00800000) != 0)) {
              delivery_.makeImmutable();
              bitField0_ = (bitField0_ & ~0x00800000);
            }
            result.delivery_ = delivery_;
            if (((from_bitField0_ & 0x01000000) != 0)) {
              result.pos_ = pos_;
              to_bitField0_ |= 0x00080000;
            }
            if (companionadBuilder_ == null) {
              if (((bitField0_ & 0x02000000) != 0)) {
                companionad_ = java.util.Collections.unmodifiableList(companionad_);
                bitField0_ = (bitField0_ & ~0x02000000);
              }
              result.companionad_ = companionad_;
            } else {
              result.companionad_ = companionadBuilder_.build();
            }
            if (((from_bitField0_ & 0x04000000) != 0)) {
              if (companionad21Builder_ == null) {
                result.companionad21_ = companionad21_;
              } else {
                result.companionad21_ = companionad21Builder_.build();
              }
              to_bitField0_ |= 0x00100000;
            }
            if (((bitField0_ & 0x08000000) != 0)) {
              api_.makeImmutable();
              bitField0_ = (bitField0_ & ~0x08000000);
            }
            result.api_ = api_;
            if (((bitField0_ & 0x10000000) != 0)) {
              companiontype_.makeImmutable();
              bitField0_ = (bitField0_ & ~0x10000000);
            }
            result.companiontype_ = companiontype_;
            if (((from_bitField0_ & 0x20000000) != 0)) {
              to_bitField0_ |= 0x00200000;
            }
            result.podid_ = podid_;
            if (((from_bitField0_ & 0x40000000) != 0)) {
              result.podseq_ = podseq_;
              to_bitField0_ |= 0x00400000;
            }
            if (((bitField0_ & 0x80000000) != 0)) {
              rqddurs_.makeImmutable();
              bitField0_ = (bitField0_ & ~0x80000000);
            }
            result.rqddurs_ = rqddurs_;
            if (((from_bitField1_ & 0x00000001) != 0)) {
              result.placement_ = placement_;
              to_bitField0_ |= 0x00800000;
            }
            if (((from_bitField1_ & 0x00000002) != 0)) {
              result.plcmt_ = plcmt_;
              to_bitField0_ |= 0x01000000;
            }
            if (((from_bitField1_ & 0x00000004) != 0)) {
              result.playbackend_ = playbackend_;
              to_bitField0_ |= 0x02000000;
            }
            result.bitField0_ = to_bitField0_;
            onBuilt();
            return result;
          }

          @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 <Type> Builder setExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video, Type> extension,
              Type value) {
            return super.setExtension(extension, value);
          }
          @java.lang.Override
          public <Type> Builder setExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video, java.util.List<Type>> extension,
              int index, Type value) {
            return super.setExtension(extension, index, value);
          }
          @java.lang.Override
          public <Type> Builder addExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video, java.util.List<Type>> extension,
              Type value) {
            return super.addExtension(extension, value);
          }
          @java.lang.Override
          public <Type> Builder clearExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video, ?> extension) {
            return super.clearExtension(extension);
          }
          @java.lang.Override
          public Builder mergeFrom(com.google.protobuf.Message other) {
            if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video) {
              return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video)other);
            } else {
              super.mergeFrom(other);
              return this;
            }
          }

          public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video other) {
            if (other == com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.getDefaultInstance()) return this;
            if (!other.mimes_.isEmpty()) {
              if (mimes_.isEmpty()) {
                mimes_ = other.mimes_;
                bitField0_ = (bitField0_ & ~0x00000001);
              } else {
                ensureMimesIsMutable();
                mimes_.addAll(other.mimes_);
              }
              onChanged();
            }
            if (other.hasLinearity()) {
              setLinearity(other.getLinearity());
            }
            if (other.hasMinduration()) {
              setMinduration(other.getMinduration());
            }
            if (other.hasMaxduration()) {
              setMaxduration(other.getMaxduration());
            }
            if (other.hasProtocol()) {
              setProtocol(other.getProtocol());
            }
            if (!other.protocols_.isEmpty()) {
              if (protocols_.isEmpty()) {
                protocols_ = other.protocols_;
                bitField0_ = (bitField0_ & ~0x00000020);
              } else {
                ensureProtocolsIsMutable();
                protocols_.addAll(other.protocols_);
              }
              onChanged();
            }
            if (other.hasW()) {
              setW(other.getW());
            }
            if (other.hasH()) {
              setH(other.getH());
            }
            if (other.hasStartdelay()) {
              setStartdelay(other.getStartdelay());
            }
            if (other.hasMaxseq()) {
              setMaxseq(other.getMaxseq());
            }
            if (other.hasPoddur()) {
              setPoddur(other.getPoddur());
            }
            if (other.hasSkip()) {
              setSkip(other.getSkip());
            }
            if (other.hasSkipmin()) {
              setSkipmin(other.getSkipmin());
            }
            if (other.hasSkipafter()) {
              setSkipafter(other.getSkipafter());
            }
            if (other.hasSequence()) {
              setSequence(other.getSequence());
            }
            if (other.hasSlotinpod()) {
              setSlotinpod(other.getSlotinpod());
            }
            if (other.hasMincpmpersec()) {
              setMincpmpersec(other.getMincpmpersec());
            }
            if (!other.battr_.isEmpty()) {
              if (battr_.isEmpty()) {
                battr_ = other.battr_;
                bitField0_ = (bitField0_ & ~0x00020000);
              } else {
                ensureBattrIsMutable();
                battr_.addAll(other.battr_);
              }
              onChanged();
            }
            if (other.hasMaxextended()) {
              setMaxextended(other.getMaxextended());
            }
            if (other.hasMinbitrate()) {
              setMinbitrate(other.getMinbitrate());
            }
            if (other.hasMaxbitrate()) {
              setMaxbitrate(other.getMaxbitrate());
            }
            if (other.hasBoxingallowed()) {
              setBoxingallowed(other.getBoxingallowed());
            }
            if (!other.playbackmethod_.isEmpty()) {
              if (playbackmethod_.isEmpty()) {
                playbackmethod_ = other.playbackmethod_;
                bitField0_ = (bitField0_ & ~0x00400000);
              } else {
                ensurePlaybackmethodIsMutable();
                playbackmethod_.addAll(other.playbackmethod_);
              }
              onChanged();
            }
            if (!other.delivery_.isEmpty()) {
              if (delivery_.isEmpty()) {
                delivery_ = other.delivery_;
                bitField0_ = (bitField0_ & ~0x00800000);
              } else {
                ensureDeliveryIsMutable();
                delivery_.addAll(other.delivery_);
              }
              onChanged();
            }
            if (other.hasPos()) {
              setPos(other.getPos());
            }
            if (companionadBuilder_ == null) {
              if (!other.companionad_.isEmpty()) {
                if (companionad_.isEmpty()) {
                  companionad_ = other.companionad_;
                  bitField0_ = (bitField0_ & ~0x02000000);
                } else {
                  ensureCompanionadIsMutable();
                  companionad_.addAll(other.companionad_);
                }
                onChanged();
              }
            } else {
              if (!other.companionad_.isEmpty()) {
                if (companionadBuilder_.isEmpty()) {
                  companionadBuilder_.dispose();
                  companionadBuilder_ = null;
                  companionad_ = other.companionad_;
                  bitField0_ = (bitField0_ & ~0x02000000);
                  companionadBuilder_ = 
                    com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
                       getCompanionadFieldBuilder() : null;
                } else {
                  companionadBuilder_.addAllMessages(other.companionad_);
                }
              }
            }
            if (other.hasCompanionad21()) {
              mergeCompanionad21(other.getCompanionad21());
            }
            if (!other.api_.isEmpty()) {
              if (api_.isEmpty()) {
                api_ = other.api_;
                bitField0_ = (bitField0_ & ~0x08000000);
              } else {
                ensureApiIsMutable();
                api_.addAll(other.api_);
              }
              onChanged();
            }
            if (!other.companiontype_.isEmpty()) {
              if (companiontype_.isEmpty()) {
                companiontype_ = other.companiontype_;
                bitField0_ = (bitField0_ & ~0x10000000);
              } else {
                ensureCompaniontypeIsMutable();
                companiontype_.addAll(other.companiontype_);
              }
              onChanged();
            }
            if (other.hasPodid()) {
              bitField0_ |= 0x20000000;
              podid_ = other.podid_;
              onChanged();
            }
            if (other.hasPodseq()) {
              setPodseq(other.getPodseq());
            }
            if (!other.rqddurs_.isEmpty()) {
              if (rqddurs_.isEmpty()) {
                rqddurs_ = other.rqddurs_;
                bitField0_ = (bitField0_ & ~0x80000000);
              } else {
                ensureRqddursIsMutable();
                rqddurs_.addAll(other.rqddurs_);
              }
              onChanged();
            }
            if (other.hasPlacement()) {
              setPlacement(other.getPlacement());
            }
            if (other.hasPlcmt()) {
              setPlcmt(other.getPlcmt());
            }
            if (other.hasPlaybackend()) {
              setPlaybackend(other.getPlaybackend());
            }
            this.mergeExtensionFields(other);
            this.mergeUnknownFields(other.unknownFields);
            onChanged();
            return this;
          }

          @java.lang.Override
          public final boolean isInitialized() {
            for (int i = 0; i < getCompanionadCount(); i++) {
              if (!getCompanionad(i).isInitialized()) {
                return false;
              }
            }
            if (hasCompanionad21()) {
              if (!getCompanionad21().isInitialized()) {
                return false;
              }
            }
            if (!extensionsAreInitialized()) {
              return false;
            }
            return true;
          }

          @java.lang.Override
          public Builder mergeFrom(
              com.google.protobuf.CodedInputStream input,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video parsedMessage = null;
            try {
              parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
              parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video) e.getUnfinishedMessage();
              throw e.unwrapIOException();
            } finally {
              if (parsedMessage != null) {
                mergeFrom(parsedMessage);
              }
            }
            return this;
          }
          private int bitField0_;
          private int bitField1_;

          private com.google.protobuf.LazyStringList mimes_ = com.google.protobuf.LazyStringArrayList.EMPTY;
          private void ensureMimesIsMutable() {
            if (!((bitField0_ & 0x00000001) != 0)) {
              mimes_ = new com.google.protobuf.LazyStringArrayList(mimes_);
              bitField0_ |= 0x00000001;
             }
          }
          /**
           * <pre>
           * Whitelist of content MIME types supported. Popular MIME types include,
           * but are not limited to "image/jpg", "image/gif" and
           * "application/x-shockwave-flash".
           * REQUIRED by the OpenRTB specification: at least 1 element.
           * </pre>
           *
           * <code>repeated string mimes = 1;</code>
           * @return A list containing the mimes.
           */
          public com.google.protobuf.ProtocolStringList
              getMimesList() {
            return mimes_.getUnmodifiableView();
          }
          /**
           * <pre>
           * Whitelist of content MIME types supported. Popular MIME types include,
           * but are not limited to "image/jpg", "image/gif" and
           * "application/x-shockwave-flash".
           * REQUIRED by the OpenRTB specification: at least 1 element.
           * </pre>
           *
           * <code>repeated string mimes = 1;</code>
           * @return The count of mimes.
           */
          public int getMimesCount() {
            return mimes_.size();
          }
          /**
           * <pre>
           * Whitelist of content MIME types supported. Popular MIME types include,
           * but are not limited to "image/jpg", "image/gif" and
           * "application/x-shockwave-flash".
           * REQUIRED by the OpenRTB specification: at least 1 element.
           * </pre>
           *
           * <code>repeated string mimes = 1;</code>
           * @param index The index of the element to return.
           * @return The mimes at the given index.
           */
          public java.lang.String getMimes(int index) {
            return mimes_.get(index);
          }
          /**
           * <pre>
           * Whitelist of content MIME types supported. Popular MIME types include,
           * but are not limited to "image/jpg", "image/gif" and
           * "application/x-shockwave-flash".
           * REQUIRED by the OpenRTB specification: at least 1 element.
           * </pre>
           *
           * <code>repeated string mimes = 1;</code>
           * @param index The index of the value to return.
           * @return The bytes of the mimes at the given index.
           */
          public com.google.protobuf.ByteString
              getMimesBytes(int index) {
            return mimes_.getByteString(index);
          }
          /**
           * <pre>
           * Whitelist of content MIME types supported. Popular MIME types include,
           * but are not limited to "image/jpg", "image/gif" and
           * "application/x-shockwave-flash".
           * REQUIRED by the OpenRTB specification: at least 1 element.
           * </pre>
           *
           * <code>repeated string mimes = 1;</code>
           * @param index The index to set the value at.
           * @param value The mimes to set.
           * @return This builder for chaining.
           */
          public Builder setMimes(
              int index, java.lang.String value) {
            if (value == null) {
    throw new NullPointerException();
  }
  ensureMimesIsMutable();
            mimes_.set(index, value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Whitelist of content MIME types supported. Popular MIME types include,
           * but are not limited to "image/jpg", "image/gif" and
           * "application/x-shockwave-flash".
           * REQUIRED by the OpenRTB specification: at least 1 element.
           * </pre>
           *
           * <code>repeated string mimes = 1;</code>
           * @param value The mimes to add.
           * @return This builder for chaining.
           */
          public Builder addMimes(
              java.lang.String value) {
            if (value == null) {
    throw new NullPointerException();
  }
  ensureMimesIsMutable();
            mimes_.add(value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Whitelist of content MIME types supported. Popular MIME types include,
           * but are not limited to "image/jpg", "image/gif" and
           * "application/x-shockwave-flash".
           * REQUIRED by the OpenRTB specification: at least 1 element.
           * </pre>
           *
           * <code>repeated string mimes = 1;</code>
           * @param values The mimes to add.
           * @return This builder for chaining.
           */
          public Builder addAllMimes(
              java.lang.Iterable<java.lang.String> values) {
            ensureMimesIsMutable();
            com.google.protobuf.AbstractMessageLite.Builder.addAll(
                values, mimes_);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Whitelist of content MIME types supported. Popular MIME types include,
           * but are not limited to "image/jpg", "image/gif" and
           * "application/x-shockwave-flash".
           * REQUIRED by the OpenRTB specification: at least 1 element.
           * </pre>
           *
           * <code>repeated string mimes = 1;</code>
           * @return This builder for chaining.
           */
          public Builder clearMimes() {
            mimes_ = com.google.protobuf.LazyStringArrayList.EMPTY;
            bitField0_ = (bitField0_ & ~0x00000001);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Whitelist of content MIME types supported. Popular MIME types include,
           * but are not limited to "image/jpg", "image/gif" and
           * "application/x-shockwave-flash".
           * REQUIRED by the OpenRTB specification: at least 1 element.
           * </pre>
           *
           * <code>repeated string mimes = 1;</code>
           * @param value The bytes of the mimes to add.
           * @return This builder for chaining.
           */
          public Builder addMimesBytes(
              com.google.protobuf.ByteString value) {
            if (value == null) {
    throw new NullPointerException();
  }
  ensureMimesIsMutable();
            mimes_.add(value);
            onChanged();
            return this;
          }

          private int linearity_ ;
          /**
           * <pre>
           * Indicates if the impression must be linear, nonlinear, etc.
           * If none specified, assume all are allowed.
           * Refer to enum com.iabtechlab.adcom.v1.enums.LinearityMode for generic values.
           * </pre>
           *
           * <code>optional int32 linearity = 2;</code>
           * @return Whether the linearity field is set.
           */
          @java.lang.Override
          public boolean hasLinearity() {
            return ((bitField0_ & 0x00000002) != 0);
          }
          /**
           * <pre>
           * Indicates if the impression must be linear, nonlinear, etc.
           * If none specified, assume all are allowed.
           * Refer to enum com.iabtechlab.adcom.v1.enums.LinearityMode for generic values.
           * </pre>
           *
           * <code>optional int32 linearity = 2;</code>
           * @return The linearity.
           */
          @java.lang.Override
          public int getLinearity() {
            return linearity_;
          }
          /**
           * <pre>
           * Indicates if the impression must be linear, nonlinear, etc.
           * If none specified, assume all are allowed.
           * Refer to enum com.iabtechlab.adcom.v1.enums.LinearityMode for generic values.
           * </pre>
           *
           * <code>optional int32 linearity = 2;</code>
           * @param value The linearity to set.
           * @return This builder for chaining.
           */
          public Builder setLinearity(int value) {
            bitField0_ |= 0x00000002;
            linearity_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Indicates if the impression must be linear, nonlinear, etc.
           * If none specified, assume all are allowed.
           * Refer to enum com.iabtechlab.adcom.v1.enums.LinearityMode for generic values.
           * </pre>
           *
           * <code>optional int32 linearity = 2;</code>
           * @return This builder for chaining.
           */
          public Builder clearLinearity() {
            bitField0_ = (bitField0_ & ~0x00000002);
            linearity_ = 0;
            onChanged();
            return this;
          }

          private int minduration_ ;
          /**
           * <pre>
           * Minimum video ad duration in seconds.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional int32 minduration = 3;</code>
           * @return Whether the minduration field is set.
           */
          @java.lang.Override
          public boolean hasMinduration() {
            return ((bitField0_ & 0x00000004) != 0);
          }
          /**
           * <pre>
           * Minimum video ad duration in seconds.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional int32 minduration = 3;</code>
           * @return The minduration.
           */
          @java.lang.Override
          public int getMinduration() {
            return minduration_;
          }
          /**
           * <pre>
           * Minimum video ad duration in seconds.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional int32 minduration = 3;</code>
           * @param value The minduration to set.
           * @return This builder for chaining.
           */
          public Builder setMinduration(int value) {
            bitField0_ |= 0x00000004;
            minduration_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Minimum video ad duration in seconds.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional int32 minduration = 3;</code>
           * @return This builder for chaining.
           */
          public Builder clearMinduration() {
            bitField0_ = (bitField0_ & ~0x00000004);
            minduration_ = 0;
            onChanged();
            return this;
          }

          private int maxduration_ ;
          /**
           * <pre>
           * Maximum video ad duration in seconds.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional int32 maxduration = 4;</code>
           * @return Whether the maxduration field is set.
           */
          @java.lang.Override
          public boolean hasMaxduration() {
            return ((bitField0_ & 0x00000008) != 0);
          }
          /**
           * <pre>
           * Maximum video ad duration in seconds.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional int32 maxduration = 4;</code>
           * @return The maxduration.
           */
          @java.lang.Override
          public int getMaxduration() {
            return maxduration_;
          }
          /**
           * <pre>
           * Maximum video ad duration in seconds.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional int32 maxduration = 4;</code>
           * @param value The maxduration to set.
           * @return This builder for chaining.
           */
          public Builder setMaxduration(int value) {
            bitField0_ |= 0x00000008;
            maxduration_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Maximum video ad duration in seconds.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional int32 maxduration = 4;</code>
           * @return This builder for chaining.
           */
          public Builder clearMaxduration() {
            bitField0_ = (bitField0_ & ~0x00000008);
            maxduration_ = 0;
            onChanged();
            return this;
          }

          private int protocol_ ;
          /**
           * <pre>
           * Deprecated; use protocols.
           * Refer to enum com.iabtechlab.adcom.v1.Creative.AudioVideoType for generic values.
           * </pre>
           *
           * <code>optional int32 protocol = 5 [deprecated = true];</code>
           * @return Whether the protocol field is set.
           */
          @java.lang.Override
          @java.lang.Deprecated public boolean hasProtocol() {
            return ((bitField0_ & 0x00000010) != 0);
          }
          /**
           * <pre>
           * Deprecated; use protocols.
           * Refer to enum com.iabtechlab.adcom.v1.Creative.AudioVideoType for generic values.
           * </pre>
           *
           * <code>optional int32 protocol = 5 [deprecated = true];</code>
           * @return The protocol.
           */
          @java.lang.Override
          @java.lang.Deprecated public int getProtocol() {
            return protocol_;
          }
          /**
           * <pre>
           * Deprecated; use protocols.
           * Refer to enum com.iabtechlab.adcom.v1.Creative.AudioVideoType for generic values.
           * </pre>
           *
           * <code>optional int32 protocol = 5 [deprecated = true];</code>
           * @param value The protocol to set.
           * @return This builder for chaining.
           */
          @java.lang.Deprecated public Builder setProtocol(int value) {
            bitField0_ |= 0x00000010;
            protocol_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Deprecated; use protocols.
           * Refer to enum com.iabtechlab.adcom.v1.Creative.AudioVideoType for generic values.
           * </pre>
           *
           * <code>optional int32 protocol = 5 [deprecated = true];</code>
           * @return This builder for chaining.
           */
          @java.lang.Deprecated public Builder clearProtocol() {
            bitField0_ = (bitField0_ & ~0x00000010);
            protocol_ = 0;
            onChanged();
            return this;
          }

          private com.google.protobuf.Internal.IntList protocols_ = emptyIntList();
          private void ensureProtocolsIsMutable() {
            if (!((bitField0_ & 0x00000020) != 0)) {
              protocols_ = mutableCopy(protocols_);
              bitField0_ |= 0x00000020;
             }
          }
          /**
           * <pre>
           * Array of supported video bid response protocols.
           * At least one supported protocol must be specified.
           * Refer to enum com.iabtechlab.adcom.v1.Creative.AudioVideoType for generic values.
           * </pre>
           *
           * <code>repeated int32 protocols = 21 [packed = true];</code>
           * @return A list containing the protocols.
           */
          public java.util.List<java.lang.Integer>
              getProtocolsList() {
            return ((bitField0_ & 0x00000020) != 0) ?
                     java.util.Collections.unmodifiableList(protocols_) : protocols_;
          }
          /**
           * <pre>
           * Array of supported video bid response protocols.
           * At least one supported protocol must be specified.
           * Refer to enum com.iabtechlab.adcom.v1.Creative.AudioVideoType for generic values.
           * </pre>
           *
           * <code>repeated int32 protocols = 21 [packed = true];</code>
           * @return The count of protocols.
           */
          public int getProtocolsCount() {
            return protocols_.size();
          }
          /**
           * <pre>
           * Array of supported video bid response protocols.
           * At least one supported protocol must be specified.
           * Refer to enum com.iabtechlab.adcom.v1.Creative.AudioVideoType for generic values.
           * </pre>
           *
           * <code>repeated int32 protocols = 21 [packed = true];</code>
           * @param index The index of the element to return.
           * @return The protocols at the given index.
           */
          public int getProtocols(int index) {
            return protocols_.getInt(index);
          }
          /**
           * <pre>
           * Array of supported video bid response protocols.
           * At least one supported protocol must be specified.
           * Refer to enum com.iabtechlab.adcom.v1.Creative.AudioVideoType for generic values.
           * </pre>
           *
           * <code>repeated int32 protocols = 21 [packed = true];</code>
           * @param index The index to set the value at.
           * @param value The protocols to set.
           * @return This builder for chaining.
           */
          public Builder setProtocols(
              int index, int value) {
            ensureProtocolsIsMutable();
            protocols_.setInt(index, value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Array of supported video bid response protocols.
           * At least one supported protocol must be specified.
           * Refer to enum com.iabtechlab.adcom.v1.Creative.AudioVideoType for generic values.
           * </pre>
           *
           * <code>repeated int32 protocols = 21 [packed = true];</code>
           * @param value The protocols to add.
           * @return This builder for chaining.
           */
          public Builder addProtocols(int value) {
            ensureProtocolsIsMutable();
            protocols_.addInt(value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Array of supported video bid response protocols.
           * At least one supported protocol must be specified.
           * Refer to enum com.iabtechlab.adcom.v1.Creative.AudioVideoType for generic values.
           * </pre>
           *
           * <code>repeated int32 protocols = 21 [packed = true];</code>
           * @param values The protocols to add.
           * @return This builder for chaining.
           */
          public Builder addAllProtocols(
              java.lang.Iterable<? extends java.lang.Integer> values) {
            ensureProtocolsIsMutable();
            com.google.protobuf.AbstractMessageLite.Builder.addAll(
                values, protocols_);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Array of supported video bid response protocols.
           * At least one supported protocol must be specified.
           * Refer to enum com.iabtechlab.adcom.v1.Creative.AudioVideoType for generic values.
           * </pre>
           *
           * <code>repeated int32 protocols = 21 [packed = true];</code>
           * @return This builder for chaining.
           */
          public Builder clearProtocols() {
            protocols_ = emptyIntList();
            bitField0_ = (bitField0_ & ~0x00000020);
            onChanged();
            return this;
          }

          private int w_ ;
          /**
           * <pre>
           * Width of the video player in device independent pixels (DIPS).
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional int32 w = 6;</code>
           * @return Whether the w field is set.
           */
          @java.lang.Override
          public boolean hasW() {
            return ((bitField0_ & 0x00000040) != 0);
          }
          /**
           * <pre>
           * Width of the video player in device independent pixels (DIPS).
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional int32 w = 6;</code>
           * @return The w.
           */
          @java.lang.Override
          public int getW() {
            return w_;
          }
          /**
           * <pre>
           * Width of the video player in device independent pixels (DIPS).
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional int32 w = 6;</code>
           * @param value The w to set.
           * @return This builder for chaining.
           */
          public Builder setW(int value) {
            bitField0_ |= 0x00000040;
            w_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Width of the video player in device independent pixels (DIPS).
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional int32 w = 6;</code>
           * @return This builder for chaining.
           */
          public Builder clearW() {
            bitField0_ = (bitField0_ & ~0x00000040);
            w_ = 0;
            onChanged();
            return this;
          }

          private int h_ ;
          /**
           * <pre>
           * Height of the video player in device independent pixels (DIPS).
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional int32 h = 7;</code>
           * @return Whether the h field is set.
           */
          @java.lang.Override
          public boolean hasH() {
            return ((bitField0_ & 0x00000080) != 0);
          }
          /**
           * <pre>
           * Height of the video player in device independent pixels (DIPS).
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional int32 h = 7;</code>
           * @return The h.
           */
          @java.lang.Override
          public int getH() {
            return h_;
          }
          /**
           * <pre>
           * Height of the video player in device independent pixels (DIPS).
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional int32 h = 7;</code>
           * @param value The h to set.
           * @return This builder for chaining.
           */
          public Builder setH(int value) {
            bitField0_ |= 0x00000080;
            h_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Height of the video player in device independent pixels (DIPS).
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional int32 h = 7;</code>
           * @return This builder for chaining.
           */
          public Builder clearH() {
            bitField0_ = (bitField0_ & ~0x00000080);
            h_ = 0;
            onChanged();
            return this;
          }

          private int startdelay_ ;
          /**
           * <pre>
           * Indicates the start delay in seconds for pre-roll, mid-roll, or
           * post-roll ad placements.
           * Refer to enum com.iabtechlab.adcom.v1.StartDelayMode for generic values.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional int32 startdelay = 8;</code>
           * @return Whether the startdelay field is set.
           */
          @java.lang.Override
          public boolean hasStartdelay() {
            return ((bitField0_ & 0x00000100) != 0);
          }
          /**
           * <pre>
           * Indicates the start delay in seconds for pre-roll, mid-roll, or
           * post-roll ad placements.
           * Refer to enum com.iabtechlab.adcom.v1.StartDelayMode for generic values.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional int32 startdelay = 8;</code>
           * @return The startdelay.
           */
          @java.lang.Override
          public int getStartdelay() {
            return startdelay_;
          }
          /**
           * <pre>
           * Indicates the start delay in seconds for pre-roll, mid-roll, or
           * post-roll ad placements.
           * Refer to enum com.iabtechlab.adcom.v1.StartDelayMode for generic values.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional int32 startdelay = 8;</code>
           * @param value The startdelay to set.
           * @return This builder for chaining.
           */
          public Builder setStartdelay(int value) {
            bitField0_ |= 0x00000100;
            startdelay_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Indicates the start delay in seconds for pre-roll, mid-roll, or
           * post-roll ad placements.
           * Refer to enum com.iabtechlab.adcom.v1.StartDelayMode for generic values.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional int32 startdelay = 8;</code>
           * @return This builder for chaining.
           */
          public Builder clearStartdelay() {
            bitField0_ = (bitField0_ & ~0x00000100);
            startdelay_ = 0;
            onChanged();
            return this;
          }

          private int maxseq_ ;
          /**
           * <pre>
           * Indicates the maximum number of ads that may be served into a
           * “dynamic” video ad pod (where the precise number of ads is not
           * predetermined by the seller).
           * </pre>
           *
           * <code>optional int32 maxseq = 28;</code>
           * @return Whether the maxseq field is set.
           */
          @java.lang.Override
          public boolean hasMaxseq() {
            return ((bitField0_ & 0x00000200) != 0);
          }
          /**
           * <pre>
           * Indicates the maximum number of ads that may be served into a
           * “dynamic” video ad pod (where the precise number of ads is not
           * predetermined by the seller).
           * </pre>
           *
           * <code>optional int32 maxseq = 28;</code>
           * @return The maxseq.
           */
          @java.lang.Override
          public int getMaxseq() {
            return maxseq_;
          }
          /**
           * <pre>
           * Indicates the maximum number of ads that may be served into a
           * “dynamic” video ad pod (where the precise number of ads is not
           * predetermined by the seller).
           * </pre>
           *
           * <code>optional int32 maxseq = 28;</code>
           * @param value The maxseq to set.
           * @return This builder for chaining.
           */
          public Builder setMaxseq(int value) {
            bitField0_ |= 0x00000200;
            maxseq_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Indicates the maximum number of ads that may be served into a
           * “dynamic” video ad pod (where the precise number of ads is not
           * predetermined by the seller).
           * </pre>
           *
           * <code>optional int32 maxseq = 28;</code>
           * @return This builder for chaining.
           */
          public Builder clearMaxseq() {
            bitField0_ = (bitField0_ & ~0x00000200);
            maxseq_ = 0;
            onChanged();
            return this;
          }

          private int poddur_ ;
          /**
           * <pre>
           * Indicates the total amount of time in seconds that advertisers may
           * fill for a “dynamic” video ad pod (See Section 7.6 for more details),
           * or the dynamic portion of a “hybrid” ad pod. This field is required
           * only for the dynamic portion(s) of video ad pods. This field refers to
           * the length of the entire ad break, whereas
           * minduration/maxduration/rqddurs are constraints relating to the slots
           * that make up the pod.
           * </pre>
           *
           * <code>optional int32 poddur = 29;</code>
           * @return Whether the poddur field is set.
           */
          @java.lang.Override
          public boolean hasPoddur() {
            return ((bitField0_ & 0x00000400) != 0);
          }
          /**
           * <pre>
           * Indicates the total amount of time in seconds that advertisers may
           * fill for a “dynamic” video ad pod (See Section 7.6 for more details),
           * or the dynamic portion of a “hybrid” ad pod. This field is required
           * only for the dynamic portion(s) of video ad pods. This field refers to
           * the length of the entire ad break, whereas
           * minduration/maxduration/rqddurs are constraints relating to the slots
           * that make up the pod.
           * </pre>
           *
           * <code>optional int32 poddur = 29;</code>
           * @return The poddur.
           */
          @java.lang.Override
          public int getPoddur() {
            return poddur_;
          }
          /**
           * <pre>
           * Indicates the total amount of time in seconds that advertisers may
           * fill for a “dynamic” video ad pod (See Section 7.6 for more details),
           * or the dynamic portion of a “hybrid” ad pod. This field is required
           * only for the dynamic portion(s) of video ad pods. This field refers to
           * the length of the entire ad break, whereas
           * minduration/maxduration/rqddurs are constraints relating to the slots
           * that make up the pod.
           * </pre>
           *
           * <code>optional int32 poddur = 29;</code>
           * @param value The poddur to set.
           * @return This builder for chaining.
           */
          public Builder setPoddur(int value) {
            bitField0_ |= 0x00000400;
            poddur_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Indicates the total amount of time in seconds that advertisers may
           * fill for a “dynamic” video ad pod (See Section 7.6 for more details),
           * or the dynamic portion of a “hybrid” ad pod. This field is required
           * only for the dynamic portion(s) of video ad pods. This field refers to
           * the length of the entire ad break, whereas
           * minduration/maxduration/rqddurs are constraints relating to the slots
           * that make up the pod.
           * </pre>
           *
           * <code>optional int32 poddur = 29;</code>
           * @return This builder for chaining.
           */
          public Builder clearPoddur() {
            bitField0_ = (bitField0_ & ~0x00000400);
            poddur_ = 0;
            onChanged();
            return this;
          }

          private boolean skip_ ;
          /**
           * <pre>
           * Indicates if the player will allow the video to be skipped,
           * where 0 = no, 1 = yes.
           * If a bidder sends markup/creative that is itself skippable, the
           * Bid object should include the attr array with an element of
           * 16 indicating skippable video.
           * </pre>
           *
           * <code>optional bool skip = 23;</code>
           * @return Whether the skip field is set.
           */
          @java.lang.Override
          public boolean hasSkip() {
            return ((bitField0_ & 0x00000800) != 0);
          }
          /**
           * <pre>
           * Indicates if the player will allow the video to be skipped,
           * where 0 = no, 1 = yes.
           * If a bidder sends markup/creative that is itself skippable, the
           * Bid object should include the attr array with an element of
           * 16 indicating skippable video.
           * </pre>
           *
           * <code>optional bool skip = 23;</code>
           * @return The skip.
           */
          @java.lang.Override
          public boolean getSkip() {
            return skip_;
          }
          /**
           * <pre>
           * Indicates if the player will allow the video to be skipped,
           * where 0 = no, 1 = yes.
           * If a bidder sends markup/creative that is itself skippable, the
           * Bid object should include the attr array with an element of
           * 16 indicating skippable video.
           * </pre>
           *
           * <code>optional bool skip = 23;</code>
           * @param value The skip to set.
           * @return This builder for chaining.
           */
          public Builder setSkip(boolean value) {
            bitField0_ |= 0x00000800;
            skip_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Indicates if the player will allow the video to be skipped,
           * where 0 = no, 1 = yes.
           * If a bidder sends markup/creative that is itself skippable, the
           * Bid object should include the attr array with an element of
           * 16 indicating skippable video.
           * </pre>
           *
           * <code>optional bool skip = 23;</code>
           * @return This builder for chaining.
           */
          public Builder clearSkip() {
            bitField0_ = (bitField0_ & ~0x00000800);
            skip_ = false;
            onChanged();
            return this;
          }

          private int skipmin_ ;
          /**
           * <pre>
           * Videos of total duration greater than this number of seconds
           * can be skippable; only applicable if the ad is skippable.
           * </pre>
           *
           * <code>optional int32 skipmin = 24;</code>
           * @return Whether the skipmin field is set.
           */
          @java.lang.Override
          public boolean hasSkipmin() {
            return ((bitField0_ & 0x00001000) != 0);
          }
          /**
           * <pre>
           * Videos of total duration greater than this number of seconds
           * can be skippable; only applicable if the ad is skippable.
           * </pre>
           *
           * <code>optional int32 skipmin = 24;</code>
           * @return The skipmin.
           */
          @java.lang.Override
          public int getSkipmin() {
            return skipmin_;
          }
          /**
           * <pre>
           * Videos of total duration greater than this number of seconds
           * can be skippable; only applicable if the ad is skippable.
           * </pre>
           *
           * <code>optional int32 skipmin = 24;</code>
           * @param value The skipmin to set.
           * @return This builder for chaining.
           */
          public Builder setSkipmin(int value) {
            bitField0_ |= 0x00001000;
            skipmin_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Videos of total duration greater than this number of seconds
           * can be skippable; only applicable if the ad is skippable.
           * </pre>
           *
           * <code>optional int32 skipmin = 24;</code>
           * @return This builder for chaining.
           */
          public Builder clearSkipmin() {
            bitField0_ = (bitField0_ & ~0x00001000);
            skipmin_ = 0;
            onChanged();
            return this;
          }

          private int skipafter_ ;
          /**
           * <pre>
           * Number of seconds a video must play before skipping is
           * enabled; only applicable if the ad is skippable.
           * </pre>
           *
           * <code>optional int32 skipafter = 25;</code>
           * @return Whether the skipafter field is set.
           */
          @java.lang.Override
          public boolean hasSkipafter() {
            return ((bitField0_ & 0x00002000) != 0);
          }
          /**
           * <pre>
           * Number of seconds a video must play before skipping is
           * enabled; only applicable if the ad is skippable.
           * </pre>
           *
           * <code>optional int32 skipafter = 25;</code>
           * @return The skipafter.
           */
          @java.lang.Override
          public int getSkipafter() {
            return skipafter_;
          }
          /**
           * <pre>
           * Number of seconds a video must play before skipping is
           * enabled; only applicable if the ad is skippable.
           * </pre>
           *
           * <code>optional int32 skipafter = 25;</code>
           * @param value The skipafter to set.
           * @return This builder for chaining.
           */
          public Builder setSkipafter(int value) {
            bitField0_ |= 0x00002000;
            skipafter_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Number of seconds a video must play before skipping is
           * enabled; only applicable if the ad is skippable.
           * </pre>
           *
           * <code>optional int32 skipafter = 25;</code>
           * @return This builder for chaining.
           */
          public Builder clearSkipafter() {
            bitField0_ = (bitField0_ & ~0x00002000);
            skipafter_ = 0;
            onChanged();
            return this;
          }

          private int sequence_ = 1;
          /**
           * <pre>
           * If multiple ad impressions are offered in the same bid request,
           * the sequence number will allow for the coordinated delivery of
           * multiple creatives.
           * </pre>
           *
           * <code>optional int32 sequence = 9 [default = 1, deprecated = true];</code>
           * @return Whether the sequence field is set.
           */
          @java.lang.Override
          @java.lang.Deprecated public boolean hasSequence() {
            return ((bitField0_ & 0x00004000) != 0);
          }
          /**
           * <pre>
           * If multiple ad impressions are offered in the same bid request,
           * the sequence number will allow for the coordinated delivery of
           * multiple creatives.
           * </pre>
           *
           * <code>optional int32 sequence = 9 [default = 1, deprecated = true];</code>
           * @return The sequence.
           */
          @java.lang.Override
          @java.lang.Deprecated public int getSequence() {
            return sequence_;
          }
          /**
           * <pre>
           * If multiple ad impressions are offered in the same bid request,
           * the sequence number will allow for the coordinated delivery of
           * multiple creatives.
           * </pre>
           *
           * <code>optional int32 sequence = 9 [default = 1, deprecated = true];</code>
           * @param value The sequence to set.
           * @return This builder for chaining.
           */
          @java.lang.Deprecated public Builder setSequence(int value) {
            bitField0_ |= 0x00004000;
            sequence_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * If multiple ad impressions are offered in the same bid request,
           * the sequence number will allow for the coordinated delivery of
           * multiple creatives.
           * </pre>
           *
           * <code>optional int32 sequence = 9 [default = 1, deprecated = true];</code>
           * @return This builder for chaining.
           */
          @java.lang.Deprecated public Builder clearSequence() {
            bitField0_ = (bitField0_ & ~0x00004000);
            sequence_ = 1;
            onChanged();
            return this;
          }

          private int slotinpod_ ;
          /**
           * <pre>
           * For video ad pods, this value indicates that the seller can guarantee
           * delivery against the indicated slot position in the pod.
           * </pre>
           *
           * <code>optional int32 slotinpod = 33 [default = 0];</code>
           * @return Whether the slotinpod field is set.
           */
          @java.lang.Override
          public boolean hasSlotinpod() {
            return ((bitField0_ & 0x00008000) != 0);
          }
          /**
           * <pre>
           * For video ad pods, this value indicates that the seller can guarantee
           * delivery against the indicated slot position in the pod.
           * </pre>
           *
           * <code>optional int32 slotinpod = 33 [default = 0];</code>
           * @return The slotinpod.
           */
          @java.lang.Override
          public int getSlotinpod() {
            return slotinpod_;
          }
          /**
           * <pre>
           * For video ad pods, this value indicates that the seller can guarantee
           * delivery against the indicated slot position in the pod.
           * </pre>
           *
           * <code>optional int32 slotinpod = 33 [default = 0];</code>
           * @param value The slotinpod to set.
           * @return This builder for chaining.
           */
          public Builder setSlotinpod(int value) {
            bitField0_ |= 0x00008000;
            slotinpod_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * For video ad pods, this value indicates that the seller can guarantee
           * delivery against the indicated slot position in the pod.
           * </pre>
           *
           * <code>optional int32 slotinpod = 33 [default = 0];</code>
           * @return This builder for chaining.
           */
          public Builder clearSlotinpod() {
            bitField0_ = (bitField0_ & ~0x00008000);
            slotinpod_ = 0;
            onChanged();
            return this;
          }

          private double mincpmpersec_ ;
          /**
           * <pre>
           * Minimum CPM per second. This is a price floor for the "dynamic"
           * portion of a video ad pod, relative to the duration of bids an
           * advertiser may submit.
           * </pre>
           *
           * <code>optional double mincpmpersec = 34;</code>
           * @return Whether the mincpmpersec field is set.
           */
          @java.lang.Override
          public boolean hasMincpmpersec() {
            return ((bitField0_ & 0x00010000) != 0);
          }
          /**
           * <pre>
           * Minimum CPM per second. This is a price floor for the "dynamic"
           * portion of a video ad pod, relative to the duration of bids an
           * advertiser may submit.
           * </pre>
           *
           * <code>optional double mincpmpersec = 34;</code>
           * @return The mincpmpersec.
           */
          @java.lang.Override
          public double getMincpmpersec() {
            return mincpmpersec_;
          }
          /**
           * <pre>
           * Minimum CPM per second. This is a price floor for the "dynamic"
           * portion of a video ad pod, relative to the duration of bids an
           * advertiser may submit.
           * </pre>
           *
           * <code>optional double mincpmpersec = 34;</code>
           * @param value The mincpmpersec to set.
           * @return This builder for chaining.
           */
          public Builder setMincpmpersec(double value) {
            bitField0_ |= 0x00010000;
            mincpmpersec_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Minimum CPM per second. This is a price floor for the "dynamic"
           * portion of a video ad pod, relative to the duration of bids an
           * advertiser may submit.
           * </pre>
           *
           * <code>optional double mincpmpersec = 34;</code>
           * @return This builder for chaining.
           */
          public Builder clearMincpmpersec() {
            bitField0_ = (bitField0_ & ~0x00010000);
            mincpmpersec_ = 0D;
            onChanged();
            return this;
          }

          private com.google.protobuf.Internal.IntList battr_ = emptyIntList();
          private void ensureBattrIsMutable() {
            if (!((bitField0_ & 0x00020000) != 0)) {
              battr_ = mutableCopy(battr_);
              bitField0_ |= 0x00020000;
             }
          }
          /**
           * <pre>
           * Blocked creative attributes.
           * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
           * </pre>
           *
           * <code>repeated int32 battr = 10 [packed = true];</code>
           * @return A list containing the battr.
           */
          public java.util.List<java.lang.Integer>
              getBattrList() {
            return ((bitField0_ & 0x00020000) != 0) ?
                     java.util.Collections.unmodifiableList(battr_) : battr_;
          }
          /**
           * <pre>
           * Blocked creative attributes.
           * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
           * </pre>
           *
           * <code>repeated int32 battr = 10 [packed = true];</code>
           * @return The count of battr.
           */
          public int getBattrCount() {
            return battr_.size();
          }
          /**
           * <pre>
           * Blocked creative attributes.
           * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
           * </pre>
           *
           * <code>repeated int32 battr = 10 [packed = true];</code>
           * @param index The index of the element to return.
           * @return The battr at the given index.
           */
          public int getBattr(int index) {
            return battr_.getInt(index);
          }
          /**
           * <pre>
           * Blocked creative attributes.
           * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
           * </pre>
           *
           * <code>repeated int32 battr = 10 [packed = true];</code>
           * @param index The index to set the value at.
           * @param value The battr to set.
           * @return This builder for chaining.
           */
          public Builder setBattr(
              int index, int value) {
            ensureBattrIsMutable();
            battr_.setInt(index, value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Blocked creative attributes.
           * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
           * </pre>
           *
           * <code>repeated int32 battr = 10 [packed = true];</code>
           * @param value The battr to add.
           * @return This builder for chaining.
           */
          public Builder addBattr(int value) {
            ensureBattrIsMutable();
            battr_.addInt(value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Blocked creative attributes.
           * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
           * </pre>
           *
           * <code>repeated int32 battr = 10 [packed = true];</code>
           * @param values The battr to add.
           * @return This builder for chaining.
           */
          public Builder addAllBattr(
              java.lang.Iterable<? extends java.lang.Integer> values) {
            ensureBattrIsMutable();
            com.google.protobuf.AbstractMessageLite.Builder.addAll(
                values, battr_);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Blocked creative attributes.
           * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
           * </pre>
           *
           * <code>repeated int32 battr = 10 [packed = true];</code>
           * @return This builder for chaining.
           */
          public Builder clearBattr() {
            battr_ = emptyIntList();
            bitField0_ = (bitField0_ & ~0x00020000);
            onChanged();
            return this;
          }

          private int maxextended_ ;
          /**
           * <pre>
           * Maximum extended video ad duration, if extension is allowed.
           * If blank or 0, extension is not allowed. If -1, extension is allowed,
           * and there is no time limit imposed. If greater than 0, then the value
           * represents the number of seconds of extended play supported beyond
           * the maxduration value.
           * </pre>
           *
           * <code>optional int32 maxextended = 11;</code>
           * @return Whether the maxextended field is set.
           */
          @java.lang.Override
          public boolean hasMaxextended() {
            return ((bitField0_ & 0x00040000) != 0);
          }
          /**
           * <pre>
           * Maximum extended video ad duration, if extension is allowed.
           * If blank or 0, extension is not allowed. If -1, extension is allowed,
           * and there is no time limit imposed. If greater than 0, then the value
           * represents the number of seconds of extended play supported beyond
           * the maxduration value.
           * </pre>
           *
           * <code>optional int32 maxextended = 11;</code>
           * @return The maxextended.
           */
          @java.lang.Override
          public int getMaxextended() {
            return maxextended_;
          }
          /**
           * <pre>
           * Maximum extended video ad duration, if extension is allowed.
           * If blank or 0, extension is not allowed. If -1, extension is allowed,
           * and there is no time limit imposed. If greater than 0, then the value
           * represents the number of seconds of extended play supported beyond
           * the maxduration value.
           * </pre>
           *
           * <code>optional int32 maxextended = 11;</code>
           * @param value The maxextended to set.
           * @return This builder for chaining.
           */
          public Builder setMaxextended(int value) {
            bitField0_ |= 0x00040000;
            maxextended_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Maximum extended video ad duration, if extension is allowed.
           * If blank or 0, extension is not allowed. If -1, extension is allowed,
           * and there is no time limit imposed. If greater than 0, then the value
           * represents the number of seconds of extended play supported beyond
           * the maxduration value.
           * </pre>
           *
           * <code>optional int32 maxextended = 11;</code>
           * @return This builder for chaining.
           */
          public Builder clearMaxextended() {
            bitField0_ = (bitField0_ & ~0x00040000);
            maxextended_ = 0;
            onChanged();
            return this;
          }

          private int minbitrate_ ;
          /**
           * <pre>
           * Minimum bit rate in Kbps.
           * </pre>
           *
           * <code>optional int32 minbitrate = 12;</code>
           * @return Whether the minbitrate field is set.
           */
          @java.lang.Override
          public boolean hasMinbitrate() {
            return ((bitField0_ & 0x00080000) != 0);
          }
          /**
           * <pre>
           * Minimum bit rate in Kbps.
           * </pre>
           *
           * <code>optional int32 minbitrate = 12;</code>
           * @return The minbitrate.
           */
          @java.lang.Override
          public int getMinbitrate() {
            return minbitrate_;
          }
          /**
           * <pre>
           * Minimum bit rate in Kbps.
           * </pre>
           *
           * <code>optional int32 minbitrate = 12;</code>
           * @param value The minbitrate to set.
           * @return This builder for chaining.
           */
          public Builder setMinbitrate(int value) {
            bitField0_ |= 0x00080000;
            minbitrate_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Minimum bit rate in Kbps.
           * </pre>
           *
           * <code>optional int32 minbitrate = 12;</code>
           * @return This builder for chaining.
           */
          public Builder clearMinbitrate() {
            bitField0_ = (bitField0_ & ~0x00080000);
            minbitrate_ = 0;
            onChanged();
            return this;
          }

          private int maxbitrate_ ;
          /**
           * <pre>
           * Maximum bit rate in Kbps.
           * </pre>
           *
           * <code>optional int32 maxbitrate = 13;</code>
           * @return Whether the maxbitrate field is set.
           */
          @java.lang.Override
          public boolean hasMaxbitrate() {
            return ((bitField0_ & 0x00100000) != 0);
          }
          /**
           * <pre>
           * Maximum bit rate in Kbps.
           * </pre>
           *
           * <code>optional int32 maxbitrate = 13;</code>
           * @return The maxbitrate.
           */
          @java.lang.Override
          public int getMaxbitrate() {
            return maxbitrate_;
          }
          /**
           * <pre>
           * Maximum bit rate in Kbps.
           * </pre>
           *
           * <code>optional int32 maxbitrate = 13;</code>
           * @param value The maxbitrate to set.
           * @return This builder for chaining.
           */
          public Builder setMaxbitrate(int value) {
            bitField0_ |= 0x00100000;
            maxbitrate_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Maximum bit rate in Kbps.
           * </pre>
           *
           * <code>optional int32 maxbitrate = 13;</code>
           * @return This builder for chaining.
           */
          public Builder clearMaxbitrate() {
            bitField0_ = (bitField0_ & ~0x00100000);
            maxbitrate_ = 0;
            onChanged();
            return this;
          }

          private boolean boxingallowed_ = true;
          /**
           * <pre>
           * Indicates if letter-boxing of 4:3 content into a 16:9 window is
           * allowed, where 0 = no, 1 = yes.
           * </pre>
           *
           * <code>optional bool boxingallowed = 14 [default = true];</code>
           * @return Whether the boxingallowed field is set.
           */
          @java.lang.Override
          public boolean hasBoxingallowed() {
            return ((bitField0_ & 0x00200000) != 0);
          }
          /**
           * <pre>
           * Indicates if letter-boxing of 4:3 content into a 16:9 window is
           * allowed, where 0 = no, 1 = yes.
           * </pre>
           *
           * <code>optional bool boxingallowed = 14 [default = true];</code>
           * @return The boxingallowed.
           */
          @java.lang.Override
          public boolean getBoxingallowed() {
            return boxingallowed_;
          }
          /**
           * <pre>
           * Indicates if letter-boxing of 4:3 content into a 16:9 window is
           * allowed, where 0 = no, 1 = yes.
           * </pre>
           *
           * <code>optional bool boxingallowed = 14 [default = true];</code>
           * @param value The boxingallowed to set.
           * @return This builder for chaining.
           */
          public Builder setBoxingallowed(boolean value) {
            bitField0_ |= 0x00200000;
            boxingallowed_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Indicates if letter-boxing of 4:3 content into a 16:9 window is
           * allowed, where 0 = no, 1 = yes.
           * </pre>
           *
           * <code>optional bool boxingallowed = 14 [default = true];</code>
           * @return This builder for chaining.
           */
          public Builder clearBoxingallowed() {
            bitField0_ = (bitField0_ & ~0x00200000);
            boxingallowed_ = true;
            onChanged();
            return this;
          }

          private com.google.protobuf.Internal.IntList playbackmethod_ = emptyIntList();
          private void ensurePlaybackmethodIsMutable() {
            if (!((bitField0_ & 0x00400000) != 0)) {
              playbackmethod_ = mutableCopy(playbackmethod_);
              bitField0_ |= 0x00400000;
             }
          }
          /**
           * <pre>
           * Playback methods that may be in use. If none are specified, any
           * method may be used. Only one method is typically used in practice.
           * As a result, this array may be converted to an integer in a future
           * version of the specification. It is strongly advised to use only
           * the first element of this array in preparation for this change.
           * Refer to enum com.iabtechlab.adcom.v1.PlaybackMethod for generic values.
           * </pre>
           *
           * <code>repeated int32 playbackmethod = 15 [packed = true];</code>
           * @return A list containing the playbackmethod.
           */
          public java.util.List<java.lang.Integer>
              getPlaybackmethodList() {
            return ((bitField0_ & 0x00400000) != 0) ?
                     java.util.Collections.unmodifiableList(playbackmethod_) : playbackmethod_;
          }
          /**
           * <pre>
           * Playback methods that may be in use. If none are specified, any
           * method may be used. Only one method is typically used in practice.
           * As a result, this array may be converted to an integer in a future
           * version of the specification. It is strongly advised to use only
           * the first element of this array in preparation for this change.
           * Refer to enum com.iabtechlab.adcom.v1.PlaybackMethod for generic values.
           * </pre>
           *
           * <code>repeated int32 playbackmethod = 15 [packed = true];</code>
           * @return The count of playbackmethod.
           */
          public int getPlaybackmethodCount() {
            return playbackmethod_.size();
          }
          /**
           * <pre>
           * Playback methods that may be in use. If none are specified, any
           * method may be used. Only one method is typically used in practice.
           * As a result, this array may be converted to an integer in a future
           * version of the specification. It is strongly advised to use only
           * the first element of this array in preparation for this change.
           * Refer to enum com.iabtechlab.adcom.v1.PlaybackMethod for generic values.
           * </pre>
           *
           * <code>repeated int32 playbackmethod = 15 [packed = true];</code>
           * @param index The index of the element to return.
           * @return The playbackmethod at the given index.
           */
          public int getPlaybackmethod(int index) {
            return playbackmethod_.getInt(index);
          }
          /**
           * <pre>
           * Playback methods that may be in use. If none are specified, any
           * method may be used. Only one method is typically used in practice.
           * As a result, this array may be converted to an integer in a future
           * version of the specification. It is strongly advised to use only
           * the first element of this array in preparation for this change.
           * Refer to enum com.iabtechlab.adcom.v1.PlaybackMethod for generic values.
           * </pre>
           *
           * <code>repeated int32 playbackmethod = 15 [packed = true];</code>
           * @param index The index to set the value at.
           * @param value The playbackmethod to set.
           * @return This builder for chaining.
           */
          public Builder setPlaybackmethod(
              int index, int value) {
            ensurePlaybackmethodIsMutable();
            playbackmethod_.setInt(index, value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Playback methods that may be in use. If none are specified, any
           * method may be used. Only one method is typically used in practice.
           * As a result, this array may be converted to an integer in a future
           * version of the specification. It is strongly advised to use only
           * the first element of this array in preparation for this change.
           * Refer to enum com.iabtechlab.adcom.v1.PlaybackMethod for generic values.
           * </pre>
           *
           * <code>repeated int32 playbackmethod = 15 [packed = true];</code>
           * @param value The playbackmethod to add.
           * @return This builder for chaining.
           */
          public Builder addPlaybackmethod(int value) {
            ensurePlaybackmethodIsMutable();
            playbackmethod_.addInt(value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Playback methods that may be in use. If none are specified, any
           * method may be used. Only one method is typically used in practice.
           * As a result, this array may be converted to an integer in a future
           * version of the specification. It is strongly advised to use only
           * the first element of this array in preparation for this change.
           * Refer to enum com.iabtechlab.adcom.v1.PlaybackMethod for generic values.
           * </pre>
           *
           * <code>repeated int32 playbackmethod = 15 [packed = true];</code>
           * @param values The playbackmethod to add.
           * @return This builder for chaining.
           */
          public Builder addAllPlaybackmethod(
              java.lang.Iterable<? extends java.lang.Integer> values) {
            ensurePlaybackmethodIsMutable();
            com.google.protobuf.AbstractMessageLite.Builder.addAll(
                values, playbackmethod_);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Playback methods that may be in use. If none are specified, any
           * method may be used. Only one method is typically used in practice.
           * As a result, this array may be converted to an integer in a future
           * version of the specification. It is strongly advised to use only
           * the first element of this array in preparation for this change.
           * Refer to enum com.iabtechlab.adcom.v1.PlaybackMethod for generic values.
           * </pre>
           *
           * <code>repeated int32 playbackmethod = 15 [packed = true];</code>
           * @return This builder for chaining.
           */
          public Builder clearPlaybackmethod() {
            playbackmethod_ = emptyIntList();
            bitField0_ = (bitField0_ & ~0x00400000);
            onChanged();
            return this;
          }

          private com.google.protobuf.Internal.IntList delivery_ = emptyIntList();
          private void ensureDeliveryIsMutable() {
            if (!((bitField0_ & 0x00800000) != 0)) {
              delivery_ = mutableCopy(delivery_);
              bitField0_ |= 0x00800000;
             }
          }
          /**
           * <pre>
           * Supported delivery methods (e.g., streaming, progressive).
           * If none specified, assume all are supported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.DeliveryMethod for generic values.
           * </pre>
           *
           * <code>repeated int32 delivery = 16 [packed = true];</code>
           * @return A list containing the delivery.
           */
          public java.util.List<java.lang.Integer>
              getDeliveryList() {
            return ((bitField0_ & 0x00800000) != 0) ?
                     java.util.Collections.unmodifiableList(delivery_) : delivery_;
          }
          /**
           * <pre>
           * Supported delivery methods (e.g., streaming, progressive).
           * If none specified, assume all are supported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.DeliveryMethod for generic values.
           * </pre>
           *
           * <code>repeated int32 delivery = 16 [packed = true];</code>
           * @return The count of delivery.
           */
          public int getDeliveryCount() {
            return delivery_.size();
          }
          /**
           * <pre>
           * Supported delivery methods (e.g., streaming, progressive).
           * If none specified, assume all are supported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.DeliveryMethod for generic values.
           * </pre>
           *
           * <code>repeated int32 delivery = 16 [packed = true];</code>
           * @param index The index of the element to return.
           * @return The delivery at the given index.
           */
          public int getDelivery(int index) {
            return delivery_.getInt(index);
          }
          /**
           * <pre>
           * Supported delivery methods (e.g., streaming, progressive).
           * If none specified, assume all are supported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.DeliveryMethod for generic values.
           * </pre>
           *
           * <code>repeated int32 delivery = 16 [packed = true];</code>
           * @param index The index to set the value at.
           * @param value The delivery to set.
           * @return This builder for chaining.
           */
          public Builder setDelivery(
              int index, int value) {
            ensureDeliveryIsMutable();
            delivery_.setInt(index, value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Supported delivery methods (e.g., streaming, progressive).
           * If none specified, assume all are supported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.DeliveryMethod for generic values.
           * </pre>
           *
           * <code>repeated int32 delivery = 16 [packed = true];</code>
           * @param value The delivery to add.
           * @return This builder for chaining.
           */
          public Builder addDelivery(int value) {
            ensureDeliveryIsMutable();
            delivery_.addInt(value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Supported delivery methods (e.g., streaming, progressive).
           * If none specified, assume all are supported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.DeliveryMethod for generic values.
           * </pre>
           *
           * <code>repeated int32 delivery = 16 [packed = true];</code>
           * @param values The delivery to add.
           * @return This builder for chaining.
           */
          public Builder addAllDelivery(
              java.lang.Iterable<? extends java.lang.Integer> values) {
            ensureDeliveryIsMutable();
            com.google.protobuf.AbstractMessageLite.Builder.addAll(
                values, delivery_);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Supported delivery methods (e.g., streaming, progressive).
           * If none specified, assume all are supported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.DeliveryMethod for generic values.
           * </pre>
           *
           * <code>repeated int32 delivery = 16 [packed = true];</code>
           * @return This builder for chaining.
           */
          public Builder clearDelivery() {
            delivery_ = emptyIntList();
            bitField0_ = (bitField0_ & ~0x00800000);
            onChanged();
            return this;
          }

          private int pos_ ;
          /**
           * <pre>
           * Ad position on screen.
           * Refer to enum com.iabtechlab.adcom.v1.PlacementPosition for generic values.
           * </pre>
           *
           * <code>optional int32 pos = 17;</code>
           * @return Whether the pos field is set.
           */
          @java.lang.Override
          public boolean hasPos() {
            return ((bitField0_ & 0x01000000) != 0);
          }
          /**
           * <pre>
           * Ad position on screen.
           * Refer to enum com.iabtechlab.adcom.v1.PlacementPosition for generic values.
           * </pre>
           *
           * <code>optional int32 pos = 17;</code>
           * @return The pos.
           */
          @java.lang.Override
          public int getPos() {
            return pos_;
          }
          /**
           * <pre>
           * Ad position on screen.
           * Refer to enum com.iabtechlab.adcom.v1.PlacementPosition for generic values.
           * </pre>
           *
           * <code>optional int32 pos = 17;</code>
           * @param value The pos to set.
           * @return This builder for chaining.
           */
          public Builder setPos(int value) {
            bitField0_ |= 0x01000000;
            pos_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Ad position on screen.
           * Refer to enum com.iabtechlab.adcom.v1.PlacementPosition for generic values.
           * </pre>
           *
           * <code>optional int32 pos = 17;</code>
           * @return This builder for chaining.
           */
          public Builder clearPos() {
            bitField0_ = (bitField0_ & ~0x01000000);
            pos_ = 0;
            onChanged();
            return this;
          }

          private java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner> companionad_ =
            java.util.Collections.emptyList();
          private void ensureCompanionadIsMutable() {
            if (!((bitField0_ & 0x02000000) != 0)) {
              companionad_ = new java.util.ArrayList<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner>(companionad_);
              bitField0_ |= 0x02000000;
             }
          }

          private com.google.protobuf.RepeatedFieldBuilderV3<
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.BannerOrBuilder> companionadBuilder_;

          /**
           * <pre>
           * Array of Banner objects (Section 3.2.3) if companion ads are available.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 18;</code>
           */
          public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner> getCompanionadList() {
            if (companionadBuilder_ == null) {
              return java.util.Collections.unmodifiableList(companionad_);
            } else {
              return companionadBuilder_.getMessageList();
            }
          }
          /**
           * <pre>
           * Array of Banner objects (Section 3.2.3) if companion ads are available.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 18;</code>
           */
          public int getCompanionadCount() {
            if (companionadBuilder_ == null) {
              return companionad_.size();
            } else {
              return companionadBuilder_.getCount();
            }
          }
          /**
           * <pre>
           * Array of Banner objects (Section 3.2.3) if companion ads are available.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 18;</code>
           */
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner getCompanionad(int index) {
            if (companionadBuilder_ == null) {
              return companionad_.get(index);
            } else {
              return companionadBuilder_.getMessage(index);
            }
          }
          /**
           * <pre>
           * Array of Banner objects (Section 3.2.3) if companion ads are available.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 18;</code>
           */
          public Builder setCompanionad(
              int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner value) {
            if (companionadBuilder_ == null) {
              if (value == null) {
                throw new NullPointerException();
              }
              ensureCompanionadIsMutable();
              companionad_.set(index, value);
              onChanged();
            } else {
              companionadBuilder_.setMessage(index, value);
            }
            return this;
          }
          /**
           * <pre>
           * Array of Banner objects (Section 3.2.3) if companion ads are available.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 18;</code>
           */
          public Builder setCompanionad(
              int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Builder builderForValue) {
            if (companionadBuilder_ == null) {
              ensureCompanionadIsMutable();
              companionad_.set(index, builderForValue.build());
              onChanged();
            } else {
              companionadBuilder_.setMessage(index, builderForValue.build());
            }
            return this;
          }
          /**
           * <pre>
           * Array of Banner objects (Section 3.2.3) if companion ads are available.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 18;</code>
           */
          public Builder addCompanionad(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner value) {
            if (companionadBuilder_ == null) {
              if (value == null) {
                throw new NullPointerException();
              }
              ensureCompanionadIsMutable();
              companionad_.add(value);
              onChanged();
            } else {
              companionadBuilder_.addMessage(value);
            }
            return this;
          }
          /**
           * <pre>
           * Array of Banner objects (Section 3.2.3) if companion ads are available.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 18;</code>
           */
          public Builder addCompanionad(
              int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner value) {
            if (companionadBuilder_ == null) {
              if (value == null) {
                throw new NullPointerException();
              }
              ensureCompanionadIsMutable();
              companionad_.add(index, value);
              onChanged();
            } else {
              companionadBuilder_.addMessage(index, value);
            }
            return this;
          }
          /**
           * <pre>
           * Array of Banner objects (Section 3.2.3) if companion ads are available.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 18;</code>
           */
          public Builder addCompanionad(
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Builder builderForValue) {
            if (companionadBuilder_ == null) {
              ensureCompanionadIsMutable();
              companionad_.add(builderForValue.build());
              onChanged();
            } else {
              companionadBuilder_.addMessage(builderForValue.build());
            }
            return this;
          }
          /**
           * <pre>
           * Array of Banner objects (Section 3.2.3) if companion ads are available.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 18;</code>
           */
          public Builder addCompanionad(
              int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Builder builderForValue) {
            if (companionadBuilder_ == null) {
              ensureCompanionadIsMutable();
              companionad_.add(index, builderForValue.build());
              onChanged();
            } else {
              companionadBuilder_.addMessage(index, builderForValue.build());
            }
            return this;
          }
          /**
           * <pre>
           * Array of Banner objects (Section 3.2.3) if companion ads are available.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 18;</code>
           */
          public Builder addAllCompanionad(
              java.lang.Iterable<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner> values) {
            if (companionadBuilder_ == null) {
              ensureCompanionadIsMutable();
              com.google.protobuf.AbstractMessageLite.Builder.addAll(
                  values, companionad_);
              onChanged();
            } else {
              companionadBuilder_.addAllMessages(values);
            }
            return this;
          }
          /**
           * <pre>
           * Array of Banner objects (Section 3.2.3) if companion ads are available.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 18;</code>
           */
          public Builder clearCompanionad() {
            if (companionadBuilder_ == null) {
              companionad_ = java.util.Collections.emptyList();
              bitField0_ = (bitField0_ & ~0x02000000);
              onChanged();
            } else {
              companionadBuilder_.clear();
            }
            return this;
          }
          /**
           * <pre>
           * Array of Banner objects (Section 3.2.3) if companion ads are available.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 18;</code>
           */
          public Builder removeCompanionad(int index) {
            if (companionadBuilder_ == null) {
              ensureCompanionadIsMutable();
              companionad_.remove(index);
              onChanged();
            } else {
              companionadBuilder_.remove(index);
            }
            return this;
          }
          /**
           * <pre>
           * Array of Banner objects (Section 3.2.3) if companion ads are available.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 18;</code>
           */
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Builder getCompanionadBuilder(
              int index) {
            return getCompanionadFieldBuilder().getBuilder(index);
          }
          /**
           * <pre>
           * Array of Banner objects (Section 3.2.3) if companion ads are available.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 18;</code>
           */
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.BannerOrBuilder getCompanionadOrBuilder(
              int index) {
            if (companionadBuilder_ == null) {
              return companionad_.get(index);  } else {
              return companionadBuilder_.getMessageOrBuilder(index);
            }
          }
          /**
           * <pre>
           * Array of Banner objects (Section 3.2.3) if companion ads are available.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 18;</code>
           */
          public java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.BannerOrBuilder> 
               getCompanionadOrBuilderList() {
            if (companionadBuilder_ != null) {
              return companionadBuilder_.getMessageOrBuilderList();
            } else {
              return java.util.Collections.unmodifiableList(companionad_);
            }
          }
          /**
           * <pre>
           * Array of Banner objects (Section 3.2.3) if companion ads are available.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 18;</code>
           */
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Builder addCompanionadBuilder() {
            return getCompanionadFieldBuilder().addBuilder(
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.getDefaultInstance());
          }
          /**
           * <pre>
           * Array of Banner objects (Section 3.2.3) if companion ads are available.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 18;</code>
           */
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Builder addCompanionadBuilder(
              int index) {
            return getCompanionadFieldBuilder().addBuilder(
                index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.getDefaultInstance());
          }
          /**
           * <pre>
           * Array of Banner objects (Section 3.2.3) if companion ads are available.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 18;</code>
           */
          public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Builder> 
               getCompanionadBuilderList() {
            return getCompanionadFieldBuilder().getBuilderList();
          }
          private com.google.protobuf.RepeatedFieldBuilderV3<
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.BannerOrBuilder> 
              getCompanionadFieldBuilder() {
            if (companionadBuilder_ == null) {
              companionadBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.BannerOrBuilder>(
                      companionad_,
                      ((bitField0_ & 0x02000000) != 0),
                      getParentForChildren(),
                      isClean());
              companionad_ = null;
            }
            return companionadBuilder_;
          }

          private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd companionad21_;
          private com.google.protobuf.SingleFieldBuilderV3<
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAdOrBuilder> companionad21Builder_;
          /**
           * <pre>
           * Companion ads in OpenRTB 2.1 format. (Or to be precise, interpretations
           * based on the buggy sample message in 5.1.4, fixed later in 2.2.)
           * </pre>
           *
           * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Video.CompanionAd companionad_21 = 22 [deprecated = true];</code>
           * @return Whether the companionad21 field is set.
           */
          @java.lang.Deprecated public boolean hasCompanionad21() {
            return ((bitField0_ & 0x04000000) != 0);
          }
          /**
           * <pre>
           * Companion ads in OpenRTB 2.1 format. (Or to be precise, interpretations
           * based on the buggy sample message in 5.1.4, fixed later in 2.2.)
           * </pre>
           *
           * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Video.CompanionAd companionad_21 = 22 [deprecated = true];</code>
           * @return The companionad21.
           */
          @java.lang.Deprecated public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd getCompanionad21() {
            if (companionad21Builder_ == null) {
              return companionad21_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd.getDefaultInstance() : companionad21_;
            } else {
              return companionad21Builder_.getMessage();
            }
          }
          /**
           * <pre>
           * Companion ads in OpenRTB 2.1 format. (Or to be precise, interpretations
           * based on the buggy sample message in 5.1.4, fixed later in 2.2.)
           * </pre>
           *
           * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Video.CompanionAd companionad_21 = 22 [deprecated = true];</code>
           */
          @java.lang.Deprecated public Builder setCompanionad21(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd value) {
            if (companionad21Builder_ == null) {
              if (value == null) {
                throw new NullPointerException();
              }
              companionad21_ = value;
              onChanged();
            } else {
              companionad21Builder_.setMessage(value);
            }
            bitField0_ |= 0x04000000;
            return this;
          }
          /**
           * <pre>
           * Companion ads in OpenRTB 2.1 format. (Or to be precise, interpretations
           * based on the buggy sample message in 5.1.4, fixed later in 2.2.)
           * </pre>
           *
           * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Video.CompanionAd companionad_21 = 22 [deprecated = true];</code>
           */
          @java.lang.Deprecated public Builder setCompanionad21(
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd.Builder builderForValue) {
            if (companionad21Builder_ == null) {
              companionad21_ = builderForValue.build();
              onChanged();
            } else {
              companionad21Builder_.setMessage(builderForValue.build());
            }
            bitField0_ |= 0x04000000;
            return this;
          }
          /**
           * <pre>
           * Companion ads in OpenRTB 2.1 format. (Or to be precise, interpretations
           * based on the buggy sample message in 5.1.4, fixed later in 2.2.)
           * </pre>
           *
           * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Video.CompanionAd companionad_21 = 22 [deprecated = true];</code>
           */
          @java.lang.Deprecated public Builder mergeCompanionad21(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd value) {
            if (companionad21Builder_ == null) {
              if (((bitField0_ & 0x04000000) != 0) &&
                  companionad21_ != null &&
                  companionad21_ != com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd.getDefaultInstance()) {
                companionad21_ =
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd.newBuilder(companionad21_).mergeFrom(value).buildPartial();
              } else {
                companionad21_ = value;
              }
              onChanged();
            } else {
              companionad21Builder_.mergeFrom(value);
            }
            bitField0_ |= 0x04000000;
            return this;
          }
          /**
           * <pre>
           * Companion ads in OpenRTB 2.1 format. (Or to be precise, interpretations
           * based on the buggy sample message in 5.1.4, fixed later in 2.2.)
           * </pre>
           *
           * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Video.CompanionAd companionad_21 = 22 [deprecated = true];</code>
           */
          @java.lang.Deprecated public Builder clearCompanionad21() {
            if (companionad21Builder_ == null) {
              companionad21_ = null;
              onChanged();
            } else {
              companionad21Builder_.clear();
            }
            bitField0_ = (bitField0_ & ~0x04000000);
            return this;
          }
          /**
           * <pre>
           * Companion ads in OpenRTB 2.1 format. (Or to be precise, interpretations
           * based on the buggy sample message in 5.1.4, fixed later in 2.2.)
           * </pre>
           *
           * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Video.CompanionAd companionad_21 = 22 [deprecated = true];</code>
           */
          @java.lang.Deprecated public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd.Builder getCompanionad21Builder() {
            bitField0_ |= 0x04000000;
            onChanged();
            return getCompanionad21FieldBuilder().getBuilder();
          }
          /**
           * <pre>
           * Companion ads in OpenRTB 2.1 format. (Or to be precise, interpretations
           * based on the buggy sample message in 5.1.4, fixed later in 2.2.)
           * </pre>
           *
           * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Video.CompanionAd companionad_21 = 22 [deprecated = true];</code>
           */
          @java.lang.Deprecated public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAdOrBuilder getCompanionad21OrBuilder() {
            if (companionad21Builder_ != null) {
              return companionad21Builder_.getMessageOrBuilder();
            } else {
              return companionad21_ == null ?
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd.getDefaultInstance() : companionad21_;
            }
          }
          /**
           * <pre>
           * Companion ads in OpenRTB 2.1 format. (Or to be precise, interpretations
           * based on the buggy sample message in 5.1.4, fixed later in 2.2.)
           * </pre>
           *
           * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Video.CompanionAd companionad_21 = 22 [deprecated = true];</code>
           */
          private com.google.protobuf.SingleFieldBuilderV3<
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAdOrBuilder> 
              getCompanionad21FieldBuilder() {
            if (companionad21Builder_ == null) {
              companionad21Builder_ = new com.google.protobuf.SingleFieldBuilderV3<
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAd.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.CompanionAdOrBuilder>(
                      getCompanionad21(),
                      getParentForChildren(),
                      isClean());
              companionad21_ = null;
            }
            return companionad21Builder_;
          }

          private com.google.protobuf.Internal.IntList api_ = emptyIntList();
          private void ensureApiIsMutable() {
            if (!((bitField0_ & 0x08000000) != 0)) {
              api_ = mutableCopy(api_);
              bitField0_ |= 0x08000000;
             }
          }
          /**
           * <pre>
           * List of supported API frameworks for this impression.
           * If an API is not explicitly listed, it is assumed not to be supported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
           * </pre>
           *
           * <code>repeated int32 api = 19 [packed = true];</code>
           * @return A list containing the api.
           */
          public java.util.List<java.lang.Integer>
              getApiList() {
            return ((bitField0_ & 0x08000000) != 0) ?
                     java.util.Collections.unmodifiableList(api_) : api_;
          }
          /**
           * <pre>
           * List of supported API frameworks for this impression.
           * If an API is not explicitly listed, it is assumed not to be supported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
           * </pre>
           *
           * <code>repeated int32 api = 19 [packed = true];</code>
           * @return The count of api.
           */
          public int getApiCount() {
            return api_.size();
          }
          /**
           * <pre>
           * List of supported API frameworks for this impression.
           * If an API is not explicitly listed, it is assumed not to be supported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
           * </pre>
           *
           * <code>repeated int32 api = 19 [packed = true];</code>
           * @param index The index of the element to return.
           * @return The api at the given index.
           */
          public int getApi(int index) {
            return api_.getInt(index);
          }
          /**
           * <pre>
           * List of supported API frameworks for this impression.
           * If an API is not explicitly listed, it is assumed not to be supported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
           * </pre>
           *
           * <code>repeated int32 api = 19 [packed = true];</code>
           * @param index The index to set the value at.
           * @param value The api to set.
           * @return This builder for chaining.
           */
          public Builder setApi(
              int index, int value) {
            ensureApiIsMutable();
            api_.setInt(index, value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * List of supported API frameworks for this impression.
           * If an API is not explicitly listed, it is assumed not to be supported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
           * </pre>
           *
           * <code>repeated int32 api = 19 [packed = true];</code>
           * @param value The api to add.
           * @return This builder for chaining.
           */
          public Builder addApi(int value) {
            ensureApiIsMutable();
            api_.addInt(value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * List of supported API frameworks for this impression.
           * If an API is not explicitly listed, it is assumed not to be supported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
           * </pre>
           *
           * <code>repeated int32 api = 19 [packed = true];</code>
           * @param values The api to add.
           * @return This builder for chaining.
           */
          public Builder addAllApi(
              java.lang.Iterable<? extends java.lang.Integer> values) {
            ensureApiIsMutable();
            com.google.protobuf.AbstractMessageLite.Builder.addAll(
                values, api_);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * List of supported API frameworks for this impression.
           * If an API is not explicitly listed, it is assumed not to be supported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
           * </pre>
           *
           * <code>repeated int32 api = 19 [packed = true];</code>
           * @return This builder for chaining.
           */
          public Builder clearApi() {
            api_ = emptyIntList();
            bitField0_ = (bitField0_ & ~0x08000000);
            onChanged();
            return this;
          }

          private com.google.protobuf.Internal.IntList companiontype_ = emptyIntList();
          private void ensureCompaniontypeIsMutable() {
            if (!((bitField0_ & 0x10000000) != 0)) {
              companiontype_ = mutableCopy(companiontype_);
              bitField0_ |= 0x10000000;
             }
          }
          /**
           * <pre>
           * Supported VAST companion ad types.  Recommended if companion Banner
           * objects are included via the companionad array.
           * Refer to enum com.iabtechlab.adcom.v1.CompanionType for generic values.
           * </pre>
           *
           * <code>repeated int32 companiontype = 20 [packed = true];</code>
           * @return A list containing the companiontype.
           */
          public java.util.List<java.lang.Integer>
              getCompaniontypeList() {
            return ((bitField0_ & 0x10000000) != 0) ?
                     java.util.Collections.unmodifiableList(companiontype_) : companiontype_;
          }
          /**
           * <pre>
           * Supported VAST companion ad types.  Recommended if companion Banner
           * objects are included via the companionad array.
           * Refer to enum com.iabtechlab.adcom.v1.CompanionType for generic values.
           * </pre>
           *
           * <code>repeated int32 companiontype = 20 [packed = true];</code>
           * @return The count of companiontype.
           */
          public int getCompaniontypeCount() {
            return companiontype_.size();
          }
          /**
           * <pre>
           * Supported VAST companion ad types.  Recommended if companion Banner
           * objects are included via the companionad array.
           * Refer to enum com.iabtechlab.adcom.v1.CompanionType for generic values.
           * </pre>
           *
           * <code>repeated int32 companiontype = 20 [packed = true];</code>
           * @param index The index of the element to return.
           * @return The companiontype at the given index.
           */
          public int getCompaniontype(int index) {
            return companiontype_.getInt(index);
          }
          /**
           * <pre>
           * Supported VAST companion ad types.  Recommended if companion Banner
           * objects are included via the companionad array.
           * Refer to enum com.iabtechlab.adcom.v1.CompanionType for generic values.
           * </pre>
           *
           * <code>repeated int32 companiontype = 20 [packed = true];</code>
           * @param index The index to set the value at.
           * @param value The companiontype to set.
           * @return This builder for chaining.
           */
          public Builder setCompaniontype(
              int index, int value) {
            ensureCompaniontypeIsMutable();
            companiontype_.setInt(index, value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Supported VAST companion ad types.  Recommended if companion Banner
           * objects are included via the companionad array.
           * Refer to enum com.iabtechlab.adcom.v1.CompanionType for generic values.
           * </pre>
           *
           * <code>repeated int32 companiontype = 20 [packed = true];</code>
           * @param value The companiontype to add.
           * @return This builder for chaining.
           */
          public Builder addCompaniontype(int value) {
            ensureCompaniontypeIsMutable();
            companiontype_.addInt(value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Supported VAST companion ad types.  Recommended if companion Banner
           * objects are included via the companionad array.
           * Refer to enum com.iabtechlab.adcom.v1.CompanionType for generic values.
           * </pre>
           *
           * <code>repeated int32 companiontype = 20 [packed = true];</code>
           * @param values The companiontype to add.
           * @return This builder for chaining.
           */
          public Builder addAllCompaniontype(
              java.lang.Iterable<? extends java.lang.Integer> values) {
            ensureCompaniontypeIsMutable();
            com.google.protobuf.AbstractMessageLite.Builder.addAll(
                values, companiontype_);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Supported VAST companion ad types.  Recommended if companion Banner
           * objects are included via the companionad array.
           * Refer to enum com.iabtechlab.adcom.v1.CompanionType for generic values.
           * </pre>
           *
           * <code>repeated int32 companiontype = 20 [packed = true];</code>
           * @return This builder for chaining.
           */
          public Builder clearCompaniontype() {
            companiontype_ = emptyIntList();
            bitField0_ = (bitField0_ & ~0x10000000);
            onChanged();
            return this;
          }

          private java.lang.Object podid_ = "";
          /**
           * <pre>
           * Unique identifier indicating that an impression opportunity belongs to
           * a video ad pod. If multiple impression opportunities within a bid
           * request share the same podid, this indicates that those impression
           * opportunities belong to the same video ad pod.
           * </pre>
           *
           * <code>optional string podid = 30;</code>
           * @return Whether the podid field is set.
           */
          public boolean hasPodid() {
            return ((bitField0_ & 0x20000000) != 0);
          }
          /**
           * <pre>
           * Unique identifier indicating that an impression opportunity belongs to
           * a video ad pod. If multiple impression opportunities within a bid
           * request share the same podid, this indicates that those impression
           * opportunities belong to the same video ad pod.
           * </pre>
           *
           * <code>optional string podid = 30;</code>
           * @return The podid.
           */
          public java.lang.String getPodid() {
            java.lang.Object ref = podid_;
            if (!(ref instanceof java.lang.String)) {
              com.google.protobuf.ByteString bs =
                  (com.google.protobuf.ByteString) ref;
              java.lang.String s = bs.toStringUtf8();
              if (bs.isValidUtf8()) {
                podid_ = s;
              }
              return s;
            } else {
              return (java.lang.String) ref;
            }
          }
          /**
           * <pre>
           * Unique identifier indicating that an impression opportunity belongs to
           * a video ad pod. If multiple impression opportunities within a bid
           * request share the same podid, this indicates that those impression
           * opportunities belong to the same video ad pod.
           * </pre>
           *
           * <code>optional string podid = 30;</code>
           * @return The bytes for podid.
           */
          public com.google.protobuf.ByteString
              getPodidBytes() {
            java.lang.Object ref = podid_;
            if (ref instanceof String) {
              com.google.protobuf.ByteString b = 
                  com.google.protobuf.ByteString.copyFromUtf8(
                      (java.lang.String) ref);
              podid_ = b;
              return b;
            } else {
              return (com.google.protobuf.ByteString) ref;
            }
          }
          /**
           * <pre>
           * Unique identifier indicating that an impression opportunity belongs to
           * a video ad pod. If multiple impression opportunities within a bid
           * request share the same podid, this indicates that those impression
           * opportunities belong to the same video ad pod.
           * </pre>
           *
           * <code>optional string podid = 30;</code>
           * @param value The podid to set.
           * @return This builder for chaining.
           */
          public Builder setPodid(
              java.lang.String value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x20000000;
            podid_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Unique identifier indicating that an impression opportunity belongs to
           * a video ad pod. If multiple impression opportunities within a bid
           * request share the same podid, this indicates that those impression
           * opportunities belong to the same video ad pod.
           * </pre>
           *
           * <code>optional string podid = 30;</code>
           * @return This builder for chaining.
           */
          public Builder clearPodid() {
            bitField0_ = (bitField0_ & ~0x20000000);
            podid_ = getDefaultInstance().getPodid();
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Unique identifier indicating that an impression opportunity belongs to
           * a video ad pod. If multiple impression opportunities within a bid
           * request share the same podid, this indicates that those impression
           * opportunities belong to the same video ad pod.
           * </pre>
           *
           * <code>optional string podid = 30;</code>
           * @param value The bytes for podid to set.
           * @return This builder for chaining.
           */
          public Builder setPodidBytes(
              com.google.protobuf.ByteString value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x20000000;
            podid_ = value;
            onChanged();
            return this;
          }

          private int podseq_ ;
          /**
           * <pre>
           * The sequence (position) of the video ad pod within a content stream.
           * </pre>
           *
           * <code>optional int32 podseq = 31 [default = 0];</code>
           * @return Whether the podseq field is set.
           */
          @java.lang.Override
          public boolean hasPodseq() {
            return ((bitField0_ & 0x40000000) != 0);
          }
          /**
           * <pre>
           * The sequence (position) of the video ad pod within a content stream.
           * </pre>
           *
           * <code>optional int32 podseq = 31 [default = 0];</code>
           * @return The podseq.
           */
          @java.lang.Override
          public int getPodseq() {
            return podseq_;
          }
          /**
           * <pre>
           * The sequence (position) of the video ad pod within a content stream.
           * </pre>
           *
           * <code>optional int32 podseq = 31 [default = 0];</code>
           * @param value The podseq to set.
           * @return This builder for chaining.
           */
          public Builder setPodseq(int value) {
            bitField0_ |= 0x40000000;
            podseq_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * The sequence (position) of the video ad pod within a content stream.
           * </pre>
           *
           * <code>optional int32 podseq = 31 [default = 0];</code>
           * @return This builder for chaining.
           */
          public Builder clearPodseq() {
            bitField0_ = (bitField0_ & ~0x40000000);
            podseq_ = 0;
            onChanged();
            return this;
          }

          private com.google.protobuf.Internal.IntList rqddurs_ = emptyIntList();
          private void ensureRqddursIsMutable() {
            if (!((bitField0_ & 0x80000000) != 0)) {
              rqddurs_ = mutableCopy(rqddurs_);
              bitField0_ |= 0x80000000;
             }
          }
          /**
           * <pre>
           * Precise acceptable durations for video creatives in seconds. This
           * field specifically targets the Live TV use case where non-exact ad
           * durations would result in undesirable ‘dead air’. This field is
           * mutually exclusive with minduration and maxduration; if rqddurs is
           * specified, minduration and maxduration must not be specified and vice
           * versa.
           * </pre>
           *
           * <code>repeated int32 rqddurs = 32 [packed = true];</code>
           * @return A list containing the rqddurs.
           */
          public java.util.List<java.lang.Integer>
              getRqddursList() {
            return ((bitField0_ & 0x80000000) != 0) ?
                     java.util.Collections.unmodifiableList(rqddurs_) : rqddurs_;
          }
          /**
           * <pre>
           * Precise acceptable durations for video creatives in seconds. This
           * field specifically targets the Live TV use case where non-exact ad
           * durations would result in undesirable ‘dead air’. This field is
           * mutually exclusive with minduration and maxduration; if rqddurs is
           * specified, minduration and maxduration must not be specified and vice
           * versa.
           * </pre>
           *
           * <code>repeated int32 rqddurs = 32 [packed = true];</code>
           * @return The count of rqddurs.
           */
          public int getRqddursCount() {
            return rqddurs_.size();
          }
          /**
           * <pre>
           * Precise acceptable durations for video creatives in seconds. This
           * field specifically targets the Live TV use case where non-exact ad
           * durations would result in undesirable ‘dead air’. This field is
           * mutually exclusive with minduration and maxduration; if rqddurs is
           * specified, minduration and maxduration must not be specified and vice
           * versa.
           * </pre>
           *
           * <code>repeated int32 rqddurs = 32 [packed = true];</code>
           * @param index The index of the element to return.
           * @return The rqddurs at the given index.
           */
          public int getRqddurs(int index) {
            return rqddurs_.getInt(index);
          }
          /**
           * <pre>
           * Precise acceptable durations for video creatives in seconds. This
           * field specifically targets the Live TV use case where non-exact ad
           * durations would result in undesirable ‘dead air’. This field is
           * mutually exclusive with minduration and maxduration; if rqddurs is
           * specified, minduration and maxduration must not be specified and vice
           * versa.
           * </pre>
           *
           * <code>repeated int32 rqddurs = 32 [packed = true];</code>
           * @param index The index to set the value at.
           * @param value The rqddurs to set.
           * @return This builder for chaining.
           */
          public Builder setRqddurs(
              int index, int value) {
            ensureRqddursIsMutable();
            rqddurs_.setInt(index, value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Precise acceptable durations for video creatives in seconds. This
           * field specifically targets the Live TV use case where non-exact ad
           * durations would result in undesirable ‘dead air’. This field is
           * mutually exclusive with minduration and maxduration; if rqddurs is
           * specified, minduration and maxduration must not be specified and vice
           * versa.
           * </pre>
           *
           * <code>repeated int32 rqddurs = 32 [packed = true];</code>
           * @param value The rqddurs to add.
           * @return This builder for chaining.
           */
          public Builder addRqddurs(int value) {
            ensureRqddursIsMutable();
            rqddurs_.addInt(value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Precise acceptable durations for video creatives in seconds. This
           * field specifically targets the Live TV use case where non-exact ad
           * durations would result in undesirable ‘dead air’. This field is
           * mutually exclusive with minduration and maxduration; if rqddurs is
           * specified, minduration and maxduration must not be specified and vice
           * versa.
           * </pre>
           *
           * <code>repeated int32 rqddurs = 32 [packed = true];</code>
           * @param values The rqddurs to add.
           * @return This builder for chaining.
           */
          public Builder addAllRqddurs(
              java.lang.Iterable<? extends java.lang.Integer> values) {
            ensureRqddursIsMutable();
            com.google.protobuf.AbstractMessageLite.Builder.addAll(
                values, rqddurs_);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Precise acceptable durations for video creatives in seconds. This
           * field specifically targets the Live TV use case where non-exact ad
           * durations would result in undesirable ‘dead air’. This field is
           * mutually exclusive with minduration and maxduration; if rqddurs is
           * specified, minduration and maxduration must not be specified and vice
           * versa.
           * </pre>
           *
           * <code>repeated int32 rqddurs = 32 [packed = true];</code>
           * @return This builder for chaining.
           */
          public Builder clearRqddurs() {
            rqddurs_ = emptyIntList();
            bitField0_ = (bitField0_ & ~0x80000000);
            onChanged();
            return this;
          }

          private int placement_ ;
          /**
           * <pre>
           * Placement type for the impression.
           * Refer to enum com.iabtechlab.adcom.v1.VideoPlacementSubtype for generic values.
           * </pre>
           *
           * <code>optional int32 placement = 26 [deprecated = true];</code>
           * @return Whether the placement field is set.
           */
          @java.lang.Override
          @java.lang.Deprecated public boolean hasPlacement() {
            return ((bitField1_ & 0x00000001) != 0);
          }
          /**
           * <pre>
           * Placement type for the impression.
           * Refer to enum com.iabtechlab.adcom.v1.VideoPlacementSubtype for generic values.
           * </pre>
           *
           * <code>optional int32 placement = 26 [deprecated = true];</code>
           * @return The placement.
           */
          @java.lang.Override
          @java.lang.Deprecated public int getPlacement() {
            return placement_;
          }
          /**
           * <pre>
           * Placement type for the impression.
           * Refer to enum com.iabtechlab.adcom.v1.VideoPlacementSubtype for generic values.
           * </pre>
           *
           * <code>optional int32 placement = 26 [deprecated = true];</code>
           * @param value The placement to set.
           * @return This builder for chaining.
           */
          @java.lang.Deprecated public Builder setPlacement(int value) {
            bitField1_ |= 0x00000001;
            placement_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Placement type for the impression.
           * Refer to enum com.iabtechlab.adcom.v1.VideoPlacementSubtype for generic values.
           * </pre>
           *
           * <code>optional int32 placement = 26 [deprecated = true];</code>
           * @return This builder for chaining.
           */
          @java.lang.Deprecated public Builder clearPlacement() {
            bitField1_ = (bitField1_ & ~0x00000001);
            placement_ = 0;
            onChanged();
            return this;
          }

          private int plcmt_ ;
          /**
           * <pre>
           * Video placement type for the impression.
           * Refer to enum com.iabtechlab.adcom.v1.VideoPlcmtSubtype for generic values.
           * </pre>
           *
           * <code>optional int32 plcmt = 35;</code>
           * @return Whether the plcmt field is set.
           */
          @java.lang.Override
          public boolean hasPlcmt() {
            return ((bitField1_ & 0x00000002) != 0);
          }
          /**
           * <pre>
           * Video placement type for the impression.
           * Refer to enum com.iabtechlab.adcom.v1.VideoPlcmtSubtype for generic values.
           * </pre>
           *
           * <code>optional int32 plcmt = 35;</code>
           * @return The plcmt.
           */
          @java.lang.Override
          public int getPlcmt() {
            return plcmt_;
          }
          /**
           * <pre>
           * Video placement type for the impression.
           * Refer to enum com.iabtechlab.adcom.v1.VideoPlcmtSubtype for generic values.
           * </pre>
           *
           * <code>optional int32 plcmt = 35;</code>
           * @param value The plcmt to set.
           * @return This builder for chaining.
           */
          public Builder setPlcmt(int value) {
            bitField1_ |= 0x00000002;
            plcmt_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Video placement type for the impression.
           * Refer to enum com.iabtechlab.adcom.v1.VideoPlcmtSubtype for generic values.
           * </pre>
           *
           * <code>optional int32 plcmt = 35;</code>
           * @return This builder for chaining.
           */
          public Builder clearPlcmt() {
            bitField1_ = (bitField1_ & ~0x00000002);
            plcmt_ = 0;
            onChanged();
            return this;
          }

          private int playbackend_ ;
          /**
           * <pre>
           * The event that causes playback to end.
           * Refer to enum com.iabtechlab.adcom.v1.PlaybackCessationMode for generic values.
           * </pre>
           *
           * <code>optional int32 playbackend = 27;</code>
           * @return Whether the playbackend field is set.
           */
          @java.lang.Override
          public boolean hasPlaybackend() {
            return ((bitField1_ & 0x00000004) != 0);
          }
          /**
           * <pre>
           * The event that causes playback to end.
           * Refer to enum com.iabtechlab.adcom.v1.PlaybackCessationMode for generic values.
           * </pre>
           *
           * <code>optional int32 playbackend = 27;</code>
           * @return The playbackend.
           */
          @java.lang.Override
          public int getPlaybackend() {
            return playbackend_;
          }
          /**
           * <pre>
           * The event that causes playback to end.
           * Refer to enum com.iabtechlab.adcom.v1.PlaybackCessationMode for generic values.
           * </pre>
           *
           * <code>optional int32 playbackend = 27;</code>
           * @param value The playbackend to set.
           * @return This builder for chaining.
           */
          public Builder setPlaybackend(int value) {
            bitField1_ |= 0x00000004;
            playbackend_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * The event that causes playback to end.
           * Refer to enum com.iabtechlab.adcom.v1.PlaybackCessationMode for generic values.
           * </pre>
           *
           * <code>optional int32 playbackend = 27;</code>
           * @return This builder for chaining.
           */
          public Builder clearPlaybackend() {
            bitField1_ = (bitField1_ & ~0x00000004);
            playbackend_ = 0;
            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:com.iabtechlab.openrtb.v2.BidRequest.Imp.Video)
        }

        // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.BidRequest.Imp.Video)
        private static final com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video DEFAULT_INSTANCE;
        static {
          DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video();
        }

        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video getDefaultInstance() {
          return DEFAULT_INSTANCE;
        }

        @java.lang.Deprecated public static final com.google.protobuf.Parser<Video>
            PARSER = new com.google.protobuf.AbstractParser<Video>() {
          @java.lang.Override
          public Video parsePartialFrom(
              com.google.protobuf.CodedInputStream input,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.protobuf.InvalidProtocolBufferException {
            return new Video(input, extensionRegistry);
          }
        };

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

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

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video getDefaultInstanceForType() {
          return DEFAULT_INSTANCE;
        }

      }

      public interface AudioOrBuilder extends
          // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.BidRequest.Imp.Audio)
          com.google.protobuf.GeneratedMessageV3.
              ExtendableMessageOrBuilder<Audio> {

        /**
         * <pre>
         * Content MIME types supported (e.g., "audio/mp4").
         * REQUIRED by the OpenRTB specification: at least 1 element.
         * </pre>
         *
         * <code>repeated string mimes = 1;</code>
         * @return A list containing the mimes.
         */
        java.util.List<java.lang.String>
            getMimesList();
        /**
         * <pre>
         * Content MIME types supported (e.g., "audio/mp4").
         * REQUIRED by the OpenRTB specification: at least 1 element.
         * </pre>
         *
         * <code>repeated string mimes = 1;</code>
         * @return The count of mimes.
         */
        int getMimesCount();
        /**
         * <pre>
         * Content MIME types supported (e.g., "audio/mp4").
         * REQUIRED by the OpenRTB specification: at least 1 element.
         * </pre>
         *
         * <code>repeated string mimes = 1;</code>
         * @param index The index of the element to return.
         * @return The mimes at the given index.
         */
        java.lang.String getMimes(int index);
        /**
         * <pre>
         * Content MIME types supported (e.g., "audio/mp4").
         * REQUIRED by the OpenRTB specification: at least 1 element.
         * </pre>
         *
         * <code>repeated string mimes = 1;</code>
         * @param index The index of the value to return.
         * @return The bytes of the mimes at the given index.
         */
        com.google.protobuf.ByteString
            getMimesBytes(int index);

        /**
         * <pre>
         * Minimum audio ad duration in seconds.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional int32 minduration = 2;</code>
         * @return Whether the minduration field is set.
         */
        boolean hasMinduration();
        /**
         * <pre>
         * Minimum audio ad duration in seconds.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional int32 minduration = 2;</code>
         * @return The minduration.
         */
        int getMinduration();

        /**
         * <pre>
         * Maximum audio ad duration in seconds.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional int32 maxduration = 3;</code>
         * @return Whether the maxduration field is set.
         */
        boolean hasMaxduration();
        /**
         * <pre>
         * Maximum audio ad duration in seconds.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional int32 maxduration = 3;</code>
         * @return The maxduration.
         */
        int getMaxduration();

        /**
         * <pre>
         * Indicates the total amount of time in seconds that advertisers may
         * fill for a “dynamic” video ad pod (See Section 7.6 for more details),
         * or the dynamic portion of a “hybrid” ad pod. This field is required
         * only for the dynamic portion(s) of video ad pods. This field refers to
         * the length of the entire ad break, whereas
         * minduration/maxduration/rqddurs are constraints relating to the slots
         * that make up the pod.
         * </pre>
         *
         * <code>optional int32 poddur = 25;</code>
         * @return Whether the poddur field is set.
         */
        boolean hasPoddur();
        /**
         * <pre>
         * Indicates the total amount of time in seconds that advertisers may
         * fill for a “dynamic” video ad pod (See Section 7.6 for more details),
         * or the dynamic portion of a “hybrid” ad pod. This field is required
         * only for the dynamic portion(s) of video ad pods. This field refers to
         * the length of the entire ad break, whereas
         * minduration/maxduration/rqddurs are constraints relating to the slots
         * that make up the pod.
         * </pre>
         *
         * <code>optional int32 poddur = 25;</code>
         * @return The poddur.
         */
        int getPoddur();

        /**
         * <pre>
         * Array of supported audio protocols.
         * Refer to enum com.iabtechlab.adcom.v1.Creative.AudioVideoType for generic values.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>repeated int32 protocols = 4 [packed = true];</code>
         * @return A list containing the protocols.
         */
        java.util.List<java.lang.Integer> getProtocolsList();
        /**
         * <pre>
         * Array of supported audio protocols.
         * Refer to enum com.iabtechlab.adcom.v1.Creative.AudioVideoType for generic values.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>repeated int32 protocols = 4 [packed = true];</code>
         * @return The count of protocols.
         */
        int getProtocolsCount();
        /**
         * <pre>
         * Array of supported audio protocols.
         * Refer to enum com.iabtechlab.adcom.v1.Creative.AudioVideoType for generic values.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>repeated int32 protocols = 4 [packed = true];</code>
         * @param index The index of the element to return.
         * @return The protocols at the given index.
         */
        int getProtocols(int index);

        /**
         * <pre>
         * Indicates the start delay in seconds for pre-roll, mid-roll, or
         * post-roll ad placements.
         * Refer to enum com.iabtechlab.adcom.v1.StartDelayMode for generic values.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional int32 startdelay = 5;</code>
         * @return Whether the startdelay field is set.
         */
        boolean hasStartdelay();
        /**
         * <pre>
         * Indicates the start delay in seconds for pre-roll, mid-roll, or
         * post-roll ad placements.
         * Refer to enum com.iabtechlab.adcom.v1.StartDelayMode for generic values.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional int32 startdelay = 5;</code>
         * @return The startdelay.
         */
        int getStartdelay();

        /**
         * <pre>
         * Precise acceptable durations for audio creatives in seconds. This
         * field specifically targets the live audio/radio use case where
         * non-exact ad durations would result in undesirable 'dead air'. This
         * field is mutually exclusive with minduraiton and maxduration; if
         * rqddurs is specified, minduraiton and maxduration must not be
         * specified and vice versa.
         * </pre>
         *
         * <code>repeated int32 rqddurs = 26 [packed = true];</code>
         * @return A list containing the rqddurs.
         */
        java.util.List<java.lang.Integer> getRqddursList();
        /**
         * <pre>
         * Precise acceptable durations for audio creatives in seconds. This
         * field specifically targets the live audio/radio use case where
         * non-exact ad durations would result in undesirable 'dead air'. This
         * field is mutually exclusive with minduraiton and maxduration; if
         * rqddurs is specified, minduraiton and maxduration must not be
         * specified and vice versa.
         * </pre>
         *
         * <code>repeated int32 rqddurs = 26 [packed = true];</code>
         * @return The count of rqddurs.
         */
        int getRqddursCount();
        /**
         * <pre>
         * Precise acceptable durations for audio creatives in seconds. This
         * field specifically targets the live audio/radio use case where
         * non-exact ad durations would result in undesirable 'dead air'. This
         * field is mutually exclusive with minduraiton and maxduration; if
         * rqddurs is specified, minduraiton and maxduration must not be
         * specified and vice versa.
         * </pre>
         *
         * <code>repeated int32 rqddurs = 26 [packed = true];</code>
         * @param index The index of the element to return.
         * @return The rqddurs at the given index.
         */
        int getRqddurs(int index);

        /**
         * <pre>
         * Unique identifier indicating that an impression opportunity belongs to
         * an audio ad pod. If multiple impression opportunities within a bid
         * request share the same podid, this indicates that those impression
         * opportunities belong to the same audio ad pod.
         * </pre>
         *
         * <code>optional string podid = 27;</code>
         * @return Whether the podid field is set.
         */
        boolean hasPodid();
        /**
         * <pre>
         * Unique identifier indicating that an impression opportunity belongs to
         * an audio ad pod. If multiple impression opportunities within a bid
         * request share the same podid, this indicates that those impression
         * opportunities belong to the same audio ad pod.
         * </pre>
         *
         * <code>optional string podid = 27;</code>
         * @return The podid.
         */
        java.lang.String getPodid();
        /**
         * <pre>
         * Unique identifier indicating that an impression opportunity belongs to
         * an audio ad pod. If multiple impression opportunities within a bid
         * request share the same podid, this indicates that those impression
         * opportunities belong to the same audio ad pod.
         * </pre>
         *
         * <code>optional string podid = 27;</code>
         * @return The bytes for podid.
         */
        com.google.protobuf.ByteString
            getPodidBytes();

        /**
         * <pre>
         * The sequence (position) of the audio ad pod within a content stream.
         * </pre>
         *
         * <code>optional int32 podseq = 28 [default = 0];</code>
         * @return Whether the podseq field is set.
         */
        boolean hasPodseq();
        /**
         * <pre>
         * The sequence (position) of the audio ad pod within a content stream.
         * </pre>
         *
         * <code>optional int32 podseq = 28 [default = 0];</code>
         * @return The podseq.
         */
        int getPodseq();

        /**
         * <pre>
         * If multiple ad impressions are offered in the same bid request,
         * the sequence number will allow for the coordinated delivery of
         * multiple creatives.
         * </pre>
         *
         * <code>optional int32 sequence = 6 [default = 1, deprecated = true];</code>
         * @return Whether the sequence field is set.
         */
        @java.lang.Deprecated boolean hasSequence();
        /**
         * <pre>
         * If multiple ad impressions are offered in the same bid request,
         * the sequence number will allow for the coordinated delivery of
         * multiple creatives.
         * </pre>
         *
         * <code>optional int32 sequence = 6 [default = 1, deprecated = true];</code>
         * @return The sequence.
         */
        @java.lang.Deprecated int getSequence();

        /**
         * <pre>
         * For audio ad pods, this value indicates that the seller can guarantee
         * delivery against the indicated slot position in the pod.
         * </pre>
         *
         * <code>optional int32 slotinpod = 29 [default = 0];</code>
         * @return Whether the slotinpod field is set.
         */
        boolean hasSlotinpod();
        /**
         * <pre>
         * For audio ad pods, this value indicates that the seller can guarantee
         * delivery against the indicated slot position in the pod.
         * </pre>
         *
         * <code>optional int32 slotinpod = 29 [default = 0];</code>
         * @return The slotinpod.
         */
        int getSlotinpod();

        /**
         * <pre>
         * Minimum CPM per second. This is a price floor for the “dynamic”
         * portion of an audio ad pod, relative to the duration of bids an
         * advertiser may submit.
         * </pre>
         *
         * <code>optional double mincpmpersec = 30;</code>
         * @return Whether the mincpmpersec field is set.
         */
        boolean hasMincpmpersec();
        /**
         * <pre>
         * Minimum CPM per second. This is a price floor for the “dynamic”
         * portion of an audio ad pod, relative to the duration of bids an
         * advertiser may submit.
         * </pre>
         *
         * <code>optional double mincpmpersec = 30;</code>
         * @return The mincpmpersec.
         */
        double getMincpmpersec();

        /**
         * <pre>
         * Blocked creative attributes.
         * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
         * </pre>
         *
         * <code>repeated int32 battr = 7 [packed = true];</code>
         * @return A list containing the battr.
         */
        java.util.List<java.lang.Integer> getBattrList();
        /**
         * <pre>
         * Blocked creative attributes.
         * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
         * </pre>
         *
         * <code>repeated int32 battr = 7 [packed = true];</code>
         * @return The count of battr.
         */
        int getBattrCount();
        /**
         * <pre>
         * Blocked creative attributes.
         * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
         * </pre>
         *
         * <code>repeated int32 battr = 7 [packed = true];</code>
         * @param index The index of the element to return.
         * @return The battr at the given index.
         */
        int getBattr(int index);

        /**
         * <pre>
         * Maximum extended video ad duration, if extension is allowed.
         * If blank or 0, extension is not allowed. If -1, extension is allowed,
         * and there is no time limit imposed. If greater than 0, then the value
         * represents the number of seconds of extended play supported beyond
         * the maxduration value.
         * </pre>
         *
         * <code>optional int32 maxextended = 8;</code>
         * @return Whether the maxextended field is set.
         */
        boolean hasMaxextended();
        /**
         * <pre>
         * Maximum extended video ad duration, if extension is allowed.
         * If blank or 0, extension is not allowed. If -1, extension is allowed,
         * and there is no time limit imposed. If greater than 0, then the value
         * represents the number of seconds of extended play supported beyond
         * the maxduration value.
         * </pre>
         *
         * <code>optional int32 maxextended = 8;</code>
         * @return The maxextended.
         */
        int getMaxextended();

        /**
         * <pre>
         * Minimum bit rate in Kbps.
         * </pre>
         *
         * <code>optional int32 minbitrate = 9;</code>
         * @return Whether the minbitrate field is set.
         */
        boolean hasMinbitrate();
        /**
         * <pre>
         * Minimum bit rate in Kbps.
         * </pre>
         *
         * <code>optional int32 minbitrate = 9;</code>
         * @return The minbitrate.
         */
        int getMinbitrate();

        /**
         * <pre>
         * Maximum bit rate in Kbps.
         * </pre>
         *
         * <code>optional int32 maxbitrate = 10;</code>
         * @return Whether the maxbitrate field is set.
         */
        boolean hasMaxbitrate();
        /**
         * <pre>
         * Maximum bit rate in Kbps.
         * </pre>
         *
         * <code>optional int32 maxbitrate = 10;</code>
         * @return The maxbitrate.
         */
        int getMaxbitrate();

        /**
         * <pre>
         * Supported delivery methods (e.g., streaming, progressive).
         * If none specified, assume all are supported.
         * Refer to enum com.iabtechlab.adcom.v1.enums.DeliveryMethod for generic values.
         * </pre>
         *
         * <code>repeated int32 delivery = 11 [packed = true];</code>
         * @return A list containing the delivery.
         */
        java.util.List<java.lang.Integer> getDeliveryList();
        /**
         * <pre>
         * Supported delivery methods (e.g., streaming, progressive).
         * If none specified, assume all are supported.
         * Refer to enum com.iabtechlab.adcom.v1.enums.DeliveryMethod for generic values.
         * </pre>
         *
         * <code>repeated int32 delivery = 11 [packed = true];</code>
         * @return The count of delivery.
         */
        int getDeliveryCount();
        /**
         * <pre>
         * Supported delivery methods (e.g., streaming, progressive).
         * If none specified, assume all are supported.
         * Refer to enum com.iabtechlab.adcom.v1.enums.DeliveryMethod for generic values.
         * </pre>
         *
         * <code>repeated int32 delivery = 11 [packed = true];</code>
         * @param index The index of the element to return.
         * @return The delivery at the given index.
         */
        int getDelivery(int index);

        /**
         * <pre>
         * Array of Banner objects if companion ads are available.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 12;</code>
         */
        java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner> 
            getCompanionadList();
        /**
         * <pre>
         * Array of Banner objects if companion ads are available.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 12;</code>
         */
        com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner getCompanionad(int index);
        /**
         * <pre>
         * Array of Banner objects if companion ads are available.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 12;</code>
         */
        int getCompanionadCount();
        /**
         * <pre>
         * Array of Banner objects if companion ads are available.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 12;</code>
         */
        java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.BannerOrBuilder> 
            getCompanionadOrBuilderList();
        /**
         * <pre>
         * Array of Banner objects if companion ads are available.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 12;</code>
         */
        com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.BannerOrBuilder getCompanionadOrBuilder(
            int index);

        /**
         * <pre>
         * List of supported API frameworks for this impression.
         * If an API is not explicitly listed, it is assumed not to be supported.
         * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
         * </pre>
         *
         * <code>repeated int32 api = 13 [packed = true];</code>
         * @return A list containing the api.
         */
        java.util.List<java.lang.Integer> getApiList();
        /**
         * <pre>
         * List of supported API frameworks for this impression.
         * If an API is not explicitly listed, it is assumed not to be supported.
         * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
         * </pre>
         *
         * <code>repeated int32 api = 13 [packed = true];</code>
         * @return The count of api.
         */
        int getApiCount();
        /**
         * <pre>
         * List of supported API frameworks for this impression.
         * If an API is not explicitly listed, it is assumed not to be supported.
         * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
         * </pre>
         *
         * <code>repeated int32 api = 13 [packed = true];</code>
         * @param index The index of the element to return.
         * @return The api at the given index.
         */
        int getApi(int index);

        /**
         * <pre>
         * Supported DAAST companion ad types.  Recommended if companion Banner
         * objects are included via the companionad array.
         * Refer to enum com.iabtechlab.adcom.v1.CompanionType for generic values.
         * </pre>
         *
         * <code>repeated int32 companiontype = 20 [packed = true];</code>
         * @return A list containing the companiontype.
         */
        java.util.List<java.lang.Integer> getCompaniontypeList();
        /**
         * <pre>
         * Supported DAAST companion ad types.  Recommended if companion Banner
         * objects are included via the companionad array.
         * Refer to enum com.iabtechlab.adcom.v1.CompanionType for generic values.
         * </pre>
         *
         * <code>repeated int32 companiontype = 20 [packed = true];</code>
         * @return The count of companiontype.
         */
        int getCompaniontypeCount();
        /**
         * <pre>
         * Supported DAAST companion ad types.  Recommended if companion Banner
         * objects are included via the companionad array.
         * Refer to enum com.iabtechlab.adcom.v1.CompanionType for generic values.
         * </pre>
         *
         * <code>repeated int32 companiontype = 20 [packed = true];</code>
         * @param index The index of the element to return.
         * @return The companiontype at the given index.
         */
        int getCompaniontype(int index);

        /**
         * <pre>
         * The maximum number of ads that can be played in an ad pod.
         * </pre>
         *
         * <code>optional int32 maxseq = 21;</code>
         * @return Whether the maxseq field is set.
         */
        boolean hasMaxseq();
        /**
         * <pre>
         * The maximum number of ads that can be played in an ad pod.
         * </pre>
         *
         * <code>optional int32 maxseq = 21;</code>
         * @return The maxseq.
         */
        int getMaxseq();

        /**
         * <pre>
         * Type of audio feed.
         * Refer to enum com.iabtechlab.adcom.v1.enums.FeedType for generic values.
         * </pre>
         *
         * <code>optional int32 feed = 22;</code>
         * @return Whether the feed field is set.
         */
        boolean hasFeed();
        /**
         * <pre>
         * Type of audio feed.
         * Refer to enum com.iabtechlab.adcom.v1.enums.FeedType for generic values.
         * </pre>
         *
         * <code>optional int32 feed = 22;</code>
         * @return The feed.
         */
        int getFeed();

        /**
         * <pre>
         * Indicates if the ad is stitched with audio content or delivered
         * independently, where 0 = no, 1 = yes.
         * </pre>
         *
         * <code>optional bool stitched = 23;</code>
         * @return Whether the stitched field is set.
         */
        boolean hasStitched();
        /**
         * <pre>
         * Indicates if the ad is stitched with audio content or delivered
         * independently, where 0 = no, 1 = yes.
         * </pre>
         *
         * <code>optional bool stitched = 23;</code>
         * @return The stitched.
         */
        boolean getStitched();

        /**
         * <pre>
         * Volume normalization mode.
         * Refer to enum com.iabtechlab.adcom.v1.VolumeNormalizationMode for generic values.
         * </pre>
         *
         * <code>optional int32 nvol = 24;</code>
         * @return Whether the nvol field is set.
         */
        boolean hasNvol();
        /**
         * <pre>
         * Volume normalization mode.
         * Refer to enum com.iabtechlab.adcom.v1.VolumeNormalizationMode for generic values.
         * </pre>
         *
         * <code>optional int32 nvol = 24;</code>
         * @return The nvol.
         */
        int getNvol();
      }
      /**
       * <pre>
       * This object represents an audio type impression. Many of the fields
       * are non-essential for minimally viable transactions, but are included
       * to offer fine control when needed. Audio in OpenRTB generally assumes
       * compliance with the DAAST standard. As such, the notion of companion
       * ads is supported by optionally including an array of Banner objects
       * that define these companion ads.
       * The presence of a Audio as a subordinate of the Imp object indicates
       * that this impression is offered as an audio type impression.
       * At the publisher's discretion, that same impression may also be offered
       * as banner, video, and/or native by also including as Imp subordinates
       * objects of those types. However, any given bid for the impression must
       * conform to one of the offered types.
       * </pre>
       *
       * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Imp.Audio}
       */
      public static final class Audio extends
          com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
            Audio> implements
          // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.BidRequest.Imp.Audio)
          AudioOrBuilder {
      private static final long serialVersionUID = 0L;
        // Use Audio.newBuilder() to construct.
        private Audio(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio, ?> builder) {
          super(builder);
        }
        private Audio() {
          mimes_ = com.google.protobuf.LazyStringArrayList.EMPTY;
          protocols_ = emptyIntList();
          rqddurs_ = emptyIntList();
          podid_ = "";
          sequence_ = 1;
          battr_ = emptyIntList();
          delivery_ = emptyIntList();
          companionad_ = java.util.Collections.emptyList();
          api_ = emptyIntList();
          companiontype_ = emptyIntList();
        }

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

        @java.lang.Override
        public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
          return this.unknownFields;
        }
        private Audio(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          this();
          if (extensionRegistry == null) {
            throw new java.lang.NullPointerException();
          }
          int mutable_bitField0_ = 0;
          com.google.protobuf.UnknownFieldSet.Builder unknownFields =
              com.google.protobuf.UnknownFieldSet.newBuilder();
          try {
            boolean done = false;
            while (!done) {
              int tag = input.readTag();
              switch (tag) {
                case 0:
                  done = true;
                  break;
                case 10: {
                  com.google.protobuf.ByteString bs = input.readBytes();
                  if (!((mutable_bitField0_ & 0x00000001) != 0)) {
                    mimes_ = new com.google.protobuf.LazyStringArrayList();
                    mutable_bitField0_ |= 0x00000001;
                  }
                  mimes_.add(bs);
                  break;
                }
                case 16: {
                  bitField0_ |= 0x00000001;
                  minduration_ = input.readInt32();
                  break;
                }
                case 24: {
                  bitField0_ |= 0x00000002;
                  maxduration_ = input.readInt32();
                  break;
                }
                case 32: {
                  if (!((mutable_bitField0_ & 0x00000010) != 0)) {
                    protocols_ = newIntList();
                    mutable_bitField0_ |= 0x00000010;
                  }
                  protocols_.addInt(input.readInt32());
                  break;
                }
                case 34: {
                  int length = input.readRawVarint32();
                  int limit = input.pushLimit(length);
                  if (!((mutable_bitField0_ & 0x00000010) != 0) && input.getBytesUntilLimit() > 0) {
                    protocols_ = newIntList();
                    mutable_bitField0_ |= 0x00000010;
                  }
                  while (input.getBytesUntilLimit() > 0) {
                    protocols_.addInt(input.readInt32());
                  }
                  input.popLimit(limit);
                  break;
                }
                case 40: {
                  bitField0_ |= 0x00000008;
                  startdelay_ = input.readInt32();
                  break;
                }
                case 48: {
                  bitField0_ |= 0x00000040;
                  sequence_ = input.readInt32();
                  break;
                }
                case 56: {
                  if (!((mutable_bitField0_ & 0x00001000) != 0)) {
                    battr_ = newIntList();
                    mutable_bitField0_ |= 0x00001000;
                  }
                  battr_.addInt(input.readInt32());
                  break;
                }
                case 58: {
                  int length = input.readRawVarint32();
                  int limit = input.pushLimit(length);
                  if (!((mutable_bitField0_ & 0x00001000) != 0) && input.getBytesUntilLimit() > 0) {
                    battr_ = newIntList();
                    mutable_bitField0_ |= 0x00001000;
                  }
                  while (input.getBytesUntilLimit() > 0) {
                    battr_.addInt(input.readInt32());
                  }
                  input.popLimit(limit);
                  break;
                }
                case 64: {
                  bitField0_ |= 0x00000200;
                  maxextended_ = input.readInt32();
                  break;
                }
                case 72: {
                  bitField0_ |= 0x00000400;
                  minbitrate_ = input.readInt32();
                  break;
                }
                case 80: {
                  bitField0_ |= 0x00000800;
                  maxbitrate_ = input.readInt32();
                  break;
                }
                case 88: {
                  if (!((mutable_bitField0_ & 0x00010000) != 0)) {
                    delivery_ = newIntList();
                    mutable_bitField0_ |= 0x00010000;
                  }
                  delivery_.addInt(input.readInt32());
                  break;
                }
                case 90: {
                  int length = input.readRawVarint32();
                  int limit = input.pushLimit(length);
                  if (!((mutable_bitField0_ & 0x00010000) != 0) && input.getBytesUntilLimit() > 0) {
                    delivery_ = newIntList();
                    mutable_bitField0_ |= 0x00010000;
                  }
                  while (input.getBytesUntilLimit() > 0) {
                    delivery_.addInt(input.readInt32());
                  }
                  input.popLimit(limit);
                  break;
                }
                case 98: {
                  if (!((mutable_bitField0_ & 0x00020000) != 0)) {
                    companionad_ = new java.util.ArrayList<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner>();
                    mutable_bitField0_ |= 0x00020000;
                  }
                  companionad_.add(
                      input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.PARSER, extensionRegistry));
                  break;
                }
                case 104: {
                  if (!((mutable_bitField0_ & 0x00040000) != 0)) {
                    api_ = newIntList();
                    mutable_bitField0_ |= 0x00040000;
                  }
                  api_.addInt(input.readInt32());
                  break;
                }
                case 106: {
                  int length = input.readRawVarint32();
                  int limit = input.pushLimit(length);
                  if (!((mutable_bitField0_ & 0x00040000) != 0) && input.getBytesUntilLimit() > 0) {
                    api_ = newIntList();
                    mutable_bitField0_ |= 0x00040000;
                  }
                  while (input.getBytesUntilLimit() > 0) {
                    api_.addInt(input.readInt32());
                  }
                  input.popLimit(limit);
                  break;
                }
                case 160: {
                  if (!((mutable_bitField0_ & 0x00080000) != 0)) {
                    companiontype_ = newIntList();
                    mutable_bitField0_ |= 0x00080000;
                  }
                  companiontype_.addInt(input.readInt32());
                  break;
                }
                case 162: {
                  int length = input.readRawVarint32();
                  int limit = input.pushLimit(length);
                  if (!((mutable_bitField0_ & 0x00080000) != 0) && input.getBytesUntilLimit() > 0) {
                    companiontype_ = newIntList();
                    mutable_bitField0_ |= 0x00080000;
                  }
                  while (input.getBytesUntilLimit() > 0) {
                    companiontype_.addInt(input.readInt32());
                  }
                  input.popLimit(limit);
                  break;
                }
                case 168: {
                  bitField0_ |= 0x00001000;
                  maxseq_ = input.readInt32();
                  break;
                }
                case 176: {
                  bitField0_ |= 0x00002000;
                  feed_ = input.readInt32();
                  break;
                }
                case 184: {
                  bitField0_ |= 0x00004000;
                  stitched_ = input.readBool();
                  break;
                }
                case 192: {
                  bitField0_ |= 0x00008000;
                  nvol_ = input.readInt32();
                  break;
                }
                case 200: {
                  bitField0_ |= 0x00000004;
                  poddur_ = input.readInt32();
                  break;
                }
                case 208: {
                  if (!((mutable_bitField0_ & 0x00000040) != 0)) {
                    rqddurs_ = newIntList();
                    mutable_bitField0_ |= 0x00000040;
                  }
                  rqddurs_.addInt(input.readInt32());
                  break;
                }
                case 210: {
                  int length = input.readRawVarint32();
                  int limit = input.pushLimit(length);
                  if (!((mutable_bitField0_ & 0x00000040) != 0) && input.getBytesUntilLimit() > 0) {
                    rqddurs_ = newIntList();
                    mutable_bitField0_ |= 0x00000040;
                  }
                  while (input.getBytesUntilLimit() > 0) {
                    rqddurs_.addInt(input.readInt32());
                  }
                  input.popLimit(limit);
                  break;
                }
                case 218: {
                  com.google.protobuf.ByteString bs = input.readBytes();
                  bitField0_ |= 0x00000010;
                  podid_ = bs;
                  break;
                }
                case 224: {
                  bitField0_ |= 0x00000020;
                  podseq_ = input.readInt32();
                  break;
                }
                case 232: {
                  bitField0_ |= 0x00000080;
                  slotinpod_ = input.readInt32();
                  break;
                }
                case 241: {
                  bitField0_ |= 0x00000100;
                  mincpmpersec_ = input.readDouble();
                  break;
                }
                default: {
                  if (!parseUnknownField(
                      input, unknownFields, extensionRegistry, tag)) {
                    done = true;
                  }
                  break;
                }
              }
            }
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            throw e.setUnfinishedMessage(this);
          } catch (java.io.IOException e) {
            throw new com.google.protobuf.InvalidProtocolBufferException(
                e).setUnfinishedMessage(this);
          } finally {
            if (((mutable_bitField0_ & 0x00000001) != 0)) {
              mimes_ = mimes_.getUnmodifiableView();
            }
            if (((mutable_bitField0_ & 0x00000010) != 0)) {
              protocols_.makeImmutable(); // C
            }
            if (((mutable_bitField0_ & 0x00001000) != 0)) {
              battr_.makeImmutable(); // C
            }
            if (((mutable_bitField0_ & 0x00010000) != 0)) {
              delivery_.makeImmutable(); // C
            }
            if (((mutable_bitField0_ & 0x00020000) != 0)) {
              companionad_ = java.util.Collections.unmodifiableList(companionad_);
            }
            if (((mutable_bitField0_ & 0x00040000) != 0)) {
              api_.makeImmutable(); // C
            }
            if (((mutable_bitField0_ & 0x00080000) != 0)) {
              companiontype_.makeImmutable(); // C
            }
            if (((mutable_bitField0_ & 0x00000040) != 0)) {
              rqddurs_.makeImmutable(); // C
            }
            this.unknownFields = unknownFields.build();
            makeExtensionsImmutable();
          }
        }
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Audio_descriptor;
        }

        @java.lang.Override
        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Audio_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio.Builder.class);
        }

        private int bitField0_;
        public static final int MIMES_FIELD_NUMBER = 1;
        private com.google.protobuf.LazyStringList mimes_;
        /**
         * <pre>
         * Content MIME types supported (e.g., "audio/mp4").
         * REQUIRED by the OpenRTB specification: at least 1 element.
         * </pre>
         *
         * <code>repeated string mimes = 1;</code>
         * @return A list containing the mimes.
         */
        public com.google.protobuf.ProtocolStringList
            getMimesList() {
          return mimes_;
        }
        /**
         * <pre>
         * Content MIME types supported (e.g., "audio/mp4").
         * REQUIRED by the OpenRTB specification: at least 1 element.
         * </pre>
         *
         * <code>repeated string mimes = 1;</code>
         * @return The count of mimes.
         */
        public int getMimesCount() {
          return mimes_.size();
        }
        /**
         * <pre>
         * Content MIME types supported (e.g., "audio/mp4").
         * REQUIRED by the OpenRTB specification: at least 1 element.
         * </pre>
         *
         * <code>repeated string mimes = 1;</code>
         * @param index The index of the element to return.
         * @return The mimes at the given index.
         */
        public java.lang.String getMimes(int index) {
          return mimes_.get(index);
        }
        /**
         * <pre>
         * Content MIME types supported (e.g., "audio/mp4").
         * REQUIRED by the OpenRTB specification: at least 1 element.
         * </pre>
         *
         * <code>repeated string mimes = 1;</code>
         * @param index The index of the value to return.
         * @return The bytes of the mimes at the given index.
         */
        public com.google.protobuf.ByteString
            getMimesBytes(int index) {
          return mimes_.getByteString(index);
        }

        public static final int MINDURATION_FIELD_NUMBER = 2;
        private int minduration_;
        /**
         * <pre>
         * Minimum audio ad duration in seconds.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional int32 minduration = 2;</code>
         * @return Whether the minduration field is set.
         */
        @java.lang.Override
        public boolean hasMinduration() {
          return ((bitField0_ & 0x00000001) != 0);
        }
        /**
         * <pre>
         * Minimum audio ad duration in seconds.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional int32 minduration = 2;</code>
         * @return The minduration.
         */
        @java.lang.Override
        public int getMinduration() {
          return minduration_;
        }

        public static final int MAXDURATION_FIELD_NUMBER = 3;
        private int maxduration_;
        /**
         * <pre>
         * Maximum audio ad duration in seconds.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional int32 maxduration = 3;</code>
         * @return Whether the maxduration field is set.
         */
        @java.lang.Override
        public boolean hasMaxduration() {
          return ((bitField0_ & 0x00000002) != 0);
        }
        /**
         * <pre>
         * Maximum audio ad duration in seconds.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional int32 maxduration = 3;</code>
         * @return The maxduration.
         */
        @java.lang.Override
        public int getMaxduration() {
          return maxduration_;
        }

        public static final int PODDUR_FIELD_NUMBER = 25;
        private int poddur_;
        /**
         * <pre>
         * Indicates the total amount of time in seconds that advertisers may
         * fill for a “dynamic” video ad pod (See Section 7.6 for more details),
         * or the dynamic portion of a “hybrid” ad pod. This field is required
         * only for the dynamic portion(s) of video ad pods. This field refers to
         * the length of the entire ad break, whereas
         * minduration/maxduration/rqddurs are constraints relating to the slots
         * that make up the pod.
         * </pre>
         *
         * <code>optional int32 poddur = 25;</code>
         * @return Whether the poddur field is set.
         */
        @java.lang.Override
        public boolean hasPoddur() {
          return ((bitField0_ & 0x00000004) != 0);
        }
        /**
         * <pre>
         * Indicates the total amount of time in seconds that advertisers may
         * fill for a “dynamic” video ad pod (See Section 7.6 for more details),
         * or the dynamic portion of a “hybrid” ad pod. This field is required
         * only for the dynamic portion(s) of video ad pods. This field refers to
         * the length of the entire ad break, whereas
         * minduration/maxduration/rqddurs are constraints relating to the slots
         * that make up the pod.
         * </pre>
         *
         * <code>optional int32 poddur = 25;</code>
         * @return The poddur.
         */
        @java.lang.Override
        public int getPoddur() {
          return poddur_;
        }

        public static final int PROTOCOLS_FIELD_NUMBER = 4;
        private com.google.protobuf.Internal.IntList protocols_;
        /**
         * <pre>
         * Array of supported audio protocols.
         * Refer to enum com.iabtechlab.adcom.v1.Creative.AudioVideoType for generic values.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>repeated int32 protocols = 4 [packed = true];</code>
         * @return A list containing the protocols.
         */
        @java.lang.Override
        public java.util.List<java.lang.Integer>
            getProtocolsList() {
          return protocols_;
        }
        /**
         * <pre>
         * Array of supported audio protocols.
         * Refer to enum com.iabtechlab.adcom.v1.Creative.AudioVideoType for generic values.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>repeated int32 protocols = 4 [packed = true];</code>
         * @return The count of protocols.
         */
        public int getProtocolsCount() {
          return protocols_.size();
        }
        /**
         * <pre>
         * Array of supported audio protocols.
         * Refer to enum com.iabtechlab.adcom.v1.Creative.AudioVideoType for generic values.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>repeated int32 protocols = 4 [packed = true];</code>
         * @param index The index of the element to return.
         * @return The protocols at the given index.
         */
        public int getProtocols(int index) {
          return protocols_.getInt(index);
        }
        private int protocolsMemoizedSerializedSize = -1;

        public static final int STARTDELAY_FIELD_NUMBER = 5;
        private int startdelay_;
        /**
         * <pre>
         * Indicates the start delay in seconds for pre-roll, mid-roll, or
         * post-roll ad placements.
         * Refer to enum com.iabtechlab.adcom.v1.StartDelayMode for generic values.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional int32 startdelay = 5;</code>
         * @return Whether the startdelay field is set.
         */
        @java.lang.Override
        public boolean hasStartdelay() {
          return ((bitField0_ & 0x00000008) != 0);
        }
        /**
         * <pre>
         * Indicates the start delay in seconds for pre-roll, mid-roll, or
         * post-roll ad placements.
         * Refer to enum com.iabtechlab.adcom.v1.StartDelayMode for generic values.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional int32 startdelay = 5;</code>
         * @return The startdelay.
         */
        @java.lang.Override
        public int getStartdelay() {
          return startdelay_;
        }

        public static final int RQDDURS_FIELD_NUMBER = 26;
        private com.google.protobuf.Internal.IntList rqddurs_;
        /**
         * <pre>
         * Precise acceptable durations for audio creatives in seconds. This
         * field specifically targets the live audio/radio use case where
         * non-exact ad durations would result in undesirable 'dead air'. This
         * field is mutually exclusive with minduraiton and maxduration; if
         * rqddurs is specified, minduraiton and maxduration must not be
         * specified and vice versa.
         * </pre>
         *
         * <code>repeated int32 rqddurs = 26 [packed = true];</code>
         * @return A list containing the rqddurs.
         */
        @java.lang.Override
        public java.util.List<java.lang.Integer>
            getRqddursList() {
          return rqddurs_;
        }
        /**
         * <pre>
         * Precise acceptable durations for audio creatives in seconds. This
         * field specifically targets the live audio/radio use case where
         * non-exact ad durations would result in undesirable 'dead air'. This
         * field is mutually exclusive with minduraiton and maxduration; if
         * rqddurs is specified, minduraiton and maxduration must not be
         * specified and vice versa.
         * </pre>
         *
         * <code>repeated int32 rqddurs = 26 [packed = true];</code>
         * @return The count of rqddurs.
         */
        public int getRqddursCount() {
          return rqddurs_.size();
        }
        /**
         * <pre>
         * Precise acceptable durations for audio creatives in seconds. This
         * field specifically targets the live audio/radio use case where
         * non-exact ad durations would result in undesirable 'dead air'. This
         * field is mutually exclusive with minduraiton and maxduration; if
         * rqddurs is specified, minduraiton and maxduration must not be
         * specified and vice versa.
         * </pre>
         *
         * <code>repeated int32 rqddurs = 26 [packed = true];</code>
         * @param index The index of the element to return.
         * @return The rqddurs at the given index.
         */
        public int getRqddurs(int index) {
          return rqddurs_.getInt(index);
        }
        private int rqddursMemoizedSerializedSize = -1;

        public static final int PODID_FIELD_NUMBER = 27;
        private volatile java.lang.Object podid_;
        /**
         * <pre>
         * Unique identifier indicating that an impression opportunity belongs to
         * an audio ad pod. If multiple impression opportunities within a bid
         * request share the same podid, this indicates that those impression
         * opportunities belong to the same audio ad pod.
         * </pre>
         *
         * <code>optional string podid = 27;</code>
         * @return Whether the podid field is set.
         */
        @java.lang.Override
        public boolean hasPodid() {
          return ((bitField0_ & 0x00000010) != 0);
        }
        /**
         * <pre>
         * Unique identifier indicating that an impression opportunity belongs to
         * an audio ad pod. If multiple impression opportunities within a bid
         * request share the same podid, this indicates that those impression
         * opportunities belong to the same audio ad pod.
         * </pre>
         *
         * <code>optional string podid = 27;</code>
         * @return The podid.
         */
        @java.lang.Override
        public java.lang.String getPodid() {
          java.lang.Object ref = podid_;
          if (ref instanceof java.lang.String) {
            return (java.lang.String) ref;
          } else {
            com.google.protobuf.ByteString bs = 
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              podid_ = s;
            }
            return s;
          }
        }
        /**
         * <pre>
         * Unique identifier indicating that an impression opportunity belongs to
         * an audio ad pod. If multiple impression opportunities within a bid
         * request share the same podid, this indicates that those impression
         * opportunities belong to the same audio ad pod.
         * </pre>
         *
         * <code>optional string podid = 27;</code>
         * @return The bytes for podid.
         */
        @java.lang.Override
        public com.google.protobuf.ByteString
            getPodidBytes() {
          java.lang.Object ref = podid_;
          if (ref instanceof java.lang.String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            podid_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }

        public static final int PODSEQ_FIELD_NUMBER = 28;
        private int podseq_;
        /**
         * <pre>
         * The sequence (position) of the audio ad pod within a content stream.
         * </pre>
         *
         * <code>optional int32 podseq = 28 [default = 0];</code>
         * @return Whether the podseq field is set.
         */
        @java.lang.Override
        public boolean hasPodseq() {
          return ((bitField0_ & 0x00000020) != 0);
        }
        /**
         * <pre>
         * The sequence (position) of the audio ad pod within a content stream.
         * </pre>
         *
         * <code>optional int32 podseq = 28 [default = 0];</code>
         * @return The podseq.
         */
        @java.lang.Override
        public int getPodseq() {
          return podseq_;
        }

        public static final int SEQUENCE_FIELD_NUMBER = 6;
        private int sequence_;
        /**
         * <pre>
         * If multiple ad impressions are offered in the same bid request,
         * the sequence number will allow for the coordinated delivery of
         * multiple creatives.
         * </pre>
         *
         * <code>optional int32 sequence = 6 [default = 1, deprecated = true];</code>
         * @return Whether the sequence field is set.
         */
        @java.lang.Override
        @java.lang.Deprecated public boolean hasSequence() {
          return ((bitField0_ & 0x00000040) != 0);
        }
        /**
         * <pre>
         * If multiple ad impressions are offered in the same bid request,
         * the sequence number will allow for the coordinated delivery of
         * multiple creatives.
         * </pre>
         *
         * <code>optional int32 sequence = 6 [default = 1, deprecated = true];</code>
         * @return The sequence.
         */
        @java.lang.Override
        @java.lang.Deprecated public int getSequence() {
          return sequence_;
        }

        public static final int SLOTINPOD_FIELD_NUMBER = 29;
        private int slotinpod_;
        /**
         * <pre>
         * For audio ad pods, this value indicates that the seller can guarantee
         * delivery against the indicated slot position in the pod.
         * </pre>
         *
         * <code>optional int32 slotinpod = 29 [default = 0];</code>
         * @return Whether the slotinpod field is set.
         */
        @java.lang.Override
        public boolean hasSlotinpod() {
          return ((bitField0_ & 0x00000080) != 0);
        }
        /**
         * <pre>
         * For audio ad pods, this value indicates that the seller can guarantee
         * delivery against the indicated slot position in the pod.
         * </pre>
         *
         * <code>optional int32 slotinpod = 29 [default = 0];</code>
         * @return The slotinpod.
         */
        @java.lang.Override
        public int getSlotinpod() {
          return slotinpod_;
        }

        public static final int MINCPMPERSEC_FIELD_NUMBER = 30;
        private double mincpmpersec_;
        /**
         * <pre>
         * Minimum CPM per second. This is a price floor for the “dynamic”
         * portion of an audio ad pod, relative to the duration of bids an
         * advertiser may submit.
         * </pre>
         *
         * <code>optional double mincpmpersec = 30;</code>
         * @return Whether the mincpmpersec field is set.
         */
        @java.lang.Override
        public boolean hasMincpmpersec() {
          return ((bitField0_ & 0x00000100) != 0);
        }
        /**
         * <pre>
         * Minimum CPM per second. This is a price floor for the “dynamic”
         * portion of an audio ad pod, relative to the duration of bids an
         * advertiser may submit.
         * </pre>
         *
         * <code>optional double mincpmpersec = 30;</code>
         * @return The mincpmpersec.
         */
        @java.lang.Override
        public double getMincpmpersec() {
          return mincpmpersec_;
        }

        public static final int BATTR_FIELD_NUMBER = 7;
        private com.google.protobuf.Internal.IntList battr_;
        /**
         * <pre>
         * Blocked creative attributes.
         * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
         * </pre>
         *
         * <code>repeated int32 battr = 7 [packed = true];</code>
         * @return A list containing the battr.
         */
        @java.lang.Override
        public java.util.List<java.lang.Integer>
            getBattrList() {
          return battr_;
        }
        /**
         * <pre>
         * Blocked creative attributes.
         * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
         * </pre>
         *
         * <code>repeated int32 battr = 7 [packed = true];</code>
         * @return The count of battr.
         */
        public int getBattrCount() {
          return battr_.size();
        }
        /**
         * <pre>
         * Blocked creative attributes.
         * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
         * </pre>
         *
         * <code>repeated int32 battr = 7 [packed = true];</code>
         * @param index The index of the element to return.
         * @return The battr at the given index.
         */
        public int getBattr(int index) {
          return battr_.getInt(index);
        }
        private int battrMemoizedSerializedSize = -1;

        public static final int MAXEXTENDED_FIELD_NUMBER = 8;
        private int maxextended_;
        /**
         * <pre>
         * Maximum extended video ad duration, if extension is allowed.
         * If blank or 0, extension is not allowed. If -1, extension is allowed,
         * and there is no time limit imposed. If greater than 0, then the value
         * represents the number of seconds of extended play supported beyond
         * the maxduration value.
         * </pre>
         *
         * <code>optional int32 maxextended = 8;</code>
         * @return Whether the maxextended field is set.
         */
        @java.lang.Override
        public boolean hasMaxextended() {
          return ((bitField0_ & 0x00000200) != 0);
        }
        /**
         * <pre>
         * Maximum extended video ad duration, if extension is allowed.
         * If blank or 0, extension is not allowed. If -1, extension is allowed,
         * and there is no time limit imposed. If greater than 0, then the value
         * represents the number of seconds of extended play supported beyond
         * the maxduration value.
         * </pre>
         *
         * <code>optional int32 maxextended = 8;</code>
         * @return The maxextended.
         */
        @java.lang.Override
        public int getMaxextended() {
          return maxextended_;
        }

        public static final int MINBITRATE_FIELD_NUMBER = 9;
        private int minbitrate_;
        /**
         * <pre>
         * Minimum bit rate in Kbps.
         * </pre>
         *
         * <code>optional int32 minbitrate = 9;</code>
         * @return Whether the minbitrate field is set.
         */
        @java.lang.Override
        public boolean hasMinbitrate() {
          return ((bitField0_ & 0x00000400) != 0);
        }
        /**
         * <pre>
         * Minimum bit rate in Kbps.
         * </pre>
         *
         * <code>optional int32 minbitrate = 9;</code>
         * @return The minbitrate.
         */
        @java.lang.Override
        public int getMinbitrate() {
          return minbitrate_;
        }

        public static final int MAXBITRATE_FIELD_NUMBER = 10;
        private int maxbitrate_;
        /**
         * <pre>
         * Maximum bit rate in Kbps.
         * </pre>
         *
         * <code>optional int32 maxbitrate = 10;</code>
         * @return Whether the maxbitrate field is set.
         */
        @java.lang.Override
        public boolean hasMaxbitrate() {
          return ((bitField0_ & 0x00000800) != 0);
        }
        /**
         * <pre>
         * Maximum bit rate in Kbps.
         * </pre>
         *
         * <code>optional int32 maxbitrate = 10;</code>
         * @return The maxbitrate.
         */
        @java.lang.Override
        public int getMaxbitrate() {
          return maxbitrate_;
        }

        public static final int DELIVERY_FIELD_NUMBER = 11;
        private com.google.protobuf.Internal.IntList delivery_;
        /**
         * <pre>
         * Supported delivery methods (e.g., streaming, progressive).
         * If none specified, assume all are supported.
         * Refer to enum com.iabtechlab.adcom.v1.enums.DeliveryMethod for generic values.
         * </pre>
         *
         * <code>repeated int32 delivery = 11 [packed = true];</code>
         * @return A list containing the delivery.
         */
        @java.lang.Override
        public java.util.List<java.lang.Integer>
            getDeliveryList() {
          return delivery_;
        }
        /**
         * <pre>
         * Supported delivery methods (e.g., streaming, progressive).
         * If none specified, assume all are supported.
         * Refer to enum com.iabtechlab.adcom.v1.enums.DeliveryMethod for generic values.
         * </pre>
         *
         * <code>repeated int32 delivery = 11 [packed = true];</code>
         * @return The count of delivery.
         */
        public int getDeliveryCount() {
          return delivery_.size();
        }
        /**
         * <pre>
         * Supported delivery methods (e.g., streaming, progressive).
         * If none specified, assume all are supported.
         * Refer to enum com.iabtechlab.adcom.v1.enums.DeliveryMethod for generic values.
         * </pre>
         *
         * <code>repeated int32 delivery = 11 [packed = true];</code>
         * @param index The index of the element to return.
         * @return The delivery at the given index.
         */
        public int getDelivery(int index) {
          return delivery_.getInt(index);
        }
        private int deliveryMemoizedSerializedSize = -1;

        public static final int COMPANIONAD_FIELD_NUMBER = 12;
        private java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner> companionad_;
        /**
         * <pre>
         * Array of Banner objects if companion ads are available.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 12;</code>
         */
        @java.lang.Override
        public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner> getCompanionadList() {
          return companionad_;
        }
        /**
         * <pre>
         * Array of Banner objects if companion ads are available.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 12;</code>
         */
        @java.lang.Override
        public java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.BannerOrBuilder> 
            getCompanionadOrBuilderList() {
          return companionad_;
        }
        /**
         * <pre>
         * Array of Banner objects if companion ads are available.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 12;</code>
         */
        @java.lang.Override
        public int getCompanionadCount() {
          return companionad_.size();
        }
        /**
         * <pre>
         * Array of Banner objects if companion ads are available.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 12;</code>
         */
        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner getCompanionad(int index) {
          return companionad_.get(index);
        }
        /**
         * <pre>
         * Array of Banner objects if companion ads are available.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 12;</code>
         */
        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.BannerOrBuilder getCompanionadOrBuilder(
            int index) {
          return companionad_.get(index);
        }

        public static final int API_FIELD_NUMBER = 13;
        private com.google.protobuf.Internal.IntList api_;
        /**
         * <pre>
         * List of supported API frameworks for this impression.
         * If an API is not explicitly listed, it is assumed not to be supported.
         * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
         * </pre>
         *
         * <code>repeated int32 api = 13 [packed = true];</code>
         * @return A list containing the api.
         */
        @java.lang.Override
        public java.util.List<java.lang.Integer>
            getApiList() {
          return api_;
        }
        /**
         * <pre>
         * List of supported API frameworks for this impression.
         * If an API is not explicitly listed, it is assumed not to be supported.
         * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
         * </pre>
         *
         * <code>repeated int32 api = 13 [packed = true];</code>
         * @return The count of api.
         */
        public int getApiCount() {
          return api_.size();
        }
        /**
         * <pre>
         * List of supported API frameworks for this impression.
         * If an API is not explicitly listed, it is assumed not to be supported.
         * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
         * </pre>
         *
         * <code>repeated int32 api = 13 [packed = true];</code>
         * @param index The index of the element to return.
         * @return The api at the given index.
         */
        public int getApi(int index) {
          return api_.getInt(index);
        }
        private int apiMemoizedSerializedSize = -1;

        public static final int COMPANIONTYPE_FIELD_NUMBER = 20;
        private com.google.protobuf.Internal.IntList companiontype_;
        /**
         * <pre>
         * Supported DAAST companion ad types.  Recommended if companion Banner
         * objects are included via the companionad array.
         * Refer to enum com.iabtechlab.adcom.v1.CompanionType for generic values.
         * </pre>
         *
         * <code>repeated int32 companiontype = 20 [packed = true];</code>
         * @return A list containing the companiontype.
         */
        @java.lang.Override
        public java.util.List<java.lang.Integer>
            getCompaniontypeList() {
          return companiontype_;
        }
        /**
         * <pre>
         * Supported DAAST companion ad types.  Recommended if companion Banner
         * objects are included via the companionad array.
         * Refer to enum com.iabtechlab.adcom.v1.CompanionType for generic values.
         * </pre>
         *
         * <code>repeated int32 companiontype = 20 [packed = true];</code>
         * @return The count of companiontype.
         */
        public int getCompaniontypeCount() {
          return companiontype_.size();
        }
        /**
         * <pre>
         * Supported DAAST companion ad types.  Recommended if companion Banner
         * objects are included via the companionad array.
         * Refer to enum com.iabtechlab.adcom.v1.CompanionType for generic values.
         * </pre>
         *
         * <code>repeated int32 companiontype = 20 [packed = true];</code>
         * @param index The index of the element to return.
         * @return The companiontype at the given index.
         */
        public int getCompaniontype(int index) {
          return companiontype_.getInt(index);
        }
        private int companiontypeMemoizedSerializedSize = -1;

        public static final int MAXSEQ_FIELD_NUMBER = 21;
        private int maxseq_;
        /**
         * <pre>
         * The maximum number of ads that can be played in an ad pod.
         * </pre>
         *
         * <code>optional int32 maxseq = 21;</code>
         * @return Whether the maxseq field is set.
         */
        @java.lang.Override
        public boolean hasMaxseq() {
          return ((bitField0_ & 0x00001000) != 0);
        }
        /**
         * <pre>
         * The maximum number of ads that can be played in an ad pod.
         * </pre>
         *
         * <code>optional int32 maxseq = 21;</code>
         * @return The maxseq.
         */
        @java.lang.Override
        public int getMaxseq() {
          return maxseq_;
        }

        public static final int FEED_FIELD_NUMBER = 22;
        private int feed_;
        /**
         * <pre>
         * Type of audio feed.
         * Refer to enum com.iabtechlab.adcom.v1.enums.FeedType for generic values.
         * </pre>
         *
         * <code>optional int32 feed = 22;</code>
         * @return Whether the feed field is set.
         */
        @java.lang.Override
        public boolean hasFeed() {
          return ((bitField0_ & 0x00002000) != 0);
        }
        /**
         * <pre>
         * Type of audio feed.
         * Refer to enum com.iabtechlab.adcom.v1.enums.FeedType for generic values.
         * </pre>
         *
         * <code>optional int32 feed = 22;</code>
         * @return The feed.
         */
        @java.lang.Override
        public int getFeed() {
          return feed_;
        }

        public static final int STITCHED_FIELD_NUMBER = 23;
        private boolean stitched_;
        /**
         * <pre>
         * Indicates if the ad is stitched with audio content or delivered
         * independently, where 0 = no, 1 = yes.
         * </pre>
         *
         * <code>optional bool stitched = 23;</code>
         * @return Whether the stitched field is set.
         */
        @java.lang.Override
        public boolean hasStitched() {
          return ((bitField0_ & 0x00004000) != 0);
        }
        /**
         * <pre>
         * Indicates if the ad is stitched with audio content or delivered
         * independently, where 0 = no, 1 = yes.
         * </pre>
         *
         * <code>optional bool stitched = 23;</code>
         * @return The stitched.
         */
        @java.lang.Override
        public boolean getStitched() {
          return stitched_;
        }

        public static final int NVOL_FIELD_NUMBER = 24;
        private int nvol_;
        /**
         * <pre>
         * Volume normalization mode.
         * Refer to enum com.iabtechlab.adcom.v1.VolumeNormalizationMode for generic values.
         * </pre>
         *
         * <code>optional int32 nvol = 24;</code>
         * @return Whether the nvol field is set.
         */
        @java.lang.Override
        public boolean hasNvol() {
          return ((bitField0_ & 0x00008000) != 0);
        }
        /**
         * <pre>
         * Volume normalization mode.
         * Refer to enum com.iabtechlab.adcom.v1.VolumeNormalizationMode for generic values.
         * </pre>
         *
         * <code>optional int32 nvol = 24;</code>
         * @return The nvol.
         */
        @java.lang.Override
        public int getNvol() {
          return nvol_;
        }

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

          for (int i = 0; i < getCompanionadCount(); i++) {
            if (!getCompanionad(i).isInitialized()) {
              memoizedIsInitialized = 0;
              return false;
            }
          }
          if (!extensionsAreInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
          memoizedIsInitialized = 1;
          return true;
        }

        @java.lang.Override
        public void writeTo(com.google.protobuf.CodedOutputStream output)
                            throws java.io.IOException {
          getSerializedSize();
          com.google.protobuf.GeneratedMessageV3
            .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio>.ExtensionWriter
              extensionWriter = newExtensionWriter();
          for (int i = 0; i < mimes_.size(); i++) {
            com.google.protobuf.GeneratedMessageV3.writeString(output, 1, mimes_.getRaw(i));
          }
          if (((bitField0_ & 0x00000001) != 0)) {
            output.writeInt32(2, minduration_);
          }
          if (((bitField0_ & 0x00000002) != 0)) {
            output.writeInt32(3, maxduration_);
          }
          if (getProtocolsList().size() > 0) {
            output.writeUInt32NoTag(34);
            output.writeUInt32NoTag(protocolsMemoizedSerializedSize);
          }
          for (int i = 0; i < protocols_.size(); i++) {
            output.writeInt32NoTag(protocols_.getInt(i));
          }
          if (((bitField0_ & 0x00000008) != 0)) {
            output.writeInt32(5, startdelay_);
          }
          if (((bitField0_ & 0x00000040) != 0)) {
            output.writeInt32(6, sequence_);
          }
          if (getBattrList().size() > 0) {
            output.writeUInt32NoTag(58);
            output.writeUInt32NoTag(battrMemoizedSerializedSize);
          }
          for (int i = 0; i < battr_.size(); i++) {
            output.writeInt32NoTag(battr_.getInt(i));
          }
          if (((bitField0_ & 0x00000200) != 0)) {
            output.writeInt32(8, maxextended_);
          }
          if (((bitField0_ & 0x00000400) != 0)) {
            output.writeInt32(9, minbitrate_);
          }
          if (((bitField0_ & 0x00000800) != 0)) {
            output.writeInt32(10, maxbitrate_);
          }
          if (getDeliveryList().size() > 0) {
            output.writeUInt32NoTag(90);
            output.writeUInt32NoTag(deliveryMemoizedSerializedSize);
          }
          for (int i = 0; i < delivery_.size(); i++) {
            output.writeInt32NoTag(delivery_.getInt(i));
          }
          for (int i = 0; i < companionad_.size(); i++) {
            output.writeMessage(12, companionad_.get(i));
          }
          if (getApiList().size() > 0) {
            output.writeUInt32NoTag(106);
            output.writeUInt32NoTag(apiMemoizedSerializedSize);
          }
          for (int i = 0; i < api_.size(); i++) {
            output.writeInt32NoTag(api_.getInt(i));
          }
          if (getCompaniontypeList().size() > 0) {
            output.writeUInt32NoTag(162);
            output.writeUInt32NoTag(companiontypeMemoizedSerializedSize);
          }
          for (int i = 0; i < companiontype_.size(); i++) {
            output.writeInt32NoTag(companiontype_.getInt(i));
          }
          if (((bitField0_ & 0x00001000) != 0)) {
            output.writeInt32(21, maxseq_);
          }
          if (((bitField0_ & 0x00002000) != 0)) {
            output.writeInt32(22, feed_);
          }
          if (((bitField0_ & 0x00004000) != 0)) {
            output.writeBool(23, stitched_);
          }
          if (((bitField0_ & 0x00008000) != 0)) {
            output.writeInt32(24, nvol_);
          }
          if (((bitField0_ & 0x00000004) != 0)) {
            output.writeInt32(25, poddur_);
          }
          if (getRqddursList().size() > 0) {
            output.writeUInt32NoTag(210);
            output.writeUInt32NoTag(rqddursMemoizedSerializedSize);
          }
          for (int i = 0; i < rqddurs_.size(); i++) {
            output.writeInt32NoTag(rqddurs_.getInt(i));
          }
          if (((bitField0_ & 0x00000010) != 0)) {
            com.google.protobuf.GeneratedMessageV3.writeString(output, 27, podid_);
          }
          if (((bitField0_ & 0x00000020) != 0)) {
            output.writeInt32(28, podseq_);
          }
          if (((bitField0_ & 0x00000080) != 0)) {
            output.writeInt32(29, slotinpod_);
          }
          if (((bitField0_ & 0x00000100) != 0)) {
            output.writeDouble(30, mincpmpersec_);
          }
          extensionWriter.writeUntil(10000, output);
          unknownFields.writeTo(output);
        }

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

          size = 0;
          {
            int dataSize = 0;
            for (int i = 0; i < mimes_.size(); i++) {
              dataSize += computeStringSizeNoTag(mimes_.getRaw(i));
            }
            size += dataSize;
            size += 1 * getMimesList().size();
          }
          if (((bitField0_ & 0x00000001) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(2, minduration_);
          }
          if (((bitField0_ & 0x00000002) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(3, maxduration_);
          }
          {
            int dataSize = 0;
            for (int i = 0; i < protocols_.size(); i++) {
              dataSize += com.google.protobuf.CodedOutputStream
                .computeInt32SizeNoTag(protocols_.getInt(i));
            }
            size += dataSize;
            if (!getProtocolsList().isEmpty()) {
              size += 1;
              size += com.google.protobuf.CodedOutputStream
                  .computeInt32SizeNoTag(dataSize);
            }
            protocolsMemoizedSerializedSize = dataSize;
          }
          if (((bitField0_ & 0x00000008) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(5, startdelay_);
          }
          if (((bitField0_ & 0x00000040) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(6, sequence_);
          }
          {
            int dataSize = 0;
            for (int i = 0; i < battr_.size(); i++) {
              dataSize += com.google.protobuf.CodedOutputStream
                .computeInt32SizeNoTag(battr_.getInt(i));
            }
            size += dataSize;
            if (!getBattrList().isEmpty()) {
              size += 1;
              size += com.google.protobuf.CodedOutputStream
                  .computeInt32SizeNoTag(dataSize);
            }
            battrMemoizedSerializedSize = dataSize;
          }
          if (((bitField0_ & 0x00000200) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(8, maxextended_);
          }
          if (((bitField0_ & 0x00000400) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(9, minbitrate_);
          }
          if (((bitField0_ & 0x00000800) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(10, maxbitrate_);
          }
          {
            int dataSize = 0;
            for (int i = 0; i < delivery_.size(); i++) {
              dataSize += com.google.protobuf.CodedOutputStream
                .computeInt32SizeNoTag(delivery_.getInt(i));
            }
            size += dataSize;
            if (!getDeliveryList().isEmpty()) {
              size += 1;
              size += com.google.protobuf.CodedOutputStream
                  .computeInt32SizeNoTag(dataSize);
            }
            deliveryMemoizedSerializedSize = dataSize;
          }
          for (int i = 0; i < companionad_.size(); i++) {
            size += com.google.protobuf.CodedOutputStream
              .computeMessageSize(12, companionad_.get(i));
          }
          {
            int dataSize = 0;
            for (int i = 0; i < api_.size(); i++) {
              dataSize += com.google.protobuf.CodedOutputStream
                .computeInt32SizeNoTag(api_.getInt(i));
            }
            size += dataSize;
            if (!getApiList().isEmpty()) {
              size += 1;
              size += com.google.protobuf.CodedOutputStream
                  .computeInt32SizeNoTag(dataSize);
            }
            apiMemoizedSerializedSize = dataSize;
          }
          {
            int dataSize = 0;
            for (int i = 0; i < companiontype_.size(); i++) {
              dataSize += com.google.protobuf.CodedOutputStream
                .computeInt32SizeNoTag(companiontype_.getInt(i));
            }
            size += dataSize;
            if (!getCompaniontypeList().isEmpty()) {
              size += 2;
              size += com.google.protobuf.CodedOutputStream
                  .computeInt32SizeNoTag(dataSize);
            }
            companiontypeMemoizedSerializedSize = dataSize;
          }
          if (((bitField0_ & 0x00001000) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(21, maxseq_);
          }
          if (((bitField0_ & 0x00002000) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(22, feed_);
          }
          if (((bitField0_ & 0x00004000) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeBoolSize(23, stitched_);
          }
          if (((bitField0_ & 0x00008000) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(24, nvol_);
          }
          if (((bitField0_ & 0x00000004) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(25, poddur_);
          }
          {
            int dataSize = 0;
            for (int i = 0; i < rqddurs_.size(); i++) {
              dataSize += com.google.protobuf.CodedOutputStream
                .computeInt32SizeNoTag(rqddurs_.getInt(i));
            }
            size += dataSize;
            if (!getRqddursList().isEmpty()) {
              size += 2;
              size += com.google.protobuf.CodedOutputStream
                  .computeInt32SizeNoTag(dataSize);
            }
            rqddursMemoizedSerializedSize = dataSize;
          }
          if (((bitField0_ & 0x00000010) != 0)) {
            size += com.google.protobuf.GeneratedMessageV3.computeStringSize(27, podid_);
          }
          if (((bitField0_ & 0x00000020) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(28, podseq_);
          }
          if (((bitField0_ & 0x00000080) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(29, slotinpod_);
          }
          if (((bitField0_ & 0x00000100) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeDoubleSize(30, mincpmpersec_);
          }
          size += extensionsSerializedSize();
          size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio)) {
            return super.equals(obj);
          }
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio other = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio) obj;

          if (!getMimesList()
              .equals(other.getMimesList())) return false;
          if (hasMinduration() != other.hasMinduration()) return false;
          if (hasMinduration()) {
            if (getMinduration()
                != other.getMinduration()) return false;
          }
          if (hasMaxduration() != other.hasMaxduration()) return false;
          if (hasMaxduration()) {
            if (getMaxduration()
                != other.getMaxduration()) return false;
          }
          if (hasPoddur() != other.hasPoddur()) return false;
          if (hasPoddur()) {
            if (getPoddur()
                != other.getPoddur()) return false;
          }
          if (!getProtocolsList()
              .equals(other.getProtocolsList())) return false;
          if (hasStartdelay() != other.hasStartdelay()) return false;
          if (hasStartdelay()) {
            if (getStartdelay()
                != other.getStartdelay()) return false;
          }
          if (!getRqddursList()
              .equals(other.getRqddursList())) return false;
          if (hasPodid() != other.hasPodid()) return false;
          if (hasPodid()) {
            if (!getPodid()
                .equals(other.getPodid())) return false;
          }
          if (hasPodseq() != other.hasPodseq()) return false;
          if (hasPodseq()) {
            if (getPodseq()
                != other.getPodseq()) return false;
          }
          if (hasSequence() != other.hasSequence()) return false;
          if (hasSequence()) {
            if (getSequence()
                != other.getSequence()) return false;
          }
          if (hasSlotinpod() != other.hasSlotinpod()) return false;
          if (hasSlotinpod()) {
            if (getSlotinpod()
                != other.getSlotinpod()) return false;
          }
          if (hasMincpmpersec() != other.hasMincpmpersec()) return false;
          if (hasMincpmpersec()) {
            if (java.lang.Double.doubleToLongBits(getMincpmpersec())
                != java.lang.Double.doubleToLongBits(
                    other.getMincpmpersec())) return false;
          }
          if (!getBattrList()
              .equals(other.getBattrList())) return false;
          if (hasMaxextended() != other.hasMaxextended()) return false;
          if (hasMaxextended()) {
            if (getMaxextended()
                != other.getMaxextended()) return false;
          }
          if (hasMinbitrate() != other.hasMinbitrate()) return false;
          if (hasMinbitrate()) {
            if (getMinbitrate()
                != other.getMinbitrate()) return false;
          }
          if (hasMaxbitrate() != other.hasMaxbitrate()) return false;
          if (hasMaxbitrate()) {
            if (getMaxbitrate()
                != other.getMaxbitrate()) return false;
          }
          if (!getDeliveryList()
              .equals(other.getDeliveryList())) return false;
          if (!getCompanionadList()
              .equals(other.getCompanionadList())) return false;
          if (!getApiList()
              .equals(other.getApiList())) return false;
          if (!getCompaniontypeList()
              .equals(other.getCompaniontypeList())) return false;
          if (hasMaxseq() != other.hasMaxseq()) return false;
          if (hasMaxseq()) {
            if (getMaxseq()
                != other.getMaxseq()) return false;
          }
          if (hasFeed() != other.hasFeed()) return false;
          if (hasFeed()) {
            if (getFeed()
                != other.getFeed()) return false;
          }
          if (hasStitched() != other.hasStitched()) return false;
          if (hasStitched()) {
            if (getStitched()
                != other.getStitched()) return false;
          }
          if (hasNvol() != other.hasNvol()) return false;
          if (hasNvol()) {
            if (getNvol()
                != other.getNvol()) return false;
          }
          if (!unknownFields.equals(other.unknownFields)) return false;
          if (!getExtensionFields().equals(other.getExtensionFields()))
            return false;
          return true;
        }

        @java.lang.Override
        public int hashCode() {
          if (memoizedHashCode != 0) {
            return memoizedHashCode;
          }
          int hash = 41;
          hash = (19 * hash) + getDescriptor().hashCode();
          if (getMimesCount() > 0) {
            hash = (37 * hash) + MIMES_FIELD_NUMBER;
            hash = (53 * hash) + getMimesList().hashCode();
          }
          if (hasMinduration()) {
            hash = (37 * hash) + MINDURATION_FIELD_NUMBER;
            hash = (53 * hash) + getMinduration();
          }
          if (hasMaxduration()) {
            hash = (37 * hash) + MAXDURATION_FIELD_NUMBER;
            hash = (53 * hash) + getMaxduration();
          }
          if (hasPoddur()) {
            hash = (37 * hash) + PODDUR_FIELD_NUMBER;
            hash = (53 * hash) + getPoddur();
          }
          if (getProtocolsCount() > 0) {
            hash = (37 * hash) + PROTOCOLS_FIELD_NUMBER;
            hash = (53 * hash) + getProtocolsList().hashCode();
          }
          if (hasStartdelay()) {
            hash = (37 * hash) + STARTDELAY_FIELD_NUMBER;
            hash = (53 * hash) + getStartdelay();
          }
          if (getRqddursCount() > 0) {
            hash = (37 * hash) + RQDDURS_FIELD_NUMBER;
            hash = (53 * hash) + getRqddursList().hashCode();
          }
          if (hasPodid()) {
            hash = (37 * hash) + PODID_FIELD_NUMBER;
            hash = (53 * hash) + getPodid().hashCode();
          }
          if (hasPodseq()) {
            hash = (37 * hash) + PODSEQ_FIELD_NUMBER;
            hash = (53 * hash) + getPodseq();
          }
          if (hasSequence()) {
            hash = (37 * hash) + SEQUENCE_FIELD_NUMBER;
            hash = (53 * hash) + getSequence();
          }
          if (hasSlotinpod()) {
            hash = (37 * hash) + SLOTINPOD_FIELD_NUMBER;
            hash = (53 * hash) + getSlotinpod();
          }
          if (hasMincpmpersec()) {
            hash = (37 * hash) + MINCPMPERSEC_FIELD_NUMBER;
            hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
                java.lang.Double.doubleToLongBits(getMincpmpersec()));
          }
          if (getBattrCount() > 0) {
            hash = (37 * hash) + BATTR_FIELD_NUMBER;
            hash = (53 * hash) + getBattrList().hashCode();
          }
          if (hasMaxextended()) {
            hash = (37 * hash) + MAXEXTENDED_FIELD_NUMBER;
            hash = (53 * hash) + getMaxextended();
          }
          if (hasMinbitrate()) {
            hash = (37 * hash) + MINBITRATE_FIELD_NUMBER;
            hash = (53 * hash) + getMinbitrate();
          }
          if (hasMaxbitrate()) {
            hash = (37 * hash) + MAXBITRATE_FIELD_NUMBER;
            hash = (53 * hash) + getMaxbitrate();
          }
          if (getDeliveryCount() > 0) {
            hash = (37 * hash) + DELIVERY_FIELD_NUMBER;
            hash = (53 * hash) + getDeliveryList().hashCode();
          }
          if (getCompanionadCount() > 0) {
            hash = (37 * hash) + COMPANIONAD_FIELD_NUMBER;
            hash = (53 * hash) + getCompanionadList().hashCode();
          }
          if (getApiCount() > 0) {
            hash = (37 * hash) + API_FIELD_NUMBER;
            hash = (53 * hash) + getApiList().hashCode();
          }
          if (getCompaniontypeCount() > 0) {
            hash = (37 * hash) + COMPANIONTYPE_FIELD_NUMBER;
            hash = (53 * hash) + getCompaniontypeList().hashCode();
          }
          if (hasMaxseq()) {
            hash = (37 * hash) + MAXSEQ_FIELD_NUMBER;
            hash = (53 * hash) + getMaxseq();
          }
          if (hasFeed()) {
            hash = (37 * hash) + FEED_FIELD_NUMBER;
            hash = (53 * hash) + getFeed();
          }
          if (hasStitched()) {
            hash = (37 * hash) + STITCHED_FIELD_NUMBER;
            hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
                getStitched());
          }
          if (hasNvol()) {
            hash = (37 * hash) + NVOL_FIELD_NUMBER;
            hash = (53 * hash) + getNvol();
          }
          hash = hashFields(hash, getExtensionFields());
          hash = (29 * hash) + unknownFields.hashCode();
          memoizedHashCode = hash;
          return hash;
        }

        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio parseFrom(
            java.nio.ByteBuffer data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio parseFrom(
            java.nio.ByteBuffer data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio parseFrom(
            com.google.protobuf.ByteString data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio parseFrom(
            com.google.protobuf.ByteString data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio parseFrom(byte[] data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio parseFrom(
            byte[] data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio parseFrom(java.io.InputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio parseDelimitedFrom(java.io.InputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseDelimitedWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio parseFrom(
            com.google.protobuf.CodedInputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio 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>
         * This object represents an audio type impression. Many of the fields
         * are non-essential for minimally viable transactions, but are included
         * to offer fine control when needed. Audio in OpenRTB generally assumes
         * compliance with the DAAST standard. As such, the notion of companion
         * ads is supported by optionally including an array of Banner objects
         * that define these companion ads.
         * The presence of a Audio as a subordinate of the Imp object indicates
         * that this impression is offered as an audio type impression.
         * At the publisher's discretion, that same impression may also be offered
         * as banner, video, and/or native by also including as Imp subordinates
         * objects of those types. However, any given bid for the impression must
         * conform to one of the offered types.
         * </pre>
         *
         * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Imp.Audio}
         */
        public static final class Builder extends
            com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio, Builder> implements
            // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.BidRequest.Imp.Audio)
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.AudioOrBuilder {
          public static final com.google.protobuf.Descriptors.Descriptor
              getDescriptor() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Audio_descriptor;
          }

          @java.lang.Override
          protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
              internalGetFieldAccessorTable() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Audio_fieldAccessorTable
                .ensureFieldAccessorsInitialized(
                    com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio.Builder.class);
          }

          // Construct using com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio.newBuilder()
          private Builder() {
            maybeForceBuilderInitialization();
          }

          private Builder(
              com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
            super(parent);
            maybeForceBuilderInitialization();
          }
          private void maybeForceBuilderInitialization() {
            if (com.google.protobuf.GeneratedMessageV3
                    .alwaysUseFieldBuilders) {
              getCompanionadFieldBuilder();
            }
          }
          @java.lang.Override
          public Builder clear() {
            super.clear();
            mimes_ = com.google.protobuf.LazyStringArrayList.EMPTY;
            bitField0_ = (bitField0_ & ~0x00000001);
            minduration_ = 0;
            bitField0_ = (bitField0_ & ~0x00000002);
            maxduration_ = 0;
            bitField0_ = (bitField0_ & ~0x00000004);
            poddur_ = 0;
            bitField0_ = (bitField0_ & ~0x00000008);
            protocols_ = emptyIntList();
            bitField0_ = (bitField0_ & ~0x00000010);
            startdelay_ = 0;
            bitField0_ = (bitField0_ & ~0x00000020);
            rqddurs_ = emptyIntList();
            bitField0_ = (bitField0_ & ~0x00000040);
            podid_ = "";
            bitField0_ = (bitField0_ & ~0x00000080);
            podseq_ = 0;
            bitField0_ = (bitField0_ & ~0x00000100);
            sequence_ = 1;
            bitField0_ = (bitField0_ & ~0x00000200);
            slotinpod_ = 0;
            bitField0_ = (bitField0_ & ~0x00000400);
            mincpmpersec_ = 0D;
            bitField0_ = (bitField0_ & ~0x00000800);
            battr_ = emptyIntList();
            bitField0_ = (bitField0_ & ~0x00001000);
            maxextended_ = 0;
            bitField0_ = (bitField0_ & ~0x00002000);
            minbitrate_ = 0;
            bitField0_ = (bitField0_ & ~0x00004000);
            maxbitrate_ = 0;
            bitField0_ = (bitField0_ & ~0x00008000);
            delivery_ = emptyIntList();
            bitField0_ = (bitField0_ & ~0x00010000);
            if (companionadBuilder_ == null) {
              companionad_ = java.util.Collections.emptyList();
              bitField0_ = (bitField0_ & ~0x00020000);
            } else {
              companionadBuilder_.clear();
            }
            api_ = emptyIntList();
            bitField0_ = (bitField0_ & ~0x00040000);
            companiontype_ = emptyIntList();
            bitField0_ = (bitField0_ & ~0x00080000);
            maxseq_ = 0;
            bitField0_ = (bitField0_ & ~0x00100000);
            feed_ = 0;
            bitField0_ = (bitField0_ & ~0x00200000);
            stitched_ = false;
            bitField0_ = (bitField0_ & ~0x00400000);
            nvol_ = 0;
            bitField0_ = (bitField0_ & ~0x00800000);
            return this;
          }

          @java.lang.Override
          public com.google.protobuf.Descriptors.Descriptor
              getDescriptorForType() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Audio_descriptor;
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio getDefaultInstanceForType() {
            return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio.getDefaultInstance();
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio build() {
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio result = buildPartial();
            if (!result.isInitialized()) {
              throw newUninitializedMessageException(result);
            }
            return result;
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio buildPartial() {
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio result = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio(this);
            int from_bitField0_ = bitField0_;
            int to_bitField0_ = 0;
            if (((bitField0_ & 0x00000001) != 0)) {
              mimes_ = mimes_.getUnmodifiableView();
              bitField0_ = (bitField0_ & ~0x00000001);
            }
            result.mimes_ = mimes_;
            if (((from_bitField0_ & 0x00000002) != 0)) {
              result.minduration_ = minduration_;
              to_bitField0_ |= 0x00000001;
            }
            if (((from_bitField0_ & 0x00000004) != 0)) {
              result.maxduration_ = maxduration_;
              to_bitField0_ |= 0x00000002;
            }
            if (((from_bitField0_ & 0x00000008) != 0)) {
              result.poddur_ = poddur_;
              to_bitField0_ |= 0x00000004;
            }
            if (((bitField0_ & 0x00000010) != 0)) {
              protocols_.makeImmutable();
              bitField0_ = (bitField0_ & ~0x00000010);
            }
            result.protocols_ = protocols_;
            if (((from_bitField0_ & 0x00000020) != 0)) {
              result.startdelay_ = startdelay_;
              to_bitField0_ |= 0x00000008;
            }
            if (((bitField0_ & 0x00000040) != 0)) {
              rqddurs_.makeImmutable();
              bitField0_ = (bitField0_ & ~0x00000040);
            }
            result.rqddurs_ = rqddurs_;
            if (((from_bitField0_ & 0x00000080) != 0)) {
              to_bitField0_ |= 0x00000010;
            }
            result.podid_ = podid_;
            if (((from_bitField0_ & 0x00000100) != 0)) {
              result.podseq_ = podseq_;
              to_bitField0_ |= 0x00000020;
            }
            if (((from_bitField0_ & 0x00000200) != 0)) {
              to_bitField0_ |= 0x00000040;
            }
            result.sequence_ = sequence_;
            if (((from_bitField0_ & 0x00000400) != 0)) {
              result.slotinpod_ = slotinpod_;
              to_bitField0_ |= 0x00000080;
            }
            if (((from_bitField0_ & 0x00000800) != 0)) {
              result.mincpmpersec_ = mincpmpersec_;
              to_bitField0_ |= 0x00000100;
            }
            if (((bitField0_ & 0x00001000) != 0)) {
              battr_.makeImmutable();
              bitField0_ = (bitField0_ & ~0x00001000);
            }
            result.battr_ = battr_;
            if (((from_bitField0_ & 0x00002000) != 0)) {
              result.maxextended_ = maxextended_;
              to_bitField0_ |= 0x00000200;
            }
            if (((from_bitField0_ & 0x00004000) != 0)) {
              result.minbitrate_ = minbitrate_;
              to_bitField0_ |= 0x00000400;
            }
            if (((from_bitField0_ & 0x00008000) != 0)) {
              result.maxbitrate_ = maxbitrate_;
              to_bitField0_ |= 0x00000800;
            }
            if (((bitField0_ & 0x00010000) != 0)) {
              delivery_.makeImmutable();
              bitField0_ = (bitField0_ & ~0x00010000);
            }
            result.delivery_ = delivery_;
            if (companionadBuilder_ == null) {
              if (((bitField0_ & 0x00020000) != 0)) {
                companionad_ = java.util.Collections.unmodifiableList(companionad_);
                bitField0_ = (bitField0_ & ~0x00020000);
              }
              result.companionad_ = companionad_;
            } else {
              result.companionad_ = companionadBuilder_.build();
            }
            if (((bitField0_ & 0x00040000) != 0)) {
              api_.makeImmutable();
              bitField0_ = (bitField0_ & ~0x00040000);
            }
            result.api_ = api_;
            if (((bitField0_ & 0x00080000) != 0)) {
              companiontype_.makeImmutable();
              bitField0_ = (bitField0_ & ~0x00080000);
            }
            result.companiontype_ = companiontype_;
            if (((from_bitField0_ & 0x00100000) != 0)) {
              result.maxseq_ = maxseq_;
              to_bitField0_ |= 0x00001000;
            }
            if (((from_bitField0_ & 0x00200000) != 0)) {
              result.feed_ = feed_;
              to_bitField0_ |= 0x00002000;
            }
            if (((from_bitField0_ & 0x00400000) != 0)) {
              result.stitched_ = stitched_;
              to_bitField0_ |= 0x00004000;
            }
            if (((from_bitField0_ & 0x00800000) != 0)) {
              result.nvol_ = nvol_;
              to_bitField0_ |= 0x00008000;
            }
            result.bitField0_ = to_bitField0_;
            onBuilt();
            return result;
          }

          @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 <Type> Builder setExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio, Type> extension,
              Type value) {
            return super.setExtension(extension, value);
          }
          @java.lang.Override
          public <Type> Builder setExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio, java.util.List<Type>> extension,
              int index, Type value) {
            return super.setExtension(extension, index, value);
          }
          @java.lang.Override
          public <Type> Builder addExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio, java.util.List<Type>> extension,
              Type value) {
            return super.addExtension(extension, value);
          }
          @java.lang.Override
          public <Type> Builder clearExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio, ?> extension) {
            return super.clearExtension(extension);
          }
          @java.lang.Override
          public Builder mergeFrom(com.google.protobuf.Message other) {
            if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio) {
              return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio)other);
            } else {
              super.mergeFrom(other);
              return this;
            }
          }

          public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio other) {
            if (other == com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio.getDefaultInstance()) return this;
            if (!other.mimes_.isEmpty()) {
              if (mimes_.isEmpty()) {
                mimes_ = other.mimes_;
                bitField0_ = (bitField0_ & ~0x00000001);
              } else {
                ensureMimesIsMutable();
                mimes_.addAll(other.mimes_);
              }
              onChanged();
            }
            if (other.hasMinduration()) {
              setMinduration(other.getMinduration());
            }
            if (other.hasMaxduration()) {
              setMaxduration(other.getMaxduration());
            }
            if (other.hasPoddur()) {
              setPoddur(other.getPoddur());
            }
            if (!other.protocols_.isEmpty()) {
              if (protocols_.isEmpty()) {
                protocols_ = other.protocols_;
                bitField0_ = (bitField0_ & ~0x00000010);
              } else {
                ensureProtocolsIsMutable();
                protocols_.addAll(other.protocols_);
              }
              onChanged();
            }
            if (other.hasStartdelay()) {
              setStartdelay(other.getStartdelay());
            }
            if (!other.rqddurs_.isEmpty()) {
              if (rqddurs_.isEmpty()) {
                rqddurs_ = other.rqddurs_;
                bitField0_ = (bitField0_ & ~0x00000040);
              } else {
                ensureRqddursIsMutable();
                rqddurs_.addAll(other.rqddurs_);
              }
              onChanged();
            }
            if (other.hasPodid()) {
              bitField0_ |= 0x00000080;
              podid_ = other.podid_;
              onChanged();
            }
            if (other.hasPodseq()) {
              setPodseq(other.getPodseq());
            }
            if (other.hasSequence()) {
              setSequence(other.getSequence());
            }
            if (other.hasSlotinpod()) {
              setSlotinpod(other.getSlotinpod());
            }
            if (other.hasMincpmpersec()) {
              setMincpmpersec(other.getMincpmpersec());
            }
            if (!other.battr_.isEmpty()) {
              if (battr_.isEmpty()) {
                battr_ = other.battr_;
                bitField0_ = (bitField0_ & ~0x00001000);
              } else {
                ensureBattrIsMutable();
                battr_.addAll(other.battr_);
              }
              onChanged();
            }
            if (other.hasMaxextended()) {
              setMaxextended(other.getMaxextended());
            }
            if (other.hasMinbitrate()) {
              setMinbitrate(other.getMinbitrate());
            }
            if (other.hasMaxbitrate()) {
              setMaxbitrate(other.getMaxbitrate());
            }
            if (!other.delivery_.isEmpty()) {
              if (delivery_.isEmpty()) {
                delivery_ = other.delivery_;
                bitField0_ = (bitField0_ & ~0x00010000);
              } else {
                ensureDeliveryIsMutable();
                delivery_.addAll(other.delivery_);
              }
              onChanged();
            }
            if (companionadBuilder_ == null) {
              if (!other.companionad_.isEmpty()) {
                if (companionad_.isEmpty()) {
                  companionad_ = other.companionad_;
                  bitField0_ = (bitField0_ & ~0x00020000);
                } else {
                  ensureCompanionadIsMutable();
                  companionad_.addAll(other.companionad_);
                }
                onChanged();
              }
            } else {
              if (!other.companionad_.isEmpty()) {
                if (companionadBuilder_.isEmpty()) {
                  companionadBuilder_.dispose();
                  companionadBuilder_ = null;
                  companionad_ = other.companionad_;
                  bitField0_ = (bitField0_ & ~0x00020000);
                  companionadBuilder_ = 
                    com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
                       getCompanionadFieldBuilder() : null;
                } else {
                  companionadBuilder_.addAllMessages(other.companionad_);
                }
              }
            }
            if (!other.api_.isEmpty()) {
              if (api_.isEmpty()) {
                api_ = other.api_;
                bitField0_ = (bitField0_ & ~0x00040000);
              } else {
                ensureApiIsMutable();
                api_.addAll(other.api_);
              }
              onChanged();
            }
            if (!other.companiontype_.isEmpty()) {
              if (companiontype_.isEmpty()) {
                companiontype_ = other.companiontype_;
                bitField0_ = (bitField0_ & ~0x00080000);
              } else {
                ensureCompaniontypeIsMutable();
                companiontype_.addAll(other.companiontype_);
              }
              onChanged();
            }
            if (other.hasMaxseq()) {
              setMaxseq(other.getMaxseq());
            }
            if (other.hasFeed()) {
              setFeed(other.getFeed());
            }
            if (other.hasStitched()) {
              setStitched(other.getStitched());
            }
            if (other.hasNvol()) {
              setNvol(other.getNvol());
            }
            this.mergeExtensionFields(other);
            this.mergeUnknownFields(other.unknownFields);
            onChanged();
            return this;
          }

          @java.lang.Override
          public final boolean isInitialized() {
            for (int i = 0; i < getCompanionadCount(); i++) {
              if (!getCompanionad(i).isInitialized()) {
                return false;
              }
            }
            if (!extensionsAreInitialized()) {
              return false;
            }
            return true;
          }

          @java.lang.Override
          public Builder mergeFrom(
              com.google.protobuf.CodedInputStream input,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio parsedMessage = null;
            try {
              parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
              parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio) e.getUnfinishedMessage();
              throw e.unwrapIOException();
            } finally {
              if (parsedMessage != null) {
                mergeFrom(parsedMessage);
              }
            }
            return this;
          }
          private int bitField0_;

          private com.google.protobuf.LazyStringList mimes_ = com.google.protobuf.LazyStringArrayList.EMPTY;
          private void ensureMimesIsMutable() {
            if (!((bitField0_ & 0x00000001) != 0)) {
              mimes_ = new com.google.protobuf.LazyStringArrayList(mimes_);
              bitField0_ |= 0x00000001;
             }
          }
          /**
           * <pre>
           * Content MIME types supported (e.g., "audio/mp4").
           * REQUIRED by the OpenRTB specification: at least 1 element.
           * </pre>
           *
           * <code>repeated string mimes = 1;</code>
           * @return A list containing the mimes.
           */
          public com.google.protobuf.ProtocolStringList
              getMimesList() {
            return mimes_.getUnmodifiableView();
          }
          /**
           * <pre>
           * Content MIME types supported (e.g., "audio/mp4").
           * REQUIRED by the OpenRTB specification: at least 1 element.
           * </pre>
           *
           * <code>repeated string mimes = 1;</code>
           * @return The count of mimes.
           */
          public int getMimesCount() {
            return mimes_.size();
          }
          /**
           * <pre>
           * Content MIME types supported (e.g., "audio/mp4").
           * REQUIRED by the OpenRTB specification: at least 1 element.
           * </pre>
           *
           * <code>repeated string mimes = 1;</code>
           * @param index The index of the element to return.
           * @return The mimes at the given index.
           */
          public java.lang.String getMimes(int index) {
            return mimes_.get(index);
          }
          /**
           * <pre>
           * Content MIME types supported (e.g., "audio/mp4").
           * REQUIRED by the OpenRTB specification: at least 1 element.
           * </pre>
           *
           * <code>repeated string mimes = 1;</code>
           * @param index The index of the value to return.
           * @return The bytes of the mimes at the given index.
           */
          public com.google.protobuf.ByteString
              getMimesBytes(int index) {
            return mimes_.getByteString(index);
          }
          /**
           * <pre>
           * Content MIME types supported (e.g., "audio/mp4").
           * REQUIRED by the OpenRTB specification: at least 1 element.
           * </pre>
           *
           * <code>repeated string mimes = 1;</code>
           * @param index The index to set the value at.
           * @param value The mimes to set.
           * @return This builder for chaining.
           */
          public Builder setMimes(
              int index, java.lang.String value) {
            if (value == null) {
    throw new NullPointerException();
  }
  ensureMimesIsMutable();
            mimes_.set(index, value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Content MIME types supported (e.g., "audio/mp4").
           * REQUIRED by the OpenRTB specification: at least 1 element.
           * </pre>
           *
           * <code>repeated string mimes = 1;</code>
           * @param value The mimes to add.
           * @return This builder for chaining.
           */
          public Builder addMimes(
              java.lang.String value) {
            if (value == null) {
    throw new NullPointerException();
  }
  ensureMimesIsMutable();
            mimes_.add(value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Content MIME types supported (e.g., "audio/mp4").
           * REQUIRED by the OpenRTB specification: at least 1 element.
           * </pre>
           *
           * <code>repeated string mimes = 1;</code>
           * @param values The mimes to add.
           * @return This builder for chaining.
           */
          public Builder addAllMimes(
              java.lang.Iterable<java.lang.String> values) {
            ensureMimesIsMutable();
            com.google.protobuf.AbstractMessageLite.Builder.addAll(
                values, mimes_);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Content MIME types supported (e.g., "audio/mp4").
           * REQUIRED by the OpenRTB specification: at least 1 element.
           * </pre>
           *
           * <code>repeated string mimes = 1;</code>
           * @return This builder for chaining.
           */
          public Builder clearMimes() {
            mimes_ = com.google.protobuf.LazyStringArrayList.EMPTY;
            bitField0_ = (bitField0_ & ~0x00000001);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Content MIME types supported (e.g., "audio/mp4").
           * REQUIRED by the OpenRTB specification: at least 1 element.
           * </pre>
           *
           * <code>repeated string mimes = 1;</code>
           * @param value The bytes of the mimes to add.
           * @return This builder for chaining.
           */
          public Builder addMimesBytes(
              com.google.protobuf.ByteString value) {
            if (value == null) {
    throw new NullPointerException();
  }
  ensureMimesIsMutable();
            mimes_.add(value);
            onChanged();
            return this;
          }

          private int minduration_ ;
          /**
           * <pre>
           * Minimum audio ad duration in seconds.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional int32 minduration = 2;</code>
           * @return Whether the minduration field is set.
           */
          @java.lang.Override
          public boolean hasMinduration() {
            return ((bitField0_ & 0x00000002) != 0);
          }
          /**
           * <pre>
           * Minimum audio ad duration in seconds.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional int32 minduration = 2;</code>
           * @return The minduration.
           */
          @java.lang.Override
          public int getMinduration() {
            return minduration_;
          }
          /**
           * <pre>
           * Minimum audio ad duration in seconds.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional int32 minduration = 2;</code>
           * @param value The minduration to set.
           * @return This builder for chaining.
           */
          public Builder setMinduration(int value) {
            bitField0_ |= 0x00000002;
            minduration_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Minimum audio ad duration in seconds.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional int32 minduration = 2;</code>
           * @return This builder for chaining.
           */
          public Builder clearMinduration() {
            bitField0_ = (bitField0_ & ~0x00000002);
            minduration_ = 0;
            onChanged();
            return this;
          }

          private int maxduration_ ;
          /**
           * <pre>
           * Maximum audio ad duration in seconds.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional int32 maxduration = 3;</code>
           * @return Whether the maxduration field is set.
           */
          @java.lang.Override
          public boolean hasMaxduration() {
            return ((bitField0_ & 0x00000004) != 0);
          }
          /**
           * <pre>
           * Maximum audio ad duration in seconds.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional int32 maxduration = 3;</code>
           * @return The maxduration.
           */
          @java.lang.Override
          public int getMaxduration() {
            return maxduration_;
          }
          /**
           * <pre>
           * Maximum audio ad duration in seconds.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional int32 maxduration = 3;</code>
           * @param value The maxduration to set.
           * @return This builder for chaining.
           */
          public Builder setMaxduration(int value) {
            bitField0_ |= 0x00000004;
            maxduration_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Maximum audio ad duration in seconds.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional int32 maxduration = 3;</code>
           * @return This builder for chaining.
           */
          public Builder clearMaxduration() {
            bitField0_ = (bitField0_ & ~0x00000004);
            maxduration_ = 0;
            onChanged();
            return this;
          }

          private int poddur_ ;
          /**
           * <pre>
           * Indicates the total amount of time in seconds that advertisers may
           * fill for a “dynamic” video ad pod (See Section 7.6 for more details),
           * or the dynamic portion of a “hybrid” ad pod. This field is required
           * only for the dynamic portion(s) of video ad pods. This field refers to
           * the length of the entire ad break, whereas
           * minduration/maxduration/rqddurs are constraints relating to the slots
           * that make up the pod.
           * </pre>
           *
           * <code>optional int32 poddur = 25;</code>
           * @return Whether the poddur field is set.
           */
          @java.lang.Override
          public boolean hasPoddur() {
            return ((bitField0_ & 0x00000008) != 0);
          }
          /**
           * <pre>
           * Indicates the total amount of time in seconds that advertisers may
           * fill for a “dynamic” video ad pod (See Section 7.6 for more details),
           * or the dynamic portion of a “hybrid” ad pod. This field is required
           * only for the dynamic portion(s) of video ad pods. This field refers to
           * the length of the entire ad break, whereas
           * minduration/maxduration/rqddurs are constraints relating to the slots
           * that make up the pod.
           * </pre>
           *
           * <code>optional int32 poddur = 25;</code>
           * @return The poddur.
           */
          @java.lang.Override
          public int getPoddur() {
            return poddur_;
          }
          /**
           * <pre>
           * Indicates the total amount of time in seconds that advertisers may
           * fill for a “dynamic” video ad pod (See Section 7.6 for more details),
           * or the dynamic portion of a “hybrid” ad pod. This field is required
           * only for the dynamic portion(s) of video ad pods. This field refers to
           * the length of the entire ad break, whereas
           * minduration/maxduration/rqddurs are constraints relating to the slots
           * that make up the pod.
           * </pre>
           *
           * <code>optional int32 poddur = 25;</code>
           * @param value The poddur to set.
           * @return This builder for chaining.
           */
          public Builder setPoddur(int value) {
            bitField0_ |= 0x00000008;
            poddur_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Indicates the total amount of time in seconds that advertisers may
           * fill for a “dynamic” video ad pod (See Section 7.6 for more details),
           * or the dynamic portion of a “hybrid” ad pod. This field is required
           * only for the dynamic portion(s) of video ad pods. This field refers to
           * the length of the entire ad break, whereas
           * minduration/maxduration/rqddurs are constraints relating to the slots
           * that make up the pod.
           * </pre>
           *
           * <code>optional int32 poddur = 25;</code>
           * @return This builder for chaining.
           */
          public Builder clearPoddur() {
            bitField0_ = (bitField0_ & ~0x00000008);
            poddur_ = 0;
            onChanged();
            return this;
          }

          private com.google.protobuf.Internal.IntList protocols_ = emptyIntList();
          private void ensureProtocolsIsMutable() {
            if (!((bitField0_ & 0x00000010) != 0)) {
              protocols_ = mutableCopy(protocols_);
              bitField0_ |= 0x00000010;
             }
          }
          /**
           * <pre>
           * Array of supported audio protocols.
           * Refer to enum com.iabtechlab.adcom.v1.Creative.AudioVideoType for generic values.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>repeated int32 protocols = 4 [packed = true];</code>
           * @return A list containing the protocols.
           */
          public java.util.List<java.lang.Integer>
              getProtocolsList() {
            return ((bitField0_ & 0x00000010) != 0) ?
                     java.util.Collections.unmodifiableList(protocols_) : protocols_;
          }
          /**
           * <pre>
           * Array of supported audio protocols.
           * Refer to enum com.iabtechlab.adcom.v1.Creative.AudioVideoType for generic values.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>repeated int32 protocols = 4 [packed = true];</code>
           * @return The count of protocols.
           */
          public int getProtocolsCount() {
            return protocols_.size();
          }
          /**
           * <pre>
           * Array of supported audio protocols.
           * Refer to enum com.iabtechlab.adcom.v1.Creative.AudioVideoType for generic values.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>repeated int32 protocols = 4 [packed = true];</code>
           * @param index The index of the element to return.
           * @return The protocols at the given index.
           */
          public int getProtocols(int index) {
            return protocols_.getInt(index);
          }
          /**
           * <pre>
           * Array of supported audio protocols.
           * Refer to enum com.iabtechlab.adcom.v1.Creative.AudioVideoType for generic values.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>repeated int32 protocols = 4 [packed = true];</code>
           * @param index The index to set the value at.
           * @param value The protocols to set.
           * @return This builder for chaining.
           */
          public Builder setProtocols(
              int index, int value) {
            ensureProtocolsIsMutable();
            protocols_.setInt(index, value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Array of supported audio protocols.
           * Refer to enum com.iabtechlab.adcom.v1.Creative.AudioVideoType for generic values.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>repeated int32 protocols = 4 [packed = true];</code>
           * @param value The protocols to add.
           * @return This builder for chaining.
           */
          public Builder addProtocols(int value) {
            ensureProtocolsIsMutable();
            protocols_.addInt(value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Array of supported audio protocols.
           * Refer to enum com.iabtechlab.adcom.v1.Creative.AudioVideoType for generic values.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>repeated int32 protocols = 4 [packed = true];</code>
           * @param values The protocols to add.
           * @return This builder for chaining.
           */
          public Builder addAllProtocols(
              java.lang.Iterable<? extends java.lang.Integer> values) {
            ensureProtocolsIsMutable();
            com.google.protobuf.AbstractMessageLite.Builder.addAll(
                values, protocols_);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Array of supported audio protocols.
           * Refer to enum com.iabtechlab.adcom.v1.Creative.AudioVideoType for generic values.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>repeated int32 protocols = 4 [packed = true];</code>
           * @return This builder for chaining.
           */
          public Builder clearProtocols() {
            protocols_ = emptyIntList();
            bitField0_ = (bitField0_ & ~0x00000010);
            onChanged();
            return this;
          }

          private int startdelay_ ;
          /**
           * <pre>
           * Indicates the start delay in seconds for pre-roll, mid-roll, or
           * post-roll ad placements.
           * Refer to enum com.iabtechlab.adcom.v1.StartDelayMode for generic values.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional int32 startdelay = 5;</code>
           * @return Whether the startdelay field is set.
           */
          @java.lang.Override
          public boolean hasStartdelay() {
            return ((bitField0_ & 0x00000020) != 0);
          }
          /**
           * <pre>
           * Indicates the start delay in seconds for pre-roll, mid-roll, or
           * post-roll ad placements.
           * Refer to enum com.iabtechlab.adcom.v1.StartDelayMode for generic values.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional int32 startdelay = 5;</code>
           * @return The startdelay.
           */
          @java.lang.Override
          public int getStartdelay() {
            return startdelay_;
          }
          /**
           * <pre>
           * Indicates the start delay in seconds for pre-roll, mid-roll, or
           * post-roll ad placements.
           * Refer to enum com.iabtechlab.adcom.v1.StartDelayMode for generic values.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional int32 startdelay = 5;</code>
           * @param value The startdelay to set.
           * @return This builder for chaining.
           */
          public Builder setStartdelay(int value) {
            bitField0_ |= 0x00000020;
            startdelay_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Indicates the start delay in seconds for pre-roll, mid-roll, or
           * post-roll ad placements.
           * Refer to enum com.iabtechlab.adcom.v1.StartDelayMode for generic values.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional int32 startdelay = 5;</code>
           * @return This builder for chaining.
           */
          public Builder clearStartdelay() {
            bitField0_ = (bitField0_ & ~0x00000020);
            startdelay_ = 0;
            onChanged();
            return this;
          }

          private com.google.protobuf.Internal.IntList rqddurs_ = emptyIntList();
          private void ensureRqddursIsMutable() {
            if (!((bitField0_ & 0x00000040) != 0)) {
              rqddurs_ = mutableCopy(rqddurs_);
              bitField0_ |= 0x00000040;
             }
          }
          /**
           * <pre>
           * Precise acceptable durations for audio creatives in seconds. This
           * field specifically targets the live audio/radio use case where
           * non-exact ad durations would result in undesirable 'dead air'. This
           * field is mutually exclusive with minduraiton and maxduration; if
           * rqddurs is specified, minduraiton and maxduration must not be
           * specified and vice versa.
           * </pre>
           *
           * <code>repeated int32 rqddurs = 26 [packed = true];</code>
           * @return A list containing the rqddurs.
           */
          public java.util.List<java.lang.Integer>
              getRqddursList() {
            return ((bitField0_ & 0x00000040) != 0) ?
                     java.util.Collections.unmodifiableList(rqddurs_) : rqddurs_;
          }
          /**
           * <pre>
           * Precise acceptable durations for audio creatives in seconds. This
           * field specifically targets the live audio/radio use case where
           * non-exact ad durations would result in undesirable 'dead air'. This
           * field is mutually exclusive with minduraiton and maxduration; if
           * rqddurs is specified, minduraiton and maxduration must not be
           * specified and vice versa.
           * </pre>
           *
           * <code>repeated int32 rqddurs = 26 [packed = true];</code>
           * @return The count of rqddurs.
           */
          public int getRqddursCount() {
            return rqddurs_.size();
          }
          /**
           * <pre>
           * Precise acceptable durations for audio creatives in seconds. This
           * field specifically targets the live audio/radio use case where
           * non-exact ad durations would result in undesirable 'dead air'. This
           * field is mutually exclusive with minduraiton and maxduration; if
           * rqddurs is specified, minduraiton and maxduration must not be
           * specified and vice versa.
           * </pre>
           *
           * <code>repeated int32 rqddurs = 26 [packed = true];</code>
           * @param index The index of the element to return.
           * @return The rqddurs at the given index.
           */
          public int getRqddurs(int index) {
            return rqddurs_.getInt(index);
          }
          /**
           * <pre>
           * Precise acceptable durations for audio creatives in seconds. This
           * field specifically targets the live audio/radio use case where
           * non-exact ad durations would result in undesirable 'dead air'. This
           * field is mutually exclusive with minduraiton and maxduration; if
           * rqddurs is specified, minduraiton and maxduration must not be
           * specified and vice versa.
           * </pre>
           *
           * <code>repeated int32 rqddurs = 26 [packed = true];</code>
           * @param index The index to set the value at.
           * @param value The rqddurs to set.
           * @return This builder for chaining.
           */
          public Builder setRqddurs(
              int index, int value) {
            ensureRqddursIsMutable();
            rqddurs_.setInt(index, value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Precise acceptable durations for audio creatives in seconds. This
           * field specifically targets the live audio/radio use case where
           * non-exact ad durations would result in undesirable 'dead air'. This
           * field is mutually exclusive with minduraiton and maxduration; if
           * rqddurs is specified, minduraiton and maxduration must not be
           * specified and vice versa.
           * </pre>
           *
           * <code>repeated int32 rqddurs = 26 [packed = true];</code>
           * @param value The rqddurs to add.
           * @return This builder for chaining.
           */
          public Builder addRqddurs(int value) {
            ensureRqddursIsMutable();
            rqddurs_.addInt(value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Precise acceptable durations for audio creatives in seconds. This
           * field specifically targets the live audio/radio use case where
           * non-exact ad durations would result in undesirable 'dead air'. This
           * field is mutually exclusive with minduraiton and maxduration; if
           * rqddurs is specified, minduraiton and maxduration must not be
           * specified and vice versa.
           * </pre>
           *
           * <code>repeated int32 rqddurs = 26 [packed = true];</code>
           * @param values The rqddurs to add.
           * @return This builder for chaining.
           */
          public Builder addAllRqddurs(
              java.lang.Iterable<? extends java.lang.Integer> values) {
            ensureRqddursIsMutable();
            com.google.protobuf.AbstractMessageLite.Builder.addAll(
                values, rqddurs_);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Precise acceptable durations for audio creatives in seconds. This
           * field specifically targets the live audio/radio use case where
           * non-exact ad durations would result in undesirable 'dead air'. This
           * field is mutually exclusive with minduraiton and maxduration; if
           * rqddurs is specified, minduraiton and maxduration must not be
           * specified and vice versa.
           * </pre>
           *
           * <code>repeated int32 rqddurs = 26 [packed = true];</code>
           * @return This builder for chaining.
           */
          public Builder clearRqddurs() {
            rqddurs_ = emptyIntList();
            bitField0_ = (bitField0_ & ~0x00000040);
            onChanged();
            return this;
          }

          private java.lang.Object podid_ = "";
          /**
           * <pre>
           * Unique identifier indicating that an impression opportunity belongs to
           * an audio ad pod. If multiple impression opportunities within a bid
           * request share the same podid, this indicates that those impression
           * opportunities belong to the same audio ad pod.
           * </pre>
           *
           * <code>optional string podid = 27;</code>
           * @return Whether the podid field is set.
           */
          public boolean hasPodid() {
            return ((bitField0_ & 0x00000080) != 0);
          }
          /**
           * <pre>
           * Unique identifier indicating that an impression opportunity belongs to
           * an audio ad pod. If multiple impression opportunities within a bid
           * request share the same podid, this indicates that those impression
           * opportunities belong to the same audio ad pod.
           * </pre>
           *
           * <code>optional string podid = 27;</code>
           * @return The podid.
           */
          public java.lang.String getPodid() {
            java.lang.Object ref = podid_;
            if (!(ref instanceof java.lang.String)) {
              com.google.protobuf.ByteString bs =
                  (com.google.protobuf.ByteString) ref;
              java.lang.String s = bs.toStringUtf8();
              if (bs.isValidUtf8()) {
                podid_ = s;
              }
              return s;
            } else {
              return (java.lang.String) ref;
            }
          }
          /**
           * <pre>
           * Unique identifier indicating that an impression opportunity belongs to
           * an audio ad pod. If multiple impression opportunities within a bid
           * request share the same podid, this indicates that those impression
           * opportunities belong to the same audio ad pod.
           * </pre>
           *
           * <code>optional string podid = 27;</code>
           * @return The bytes for podid.
           */
          public com.google.protobuf.ByteString
              getPodidBytes() {
            java.lang.Object ref = podid_;
            if (ref instanceof String) {
              com.google.protobuf.ByteString b = 
                  com.google.protobuf.ByteString.copyFromUtf8(
                      (java.lang.String) ref);
              podid_ = b;
              return b;
            } else {
              return (com.google.protobuf.ByteString) ref;
            }
          }
          /**
           * <pre>
           * Unique identifier indicating that an impression opportunity belongs to
           * an audio ad pod. If multiple impression opportunities within a bid
           * request share the same podid, this indicates that those impression
           * opportunities belong to the same audio ad pod.
           * </pre>
           *
           * <code>optional string podid = 27;</code>
           * @param value The podid to set.
           * @return This builder for chaining.
           */
          public Builder setPodid(
              java.lang.String value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000080;
            podid_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Unique identifier indicating that an impression opportunity belongs to
           * an audio ad pod. If multiple impression opportunities within a bid
           * request share the same podid, this indicates that those impression
           * opportunities belong to the same audio ad pod.
           * </pre>
           *
           * <code>optional string podid = 27;</code>
           * @return This builder for chaining.
           */
          public Builder clearPodid() {
            bitField0_ = (bitField0_ & ~0x00000080);
            podid_ = getDefaultInstance().getPodid();
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Unique identifier indicating that an impression opportunity belongs to
           * an audio ad pod. If multiple impression opportunities within a bid
           * request share the same podid, this indicates that those impression
           * opportunities belong to the same audio ad pod.
           * </pre>
           *
           * <code>optional string podid = 27;</code>
           * @param value The bytes for podid to set.
           * @return This builder for chaining.
           */
          public Builder setPodidBytes(
              com.google.protobuf.ByteString value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000080;
            podid_ = value;
            onChanged();
            return this;
          }

          private int podseq_ ;
          /**
           * <pre>
           * The sequence (position) of the audio ad pod within a content stream.
           * </pre>
           *
           * <code>optional int32 podseq = 28 [default = 0];</code>
           * @return Whether the podseq field is set.
           */
          @java.lang.Override
          public boolean hasPodseq() {
            return ((bitField0_ & 0x00000100) != 0);
          }
          /**
           * <pre>
           * The sequence (position) of the audio ad pod within a content stream.
           * </pre>
           *
           * <code>optional int32 podseq = 28 [default = 0];</code>
           * @return The podseq.
           */
          @java.lang.Override
          public int getPodseq() {
            return podseq_;
          }
          /**
           * <pre>
           * The sequence (position) of the audio ad pod within a content stream.
           * </pre>
           *
           * <code>optional int32 podseq = 28 [default = 0];</code>
           * @param value The podseq to set.
           * @return This builder for chaining.
           */
          public Builder setPodseq(int value) {
            bitField0_ |= 0x00000100;
            podseq_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * The sequence (position) of the audio ad pod within a content stream.
           * </pre>
           *
           * <code>optional int32 podseq = 28 [default = 0];</code>
           * @return This builder for chaining.
           */
          public Builder clearPodseq() {
            bitField0_ = (bitField0_ & ~0x00000100);
            podseq_ = 0;
            onChanged();
            return this;
          }

          private int sequence_ = 1;
          /**
           * <pre>
           * If multiple ad impressions are offered in the same bid request,
           * the sequence number will allow for the coordinated delivery of
           * multiple creatives.
           * </pre>
           *
           * <code>optional int32 sequence = 6 [default = 1, deprecated = true];</code>
           * @return Whether the sequence field is set.
           */
          @java.lang.Override
          @java.lang.Deprecated public boolean hasSequence() {
            return ((bitField0_ & 0x00000200) != 0);
          }
          /**
           * <pre>
           * If multiple ad impressions are offered in the same bid request,
           * the sequence number will allow for the coordinated delivery of
           * multiple creatives.
           * </pre>
           *
           * <code>optional int32 sequence = 6 [default = 1, deprecated = true];</code>
           * @return The sequence.
           */
          @java.lang.Override
          @java.lang.Deprecated public int getSequence() {
            return sequence_;
          }
          /**
           * <pre>
           * If multiple ad impressions are offered in the same bid request,
           * the sequence number will allow for the coordinated delivery of
           * multiple creatives.
           * </pre>
           *
           * <code>optional int32 sequence = 6 [default = 1, deprecated = true];</code>
           * @param value The sequence to set.
           * @return This builder for chaining.
           */
          @java.lang.Deprecated public Builder setSequence(int value) {
            bitField0_ |= 0x00000200;
            sequence_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * If multiple ad impressions are offered in the same bid request,
           * the sequence number will allow for the coordinated delivery of
           * multiple creatives.
           * </pre>
           *
           * <code>optional int32 sequence = 6 [default = 1, deprecated = true];</code>
           * @return This builder for chaining.
           */
          @java.lang.Deprecated public Builder clearSequence() {
            bitField0_ = (bitField0_ & ~0x00000200);
            sequence_ = 1;
            onChanged();
            return this;
          }

          private int slotinpod_ ;
          /**
           * <pre>
           * For audio ad pods, this value indicates that the seller can guarantee
           * delivery against the indicated slot position in the pod.
           * </pre>
           *
           * <code>optional int32 slotinpod = 29 [default = 0];</code>
           * @return Whether the slotinpod field is set.
           */
          @java.lang.Override
          public boolean hasSlotinpod() {
            return ((bitField0_ & 0x00000400) != 0);
          }
          /**
           * <pre>
           * For audio ad pods, this value indicates that the seller can guarantee
           * delivery against the indicated slot position in the pod.
           * </pre>
           *
           * <code>optional int32 slotinpod = 29 [default = 0];</code>
           * @return The slotinpod.
           */
          @java.lang.Override
          public int getSlotinpod() {
            return slotinpod_;
          }
          /**
           * <pre>
           * For audio ad pods, this value indicates that the seller can guarantee
           * delivery against the indicated slot position in the pod.
           * </pre>
           *
           * <code>optional int32 slotinpod = 29 [default = 0];</code>
           * @param value The slotinpod to set.
           * @return This builder for chaining.
           */
          public Builder setSlotinpod(int value) {
            bitField0_ |= 0x00000400;
            slotinpod_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * For audio ad pods, this value indicates that the seller can guarantee
           * delivery against the indicated slot position in the pod.
           * </pre>
           *
           * <code>optional int32 slotinpod = 29 [default = 0];</code>
           * @return This builder for chaining.
           */
          public Builder clearSlotinpod() {
            bitField0_ = (bitField0_ & ~0x00000400);
            slotinpod_ = 0;
            onChanged();
            return this;
          }

          private double mincpmpersec_ ;
          /**
           * <pre>
           * Minimum CPM per second. This is a price floor for the “dynamic”
           * portion of an audio ad pod, relative to the duration of bids an
           * advertiser may submit.
           * </pre>
           *
           * <code>optional double mincpmpersec = 30;</code>
           * @return Whether the mincpmpersec field is set.
           */
          @java.lang.Override
          public boolean hasMincpmpersec() {
            return ((bitField0_ & 0x00000800) != 0);
          }
          /**
           * <pre>
           * Minimum CPM per second. This is a price floor for the “dynamic”
           * portion of an audio ad pod, relative to the duration of bids an
           * advertiser may submit.
           * </pre>
           *
           * <code>optional double mincpmpersec = 30;</code>
           * @return The mincpmpersec.
           */
          @java.lang.Override
          public double getMincpmpersec() {
            return mincpmpersec_;
          }
          /**
           * <pre>
           * Minimum CPM per second. This is a price floor for the “dynamic”
           * portion of an audio ad pod, relative to the duration of bids an
           * advertiser may submit.
           * </pre>
           *
           * <code>optional double mincpmpersec = 30;</code>
           * @param value The mincpmpersec to set.
           * @return This builder for chaining.
           */
          public Builder setMincpmpersec(double value) {
            bitField0_ |= 0x00000800;
            mincpmpersec_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Minimum CPM per second. This is a price floor for the “dynamic”
           * portion of an audio ad pod, relative to the duration of bids an
           * advertiser may submit.
           * </pre>
           *
           * <code>optional double mincpmpersec = 30;</code>
           * @return This builder for chaining.
           */
          public Builder clearMincpmpersec() {
            bitField0_ = (bitField0_ & ~0x00000800);
            mincpmpersec_ = 0D;
            onChanged();
            return this;
          }

          private com.google.protobuf.Internal.IntList battr_ = emptyIntList();
          private void ensureBattrIsMutable() {
            if (!((bitField0_ & 0x00001000) != 0)) {
              battr_ = mutableCopy(battr_);
              bitField0_ |= 0x00001000;
             }
          }
          /**
           * <pre>
           * Blocked creative attributes.
           * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
           * </pre>
           *
           * <code>repeated int32 battr = 7 [packed = true];</code>
           * @return A list containing the battr.
           */
          public java.util.List<java.lang.Integer>
              getBattrList() {
            return ((bitField0_ & 0x00001000) != 0) ?
                     java.util.Collections.unmodifiableList(battr_) : battr_;
          }
          /**
           * <pre>
           * Blocked creative attributes.
           * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
           * </pre>
           *
           * <code>repeated int32 battr = 7 [packed = true];</code>
           * @return The count of battr.
           */
          public int getBattrCount() {
            return battr_.size();
          }
          /**
           * <pre>
           * Blocked creative attributes.
           * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
           * </pre>
           *
           * <code>repeated int32 battr = 7 [packed = true];</code>
           * @param index The index of the element to return.
           * @return The battr at the given index.
           */
          public int getBattr(int index) {
            return battr_.getInt(index);
          }
          /**
           * <pre>
           * Blocked creative attributes.
           * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
           * </pre>
           *
           * <code>repeated int32 battr = 7 [packed = true];</code>
           * @param index The index to set the value at.
           * @param value The battr to set.
           * @return This builder for chaining.
           */
          public Builder setBattr(
              int index, int value) {
            ensureBattrIsMutable();
            battr_.setInt(index, value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Blocked creative attributes.
           * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
           * </pre>
           *
           * <code>repeated int32 battr = 7 [packed = true];</code>
           * @param value The battr to add.
           * @return This builder for chaining.
           */
          public Builder addBattr(int value) {
            ensureBattrIsMutable();
            battr_.addInt(value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Blocked creative attributes.
           * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
           * </pre>
           *
           * <code>repeated int32 battr = 7 [packed = true];</code>
           * @param values The battr to add.
           * @return This builder for chaining.
           */
          public Builder addAllBattr(
              java.lang.Iterable<? extends java.lang.Integer> values) {
            ensureBattrIsMutable();
            com.google.protobuf.AbstractMessageLite.Builder.addAll(
                values, battr_);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Blocked creative attributes.
           * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
           * </pre>
           *
           * <code>repeated int32 battr = 7 [packed = true];</code>
           * @return This builder for chaining.
           */
          public Builder clearBattr() {
            battr_ = emptyIntList();
            bitField0_ = (bitField0_ & ~0x00001000);
            onChanged();
            return this;
          }

          private int maxextended_ ;
          /**
           * <pre>
           * Maximum extended video ad duration, if extension is allowed.
           * If blank or 0, extension is not allowed. If -1, extension is allowed,
           * and there is no time limit imposed. If greater than 0, then the value
           * represents the number of seconds of extended play supported beyond
           * the maxduration value.
           * </pre>
           *
           * <code>optional int32 maxextended = 8;</code>
           * @return Whether the maxextended field is set.
           */
          @java.lang.Override
          public boolean hasMaxextended() {
            return ((bitField0_ & 0x00002000) != 0);
          }
          /**
           * <pre>
           * Maximum extended video ad duration, if extension is allowed.
           * If blank or 0, extension is not allowed. If -1, extension is allowed,
           * and there is no time limit imposed. If greater than 0, then the value
           * represents the number of seconds of extended play supported beyond
           * the maxduration value.
           * </pre>
           *
           * <code>optional int32 maxextended = 8;</code>
           * @return The maxextended.
           */
          @java.lang.Override
          public int getMaxextended() {
            return maxextended_;
          }
          /**
           * <pre>
           * Maximum extended video ad duration, if extension is allowed.
           * If blank or 0, extension is not allowed. If -1, extension is allowed,
           * and there is no time limit imposed. If greater than 0, then the value
           * represents the number of seconds of extended play supported beyond
           * the maxduration value.
           * </pre>
           *
           * <code>optional int32 maxextended = 8;</code>
           * @param value The maxextended to set.
           * @return This builder for chaining.
           */
          public Builder setMaxextended(int value) {
            bitField0_ |= 0x00002000;
            maxextended_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Maximum extended video ad duration, if extension is allowed.
           * If blank or 0, extension is not allowed. If -1, extension is allowed,
           * and there is no time limit imposed. If greater than 0, then the value
           * represents the number of seconds of extended play supported beyond
           * the maxduration value.
           * </pre>
           *
           * <code>optional int32 maxextended = 8;</code>
           * @return This builder for chaining.
           */
          public Builder clearMaxextended() {
            bitField0_ = (bitField0_ & ~0x00002000);
            maxextended_ = 0;
            onChanged();
            return this;
          }

          private int minbitrate_ ;
          /**
           * <pre>
           * Minimum bit rate in Kbps.
           * </pre>
           *
           * <code>optional int32 minbitrate = 9;</code>
           * @return Whether the minbitrate field is set.
           */
          @java.lang.Override
          public boolean hasMinbitrate() {
            return ((bitField0_ & 0x00004000) != 0);
          }
          /**
           * <pre>
           * Minimum bit rate in Kbps.
           * </pre>
           *
           * <code>optional int32 minbitrate = 9;</code>
           * @return The minbitrate.
           */
          @java.lang.Override
          public int getMinbitrate() {
            return minbitrate_;
          }
          /**
           * <pre>
           * Minimum bit rate in Kbps.
           * </pre>
           *
           * <code>optional int32 minbitrate = 9;</code>
           * @param value The minbitrate to set.
           * @return This builder for chaining.
           */
          public Builder setMinbitrate(int value) {
            bitField0_ |= 0x00004000;
            minbitrate_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Minimum bit rate in Kbps.
           * </pre>
           *
           * <code>optional int32 minbitrate = 9;</code>
           * @return This builder for chaining.
           */
          public Builder clearMinbitrate() {
            bitField0_ = (bitField0_ & ~0x00004000);
            minbitrate_ = 0;
            onChanged();
            return this;
          }

          private int maxbitrate_ ;
          /**
           * <pre>
           * Maximum bit rate in Kbps.
           * </pre>
           *
           * <code>optional int32 maxbitrate = 10;</code>
           * @return Whether the maxbitrate field is set.
           */
          @java.lang.Override
          public boolean hasMaxbitrate() {
            return ((bitField0_ & 0x00008000) != 0);
          }
          /**
           * <pre>
           * Maximum bit rate in Kbps.
           * </pre>
           *
           * <code>optional int32 maxbitrate = 10;</code>
           * @return The maxbitrate.
           */
          @java.lang.Override
          public int getMaxbitrate() {
            return maxbitrate_;
          }
          /**
           * <pre>
           * Maximum bit rate in Kbps.
           * </pre>
           *
           * <code>optional int32 maxbitrate = 10;</code>
           * @param value The maxbitrate to set.
           * @return This builder for chaining.
           */
          public Builder setMaxbitrate(int value) {
            bitField0_ |= 0x00008000;
            maxbitrate_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Maximum bit rate in Kbps.
           * </pre>
           *
           * <code>optional int32 maxbitrate = 10;</code>
           * @return This builder for chaining.
           */
          public Builder clearMaxbitrate() {
            bitField0_ = (bitField0_ & ~0x00008000);
            maxbitrate_ = 0;
            onChanged();
            return this;
          }

          private com.google.protobuf.Internal.IntList delivery_ = emptyIntList();
          private void ensureDeliveryIsMutable() {
            if (!((bitField0_ & 0x00010000) != 0)) {
              delivery_ = mutableCopy(delivery_);
              bitField0_ |= 0x00010000;
             }
          }
          /**
           * <pre>
           * Supported delivery methods (e.g., streaming, progressive).
           * If none specified, assume all are supported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.DeliveryMethod for generic values.
           * </pre>
           *
           * <code>repeated int32 delivery = 11 [packed = true];</code>
           * @return A list containing the delivery.
           */
          public java.util.List<java.lang.Integer>
              getDeliveryList() {
            return ((bitField0_ & 0x00010000) != 0) ?
                     java.util.Collections.unmodifiableList(delivery_) : delivery_;
          }
          /**
           * <pre>
           * Supported delivery methods (e.g., streaming, progressive).
           * If none specified, assume all are supported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.DeliveryMethod for generic values.
           * </pre>
           *
           * <code>repeated int32 delivery = 11 [packed = true];</code>
           * @return The count of delivery.
           */
          public int getDeliveryCount() {
            return delivery_.size();
          }
          /**
           * <pre>
           * Supported delivery methods (e.g., streaming, progressive).
           * If none specified, assume all are supported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.DeliveryMethod for generic values.
           * </pre>
           *
           * <code>repeated int32 delivery = 11 [packed = true];</code>
           * @param index The index of the element to return.
           * @return The delivery at the given index.
           */
          public int getDelivery(int index) {
            return delivery_.getInt(index);
          }
          /**
           * <pre>
           * Supported delivery methods (e.g., streaming, progressive).
           * If none specified, assume all are supported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.DeliveryMethod for generic values.
           * </pre>
           *
           * <code>repeated int32 delivery = 11 [packed = true];</code>
           * @param index The index to set the value at.
           * @param value The delivery to set.
           * @return This builder for chaining.
           */
          public Builder setDelivery(
              int index, int value) {
            ensureDeliveryIsMutable();
            delivery_.setInt(index, value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Supported delivery methods (e.g., streaming, progressive).
           * If none specified, assume all are supported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.DeliveryMethod for generic values.
           * </pre>
           *
           * <code>repeated int32 delivery = 11 [packed = true];</code>
           * @param value The delivery to add.
           * @return This builder for chaining.
           */
          public Builder addDelivery(int value) {
            ensureDeliveryIsMutable();
            delivery_.addInt(value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Supported delivery methods (e.g., streaming, progressive).
           * If none specified, assume all are supported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.DeliveryMethod for generic values.
           * </pre>
           *
           * <code>repeated int32 delivery = 11 [packed = true];</code>
           * @param values The delivery to add.
           * @return This builder for chaining.
           */
          public Builder addAllDelivery(
              java.lang.Iterable<? extends java.lang.Integer> values) {
            ensureDeliveryIsMutable();
            com.google.protobuf.AbstractMessageLite.Builder.addAll(
                values, delivery_);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Supported delivery methods (e.g., streaming, progressive).
           * If none specified, assume all are supported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.DeliveryMethod for generic values.
           * </pre>
           *
           * <code>repeated int32 delivery = 11 [packed = true];</code>
           * @return This builder for chaining.
           */
          public Builder clearDelivery() {
            delivery_ = emptyIntList();
            bitField0_ = (bitField0_ & ~0x00010000);
            onChanged();
            return this;
          }

          private java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner> companionad_ =
            java.util.Collections.emptyList();
          private void ensureCompanionadIsMutable() {
            if (!((bitField0_ & 0x00020000) != 0)) {
              companionad_ = new java.util.ArrayList<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner>(companionad_);
              bitField0_ |= 0x00020000;
             }
          }

          private com.google.protobuf.RepeatedFieldBuilderV3<
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.BannerOrBuilder> companionadBuilder_;

          /**
           * <pre>
           * Array of Banner objects if companion ads are available.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 12;</code>
           */
          public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner> getCompanionadList() {
            if (companionadBuilder_ == null) {
              return java.util.Collections.unmodifiableList(companionad_);
            } else {
              return companionadBuilder_.getMessageList();
            }
          }
          /**
           * <pre>
           * Array of Banner objects if companion ads are available.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 12;</code>
           */
          public int getCompanionadCount() {
            if (companionadBuilder_ == null) {
              return companionad_.size();
            } else {
              return companionadBuilder_.getCount();
            }
          }
          /**
           * <pre>
           * Array of Banner objects if companion ads are available.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 12;</code>
           */
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner getCompanionad(int index) {
            if (companionadBuilder_ == null) {
              return companionad_.get(index);
            } else {
              return companionadBuilder_.getMessage(index);
            }
          }
          /**
           * <pre>
           * Array of Banner objects if companion ads are available.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 12;</code>
           */
          public Builder setCompanionad(
              int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner value) {
            if (companionadBuilder_ == null) {
              if (value == null) {
                throw new NullPointerException();
              }
              ensureCompanionadIsMutable();
              companionad_.set(index, value);
              onChanged();
            } else {
              companionadBuilder_.setMessage(index, value);
            }
            return this;
          }
          /**
           * <pre>
           * Array of Banner objects if companion ads are available.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 12;</code>
           */
          public Builder setCompanionad(
              int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Builder builderForValue) {
            if (companionadBuilder_ == null) {
              ensureCompanionadIsMutable();
              companionad_.set(index, builderForValue.build());
              onChanged();
            } else {
              companionadBuilder_.setMessage(index, builderForValue.build());
            }
            return this;
          }
          /**
           * <pre>
           * Array of Banner objects if companion ads are available.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 12;</code>
           */
          public Builder addCompanionad(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner value) {
            if (companionadBuilder_ == null) {
              if (value == null) {
                throw new NullPointerException();
              }
              ensureCompanionadIsMutable();
              companionad_.add(value);
              onChanged();
            } else {
              companionadBuilder_.addMessage(value);
            }
            return this;
          }
          /**
           * <pre>
           * Array of Banner objects if companion ads are available.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 12;</code>
           */
          public Builder addCompanionad(
              int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner value) {
            if (companionadBuilder_ == null) {
              if (value == null) {
                throw new NullPointerException();
              }
              ensureCompanionadIsMutable();
              companionad_.add(index, value);
              onChanged();
            } else {
              companionadBuilder_.addMessage(index, value);
            }
            return this;
          }
          /**
           * <pre>
           * Array of Banner objects if companion ads are available.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 12;</code>
           */
          public Builder addCompanionad(
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Builder builderForValue) {
            if (companionadBuilder_ == null) {
              ensureCompanionadIsMutable();
              companionad_.add(builderForValue.build());
              onChanged();
            } else {
              companionadBuilder_.addMessage(builderForValue.build());
            }
            return this;
          }
          /**
           * <pre>
           * Array of Banner objects if companion ads are available.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 12;</code>
           */
          public Builder addCompanionad(
              int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Builder builderForValue) {
            if (companionadBuilder_ == null) {
              ensureCompanionadIsMutable();
              companionad_.add(index, builderForValue.build());
              onChanged();
            } else {
              companionadBuilder_.addMessage(index, builderForValue.build());
            }
            return this;
          }
          /**
           * <pre>
           * Array of Banner objects if companion ads are available.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 12;</code>
           */
          public Builder addAllCompanionad(
              java.lang.Iterable<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner> values) {
            if (companionadBuilder_ == null) {
              ensureCompanionadIsMutable();
              com.google.protobuf.AbstractMessageLite.Builder.addAll(
                  values, companionad_);
              onChanged();
            } else {
              companionadBuilder_.addAllMessages(values);
            }
            return this;
          }
          /**
           * <pre>
           * Array of Banner objects if companion ads are available.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 12;</code>
           */
          public Builder clearCompanionad() {
            if (companionadBuilder_ == null) {
              companionad_ = java.util.Collections.emptyList();
              bitField0_ = (bitField0_ & ~0x00020000);
              onChanged();
            } else {
              companionadBuilder_.clear();
            }
            return this;
          }
          /**
           * <pre>
           * Array of Banner objects if companion ads are available.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 12;</code>
           */
          public Builder removeCompanionad(int index) {
            if (companionadBuilder_ == null) {
              ensureCompanionadIsMutable();
              companionad_.remove(index);
              onChanged();
            } else {
              companionadBuilder_.remove(index);
            }
            return this;
          }
          /**
           * <pre>
           * Array of Banner objects if companion ads are available.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 12;</code>
           */
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Builder getCompanionadBuilder(
              int index) {
            return getCompanionadFieldBuilder().getBuilder(index);
          }
          /**
           * <pre>
           * Array of Banner objects if companion ads are available.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 12;</code>
           */
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.BannerOrBuilder getCompanionadOrBuilder(
              int index) {
            if (companionadBuilder_ == null) {
              return companionad_.get(index);  } else {
              return companionadBuilder_.getMessageOrBuilder(index);
            }
          }
          /**
           * <pre>
           * Array of Banner objects if companion ads are available.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 12;</code>
           */
          public java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.BannerOrBuilder> 
               getCompanionadOrBuilderList() {
            if (companionadBuilder_ != null) {
              return companionadBuilder_.getMessageOrBuilderList();
            } else {
              return java.util.Collections.unmodifiableList(companionad_);
            }
          }
          /**
           * <pre>
           * Array of Banner objects if companion ads are available.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 12;</code>
           */
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Builder addCompanionadBuilder() {
            return getCompanionadFieldBuilder().addBuilder(
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.getDefaultInstance());
          }
          /**
           * <pre>
           * Array of Banner objects if companion ads are available.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 12;</code>
           */
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Builder addCompanionadBuilder(
              int index) {
            return getCompanionadFieldBuilder().addBuilder(
                index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.getDefaultInstance());
          }
          /**
           * <pre>
           * Array of Banner objects if companion ads are available.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner companionad = 12;</code>
           */
          public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Builder> 
               getCompanionadBuilderList() {
            return getCompanionadFieldBuilder().getBuilderList();
          }
          private com.google.protobuf.RepeatedFieldBuilderV3<
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.BannerOrBuilder> 
              getCompanionadFieldBuilder() {
            if (companionadBuilder_ == null) {
              companionadBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.BannerOrBuilder>(
                      companionad_,
                      ((bitField0_ & 0x00020000) != 0),
                      getParentForChildren(),
                      isClean());
              companionad_ = null;
            }
            return companionadBuilder_;
          }

          private com.google.protobuf.Internal.IntList api_ = emptyIntList();
          private void ensureApiIsMutable() {
            if (!((bitField0_ & 0x00040000) != 0)) {
              api_ = mutableCopy(api_);
              bitField0_ |= 0x00040000;
             }
          }
          /**
           * <pre>
           * List of supported API frameworks for this impression.
           * If an API is not explicitly listed, it is assumed not to be supported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
           * </pre>
           *
           * <code>repeated int32 api = 13 [packed = true];</code>
           * @return A list containing the api.
           */
          public java.util.List<java.lang.Integer>
              getApiList() {
            return ((bitField0_ & 0x00040000) != 0) ?
                     java.util.Collections.unmodifiableList(api_) : api_;
          }
          /**
           * <pre>
           * List of supported API frameworks for this impression.
           * If an API is not explicitly listed, it is assumed not to be supported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
           * </pre>
           *
           * <code>repeated int32 api = 13 [packed = true];</code>
           * @return The count of api.
           */
          public int getApiCount() {
            return api_.size();
          }
          /**
           * <pre>
           * List of supported API frameworks for this impression.
           * If an API is not explicitly listed, it is assumed not to be supported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
           * </pre>
           *
           * <code>repeated int32 api = 13 [packed = true];</code>
           * @param index The index of the element to return.
           * @return The api at the given index.
           */
          public int getApi(int index) {
            return api_.getInt(index);
          }
          /**
           * <pre>
           * List of supported API frameworks for this impression.
           * If an API is not explicitly listed, it is assumed not to be supported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
           * </pre>
           *
           * <code>repeated int32 api = 13 [packed = true];</code>
           * @param index The index to set the value at.
           * @param value The api to set.
           * @return This builder for chaining.
           */
          public Builder setApi(
              int index, int value) {
            ensureApiIsMutable();
            api_.setInt(index, value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * List of supported API frameworks for this impression.
           * If an API is not explicitly listed, it is assumed not to be supported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
           * </pre>
           *
           * <code>repeated int32 api = 13 [packed = true];</code>
           * @param value The api to add.
           * @return This builder for chaining.
           */
          public Builder addApi(int value) {
            ensureApiIsMutable();
            api_.addInt(value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * List of supported API frameworks for this impression.
           * If an API is not explicitly listed, it is assumed not to be supported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
           * </pre>
           *
           * <code>repeated int32 api = 13 [packed = true];</code>
           * @param values The api to add.
           * @return This builder for chaining.
           */
          public Builder addAllApi(
              java.lang.Iterable<? extends java.lang.Integer> values) {
            ensureApiIsMutable();
            com.google.protobuf.AbstractMessageLite.Builder.addAll(
                values, api_);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * List of supported API frameworks for this impression.
           * If an API is not explicitly listed, it is assumed not to be supported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
           * </pre>
           *
           * <code>repeated int32 api = 13 [packed = true];</code>
           * @return This builder for chaining.
           */
          public Builder clearApi() {
            api_ = emptyIntList();
            bitField0_ = (bitField0_ & ~0x00040000);
            onChanged();
            return this;
          }

          private com.google.protobuf.Internal.IntList companiontype_ = emptyIntList();
          private void ensureCompaniontypeIsMutable() {
            if (!((bitField0_ & 0x00080000) != 0)) {
              companiontype_ = mutableCopy(companiontype_);
              bitField0_ |= 0x00080000;
             }
          }
          /**
           * <pre>
           * Supported DAAST companion ad types.  Recommended if companion Banner
           * objects are included via the companionad array.
           * Refer to enum com.iabtechlab.adcom.v1.CompanionType for generic values.
           * </pre>
           *
           * <code>repeated int32 companiontype = 20 [packed = true];</code>
           * @return A list containing the companiontype.
           */
          public java.util.List<java.lang.Integer>
              getCompaniontypeList() {
            return ((bitField0_ & 0x00080000) != 0) ?
                     java.util.Collections.unmodifiableList(companiontype_) : companiontype_;
          }
          /**
           * <pre>
           * Supported DAAST companion ad types.  Recommended if companion Banner
           * objects are included via the companionad array.
           * Refer to enum com.iabtechlab.adcom.v1.CompanionType for generic values.
           * </pre>
           *
           * <code>repeated int32 companiontype = 20 [packed = true];</code>
           * @return The count of companiontype.
           */
          public int getCompaniontypeCount() {
            return companiontype_.size();
          }
          /**
           * <pre>
           * Supported DAAST companion ad types.  Recommended if companion Banner
           * objects are included via the companionad array.
           * Refer to enum com.iabtechlab.adcom.v1.CompanionType for generic values.
           * </pre>
           *
           * <code>repeated int32 companiontype = 20 [packed = true];</code>
           * @param index The index of the element to return.
           * @return The companiontype at the given index.
           */
          public int getCompaniontype(int index) {
            return companiontype_.getInt(index);
          }
          /**
           * <pre>
           * Supported DAAST companion ad types.  Recommended if companion Banner
           * objects are included via the companionad array.
           * Refer to enum com.iabtechlab.adcom.v1.CompanionType for generic values.
           * </pre>
           *
           * <code>repeated int32 companiontype = 20 [packed = true];</code>
           * @param index The index to set the value at.
           * @param value The companiontype to set.
           * @return This builder for chaining.
           */
          public Builder setCompaniontype(
              int index, int value) {
            ensureCompaniontypeIsMutable();
            companiontype_.setInt(index, value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Supported DAAST companion ad types.  Recommended if companion Banner
           * objects are included via the companionad array.
           * Refer to enum com.iabtechlab.adcom.v1.CompanionType for generic values.
           * </pre>
           *
           * <code>repeated int32 companiontype = 20 [packed = true];</code>
           * @param value The companiontype to add.
           * @return This builder for chaining.
           */
          public Builder addCompaniontype(int value) {
            ensureCompaniontypeIsMutable();
            companiontype_.addInt(value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Supported DAAST companion ad types.  Recommended if companion Banner
           * objects are included via the companionad array.
           * Refer to enum com.iabtechlab.adcom.v1.CompanionType for generic values.
           * </pre>
           *
           * <code>repeated int32 companiontype = 20 [packed = true];</code>
           * @param values The companiontype to add.
           * @return This builder for chaining.
           */
          public Builder addAllCompaniontype(
              java.lang.Iterable<? extends java.lang.Integer> values) {
            ensureCompaniontypeIsMutable();
            com.google.protobuf.AbstractMessageLite.Builder.addAll(
                values, companiontype_);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Supported DAAST companion ad types.  Recommended if companion Banner
           * objects are included via the companionad array.
           * Refer to enum com.iabtechlab.adcom.v1.CompanionType for generic values.
           * </pre>
           *
           * <code>repeated int32 companiontype = 20 [packed = true];</code>
           * @return This builder for chaining.
           */
          public Builder clearCompaniontype() {
            companiontype_ = emptyIntList();
            bitField0_ = (bitField0_ & ~0x00080000);
            onChanged();
            return this;
          }

          private int maxseq_ ;
          /**
           * <pre>
           * The maximum number of ads that can be played in an ad pod.
           * </pre>
           *
           * <code>optional int32 maxseq = 21;</code>
           * @return Whether the maxseq field is set.
           */
          @java.lang.Override
          public boolean hasMaxseq() {
            return ((bitField0_ & 0x00100000) != 0);
          }
          /**
           * <pre>
           * The maximum number of ads that can be played in an ad pod.
           * </pre>
           *
           * <code>optional int32 maxseq = 21;</code>
           * @return The maxseq.
           */
          @java.lang.Override
          public int getMaxseq() {
            return maxseq_;
          }
          /**
           * <pre>
           * The maximum number of ads that can be played in an ad pod.
           * </pre>
           *
           * <code>optional int32 maxseq = 21;</code>
           * @param value The maxseq to set.
           * @return This builder for chaining.
           */
          public Builder setMaxseq(int value) {
            bitField0_ |= 0x00100000;
            maxseq_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * The maximum number of ads that can be played in an ad pod.
           * </pre>
           *
           * <code>optional int32 maxseq = 21;</code>
           * @return This builder for chaining.
           */
          public Builder clearMaxseq() {
            bitField0_ = (bitField0_ & ~0x00100000);
            maxseq_ = 0;
            onChanged();
            return this;
          }

          private int feed_ ;
          /**
           * <pre>
           * Type of audio feed.
           * Refer to enum com.iabtechlab.adcom.v1.enums.FeedType for generic values.
           * </pre>
           *
           * <code>optional int32 feed = 22;</code>
           * @return Whether the feed field is set.
           */
          @java.lang.Override
          public boolean hasFeed() {
            return ((bitField0_ & 0x00200000) != 0);
          }
          /**
           * <pre>
           * Type of audio feed.
           * Refer to enum com.iabtechlab.adcom.v1.enums.FeedType for generic values.
           * </pre>
           *
           * <code>optional int32 feed = 22;</code>
           * @return The feed.
           */
          @java.lang.Override
          public int getFeed() {
            return feed_;
          }
          /**
           * <pre>
           * Type of audio feed.
           * Refer to enum com.iabtechlab.adcom.v1.enums.FeedType for generic values.
           * </pre>
           *
           * <code>optional int32 feed = 22;</code>
           * @param value The feed to set.
           * @return This builder for chaining.
           */
          public Builder setFeed(int value) {
            bitField0_ |= 0x00200000;
            feed_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Type of audio feed.
           * Refer to enum com.iabtechlab.adcom.v1.enums.FeedType for generic values.
           * </pre>
           *
           * <code>optional int32 feed = 22;</code>
           * @return This builder for chaining.
           */
          public Builder clearFeed() {
            bitField0_ = (bitField0_ & ~0x00200000);
            feed_ = 0;
            onChanged();
            return this;
          }

          private boolean stitched_ ;
          /**
           * <pre>
           * Indicates if the ad is stitched with audio content or delivered
           * independently, where 0 = no, 1 = yes.
           * </pre>
           *
           * <code>optional bool stitched = 23;</code>
           * @return Whether the stitched field is set.
           */
          @java.lang.Override
          public boolean hasStitched() {
            return ((bitField0_ & 0x00400000) != 0);
          }
          /**
           * <pre>
           * Indicates if the ad is stitched with audio content or delivered
           * independently, where 0 = no, 1 = yes.
           * </pre>
           *
           * <code>optional bool stitched = 23;</code>
           * @return The stitched.
           */
          @java.lang.Override
          public boolean getStitched() {
            return stitched_;
          }
          /**
           * <pre>
           * Indicates if the ad is stitched with audio content or delivered
           * independently, where 0 = no, 1 = yes.
           * </pre>
           *
           * <code>optional bool stitched = 23;</code>
           * @param value The stitched to set.
           * @return This builder for chaining.
           */
          public Builder setStitched(boolean value) {
            bitField0_ |= 0x00400000;
            stitched_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Indicates if the ad is stitched with audio content or delivered
           * independently, where 0 = no, 1 = yes.
           * </pre>
           *
           * <code>optional bool stitched = 23;</code>
           * @return This builder for chaining.
           */
          public Builder clearStitched() {
            bitField0_ = (bitField0_ & ~0x00400000);
            stitched_ = false;
            onChanged();
            return this;
          }

          private int nvol_ ;
          /**
           * <pre>
           * Volume normalization mode.
           * Refer to enum com.iabtechlab.adcom.v1.VolumeNormalizationMode for generic values.
           * </pre>
           *
           * <code>optional int32 nvol = 24;</code>
           * @return Whether the nvol field is set.
           */
          @java.lang.Override
          public boolean hasNvol() {
            return ((bitField0_ & 0x00800000) != 0);
          }
          /**
           * <pre>
           * Volume normalization mode.
           * Refer to enum com.iabtechlab.adcom.v1.VolumeNormalizationMode for generic values.
           * </pre>
           *
           * <code>optional int32 nvol = 24;</code>
           * @return The nvol.
           */
          @java.lang.Override
          public int getNvol() {
            return nvol_;
          }
          /**
           * <pre>
           * Volume normalization mode.
           * Refer to enum com.iabtechlab.adcom.v1.VolumeNormalizationMode for generic values.
           * </pre>
           *
           * <code>optional int32 nvol = 24;</code>
           * @param value The nvol to set.
           * @return This builder for chaining.
           */
          public Builder setNvol(int value) {
            bitField0_ |= 0x00800000;
            nvol_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Volume normalization mode.
           * Refer to enum com.iabtechlab.adcom.v1.VolumeNormalizationMode for generic values.
           * </pre>
           *
           * <code>optional int32 nvol = 24;</code>
           * @return This builder for chaining.
           */
          public Builder clearNvol() {
            bitField0_ = (bitField0_ & ~0x00800000);
            nvol_ = 0;
            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:com.iabtechlab.openrtb.v2.BidRequest.Imp.Audio)
        }

        // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.BidRequest.Imp.Audio)
        private static final com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio DEFAULT_INSTANCE;
        static {
          DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio();
        }

        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio getDefaultInstance() {
          return DEFAULT_INSTANCE;
        }

        @java.lang.Deprecated public static final com.google.protobuf.Parser<Audio>
            PARSER = new com.google.protobuf.AbstractParser<Audio>() {
          @java.lang.Override
          public Audio parsePartialFrom(
              com.google.protobuf.CodedInputStream input,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.protobuf.InvalidProtocolBufferException {
            return new Audio(input, extensionRegistry);
          }
        };

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

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

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio getDefaultInstanceForType() {
          return DEFAULT_INSTANCE;
        }

      }

      public interface NativeOrBuilder extends
          // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.BidRequest.Imp.Native)
          com.google.protobuf.GeneratedMessageV3.
              ExtendableMessageOrBuilder<Native> {

        /**
         * <pre>
         * Request payload complying with the Native Ad Specification.
         * Exactly one of {request, request_native} should be used;
         * this is the OpenRTB-compliant field for JSON serialization.
         * </pre>
         *
         * <code>string request = 1;</code>
         * @return Whether the request field is set.
         */
        boolean hasRequest();
        /**
         * <pre>
         * Request payload complying with the Native Ad Specification.
         * Exactly one of {request, request_native} should be used;
         * this is the OpenRTB-compliant field for JSON serialization.
         * </pre>
         *
         * <code>string request = 1;</code>
         * @return The request.
         */
        java.lang.String getRequest();
        /**
         * <pre>
         * Request payload complying with the Native Ad Specification.
         * Exactly one of {request, request_native} should be used;
         * this is the OpenRTB-compliant field for JSON serialization.
         * </pre>
         *
         * <code>string request = 1;</code>
         * @return The bytes for request.
         */
        com.google.protobuf.ByteString
            getRequestBytes();

        /**
         * <pre>
         * Request payload complying with the Native Ad Specification.
         * Exactly one of {request, request_native} should be used;
         * this is an alternate field preferred for Protobuf serialization.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeRequest request_native = 50;</code>
         * @return Whether the requestNative field is set.
         */
        boolean hasRequestNative();
        /**
         * <pre>
         * Request payload complying with the Native Ad Specification.
         * Exactly one of {request, request_native} should be used;
         * this is an alternate field preferred for Protobuf serialization.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeRequest request_native = 50;</code>
         * @return The requestNative.
         */
        com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest getRequestNative();
        /**
         * <pre>
         * Request payload complying with the Native Ad Specification.
         * Exactly one of {request, request_native} should be used;
         * this is an alternate field preferred for Protobuf serialization.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeRequest request_native = 50;</code>
         */
        com.iabtechlab.openrtb.v2.OpenRtb.NativeRequestOrBuilder getRequestNativeOrBuilder();

        /**
         * <pre>
         * Version of the Native Ad Specification to which request complies.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string ver = 2;</code>
         * @return Whether the ver field is set.
         */
        boolean hasVer();
        /**
         * <pre>
         * Version of the Native Ad Specification to which request complies.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string ver = 2;</code>
         * @return The ver.
         */
        java.lang.String getVer();
        /**
         * <pre>
         * Version of the Native Ad Specification to which request complies.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string ver = 2;</code>
         * @return The bytes for ver.
         */
        com.google.protobuf.ByteString
            getVerBytes();

        /**
         * <pre>
         * List of supported API frameworks for this impression.
         * If an API is not explicitly listed, it is assumed not to be supported.
         * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
         * </pre>
         *
         * <code>repeated int32 api = 3 [packed = true];</code>
         * @return A list containing the api.
         */
        java.util.List<java.lang.Integer> getApiList();
        /**
         * <pre>
         * List of supported API frameworks for this impression.
         * If an API is not explicitly listed, it is assumed not to be supported.
         * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
         * </pre>
         *
         * <code>repeated int32 api = 3 [packed = true];</code>
         * @return The count of api.
         */
        int getApiCount();
        /**
         * <pre>
         * List of supported API frameworks for this impression.
         * If an API is not explicitly listed, it is assumed not to be supported.
         * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
         * </pre>
         *
         * <code>repeated int32 api = 3 [packed = true];</code>
         * @param index The index of the element to return.
         * @return The api at the given index.
         */
        int getApi(int index);

        /**
         * <pre>
         * Blocked creative attributes.
         * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
         * </pre>
         *
         * <code>repeated int32 battr = 4 [packed = true];</code>
         * @return A list containing the battr.
         */
        java.util.List<java.lang.Integer> getBattrList();
        /**
         * <pre>
         * Blocked creative attributes.
         * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
         * </pre>
         *
         * <code>repeated int32 battr = 4 [packed = true];</code>
         * @return The count of battr.
         */
        int getBattrCount();
        /**
         * <pre>
         * Blocked creative attributes.
         * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
         * </pre>
         *
         * <code>repeated int32 battr = 4 [packed = true];</code>
         * @param index The index of the element to return.
         * @return The battr at the given index.
         */
        int getBattr(int index);

        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native.RequestOneofCase getRequestOneofCase();
      }
      /**
       * <pre>
       * OpenRTB 2.3: This object represents a native type impression.
       * Native ad units are intended to blend seamlessly into the surrounding
       * content (e.g., a sponsored Twitter or Facebook post). As such, the
       * response must be well-structured to afford the publisher fine-grained
       * control over rendering.
       * The Native Subcommittee has developed a companion specification to
       * OpenRTB called the Native Ad Specification. It defines the request
       * parameters and response markup structure of native ad units.
       * This object provides the means of transporting request parameters as an
       * opaque string so that the specific parameters can evolve separately
       * under the auspices of the Native Ad Specification. Similarly, the
       * ad markup served will be structured according to that specification.
       * The presence of a Native as a subordinate of the Imp object indicates
       * that this impression is offered as a native type impression.
       * At the publisher's discretion, that same impression may also be offered
       * as banner and/or video by also including as Imp subordinates the Banner
       * and/or Video objects, respectively. However, any given bid for the
       * impression must conform to one of the offered types.
       * </pre>
       *
       * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Imp.Native}
       */
      public static final class Native extends
          com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
            Native> implements
          // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.BidRequest.Imp.Native)
          NativeOrBuilder {
      private static final long serialVersionUID = 0L;
        // Use Native.newBuilder() to construct.
        private Native(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native, ?> builder) {
          super(builder);
        }
        private Native() {
          ver_ = "";
          api_ = emptyIntList();
          battr_ = emptyIntList();
        }

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

        @java.lang.Override
        public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
          return this.unknownFields;
        }
        private Native(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          this();
          if (extensionRegistry == null) {
            throw new java.lang.NullPointerException();
          }
          int mutable_bitField0_ = 0;
          com.google.protobuf.UnknownFieldSet.Builder unknownFields =
              com.google.protobuf.UnknownFieldSet.newBuilder();
          try {
            boolean done = false;
            while (!done) {
              int tag = input.readTag();
              switch (tag) {
                case 0:
                  done = true;
                  break;
                case 10: {
                  com.google.protobuf.ByteString bs = input.readBytes();
                  requestOneofCase_ = 1;
                  requestOneof_ = bs;
                  break;
                }
                case 18: {
                  com.google.protobuf.ByteString bs = input.readBytes();
                  bitField0_ |= 0x00000004;
                  ver_ = bs;
                  break;
                }
                case 24: {
                  if (!((mutable_bitField0_ & 0x00000008) != 0)) {
                    api_ = newIntList();
                    mutable_bitField0_ |= 0x00000008;
                  }
                  api_.addInt(input.readInt32());
                  break;
                }
                case 26: {
                  int length = input.readRawVarint32();
                  int limit = input.pushLimit(length);
                  if (!((mutable_bitField0_ & 0x00000008) != 0) && input.getBytesUntilLimit() > 0) {
                    api_ = newIntList();
                    mutable_bitField0_ |= 0x00000008;
                  }
                  while (input.getBytesUntilLimit() > 0) {
                    api_.addInt(input.readInt32());
                  }
                  input.popLimit(limit);
                  break;
                }
                case 32: {
                  if (!((mutable_bitField0_ & 0x00000010) != 0)) {
                    battr_ = newIntList();
                    mutable_bitField0_ |= 0x00000010;
                  }
                  battr_.addInt(input.readInt32());
                  break;
                }
                case 34: {
                  int length = input.readRawVarint32();
                  int limit = input.pushLimit(length);
                  if (!((mutable_bitField0_ & 0x00000010) != 0) && input.getBytesUntilLimit() > 0) {
                    battr_ = newIntList();
                    mutable_bitField0_ |= 0x00000010;
                  }
                  while (input.getBytesUntilLimit() > 0) {
                    battr_.addInt(input.readInt32());
                  }
                  input.popLimit(limit);
                  break;
                }
                case 402: {
                  com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Builder subBuilder = null;
                  if (requestOneofCase_ == 50) {
                    subBuilder = ((com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest) requestOneof_).toBuilder();
                  }
                  requestOneof_ =
                      input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.PARSER, extensionRegistry);
                  if (subBuilder != null) {
                    subBuilder.mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest) requestOneof_);
                    requestOneof_ = subBuilder.buildPartial();
                  }
                  requestOneofCase_ = 50;
                  break;
                }
                default: {
                  if (!parseUnknownField(
                      input, unknownFields, extensionRegistry, tag)) {
                    done = true;
                  }
                  break;
                }
              }
            }
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            throw e.setUnfinishedMessage(this);
          } catch (java.io.IOException e) {
            throw new com.google.protobuf.InvalidProtocolBufferException(
                e).setUnfinishedMessage(this);
          } finally {
            if (((mutable_bitField0_ & 0x00000008) != 0)) {
              api_.makeImmutable(); // C
            }
            if (((mutable_bitField0_ & 0x00000010) != 0)) {
              battr_.makeImmutable(); // C
            }
            this.unknownFields = unknownFields.build();
            makeExtensionsImmutable();
          }
        }
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Native_descriptor;
        }

        @java.lang.Override
        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Native_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native.Builder.class);
        }

        private int bitField0_;
        private int requestOneofCase_ = 0;
        private java.lang.Object requestOneof_;
        public enum RequestOneofCase
            implements com.google.protobuf.Internal.EnumLite,
                com.google.protobuf.AbstractMessage.InternalOneOfEnum {
          REQUEST(1),
          REQUEST_NATIVE(50),
          REQUESTONEOF_NOT_SET(0);
          private final int value;
          private RequestOneofCase(int value) {
            this.value = value;
          }
          /**
           * @param value The number of the enum to look for.
           * @return The enum associated with the given number.
           * @deprecated Use {@link #forNumber(int)} instead.
           */
          @java.lang.Deprecated
          public static RequestOneofCase valueOf(int value) {
            return forNumber(value);
          }

          public static RequestOneofCase forNumber(int value) {
            switch (value) {
              case 1: return REQUEST;
              case 50: return REQUEST_NATIVE;
              case 0: return REQUESTONEOF_NOT_SET;
              default: return null;
            }
          }
          public int getNumber() {
            return this.value;
          }
        };

        public RequestOneofCase
        getRequestOneofCase() {
          return RequestOneofCase.forNumber(
              requestOneofCase_);
        }

        public static final int REQUEST_FIELD_NUMBER = 1;
        /**
         * <pre>
         * Request payload complying with the Native Ad Specification.
         * Exactly one of {request, request_native} should be used;
         * this is the OpenRTB-compliant field for JSON serialization.
         * </pre>
         *
         * <code>string request = 1;</code>
         * @return Whether the request field is set.
         */
        public boolean hasRequest() {
          return requestOneofCase_ == 1;
        }
        /**
         * <pre>
         * Request payload complying with the Native Ad Specification.
         * Exactly one of {request, request_native} should be used;
         * this is the OpenRTB-compliant field for JSON serialization.
         * </pre>
         *
         * <code>string request = 1;</code>
         * @return The request.
         */
        public java.lang.String getRequest() {
          java.lang.Object ref = "";
          if (requestOneofCase_ == 1) {
            ref = requestOneof_;
          }
          if (ref instanceof java.lang.String) {
            return (java.lang.String) ref;
          } else {
            com.google.protobuf.ByteString bs = 
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8() && (requestOneofCase_ == 1)) {
              requestOneof_ = s;
            }
            return s;
          }
        }
        /**
         * <pre>
         * Request payload complying with the Native Ad Specification.
         * Exactly one of {request, request_native} should be used;
         * this is the OpenRTB-compliant field for JSON serialization.
         * </pre>
         *
         * <code>string request = 1;</code>
         * @return The bytes for request.
         */
        public com.google.protobuf.ByteString
            getRequestBytes() {
          java.lang.Object ref = "";
          if (requestOneofCase_ == 1) {
            ref = requestOneof_;
          }
          if (ref instanceof java.lang.String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            if (requestOneofCase_ == 1) {
              requestOneof_ = b;
            }
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }

        public static final int REQUEST_NATIVE_FIELD_NUMBER = 50;
        /**
         * <pre>
         * Request payload complying with the Native Ad Specification.
         * Exactly one of {request, request_native} should be used;
         * this is an alternate field preferred for Protobuf serialization.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeRequest request_native = 50;</code>
         * @return Whether the requestNative field is set.
         */
        @java.lang.Override
        public boolean hasRequestNative() {
          return requestOneofCase_ == 50;
        }
        /**
         * <pre>
         * Request payload complying with the Native Ad Specification.
         * Exactly one of {request, request_native} should be used;
         * this is an alternate field preferred for Protobuf serialization.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeRequest request_native = 50;</code>
         * @return The requestNative.
         */
        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest getRequestNative() {
          if (requestOneofCase_ == 50) {
             return (com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest) requestOneof_;
          }
          return com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.getDefaultInstance();
        }
        /**
         * <pre>
         * Request payload complying with the Native Ad Specification.
         * Exactly one of {request, request_native} should be used;
         * this is an alternate field preferred for Protobuf serialization.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeRequest request_native = 50;</code>
         */
        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequestOrBuilder getRequestNativeOrBuilder() {
          if (requestOneofCase_ == 50) {
             return (com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest) requestOneof_;
          }
          return com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.getDefaultInstance();
        }

        public static final int VER_FIELD_NUMBER = 2;
        private volatile java.lang.Object ver_;
        /**
         * <pre>
         * Version of the Native Ad Specification to which request complies.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string ver = 2;</code>
         * @return Whether the ver field is set.
         */
        @java.lang.Override
        public boolean hasVer() {
          return ((bitField0_ & 0x00000004) != 0);
        }
        /**
         * <pre>
         * Version of the Native Ad Specification to which request complies.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string ver = 2;</code>
         * @return The ver.
         */
        @java.lang.Override
        public java.lang.String getVer() {
          java.lang.Object ref = ver_;
          if (ref instanceof java.lang.String) {
            return (java.lang.String) ref;
          } else {
            com.google.protobuf.ByteString bs = 
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              ver_ = s;
            }
            return s;
          }
        }
        /**
         * <pre>
         * Version of the Native Ad Specification to which request complies.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string ver = 2;</code>
         * @return The bytes for ver.
         */
        @java.lang.Override
        public com.google.protobuf.ByteString
            getVerBytes() {
          java.lang.Object ref = ver_;
          if (ref instanceof java.lang.String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            ver_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }

        public static final int API_FIELD_NUMBER = 3;
        private com.google.protobuf.Internal.IntList api_;
        /**
         * <pre>
         * List of supported API frameworks for this impression.
         * If an API is not explicitly listed, it is assumed not to be supported.
         * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
         * </pre>
         *
         * <code>repeated int32 api = 3 [packed = true];</code>
         * @return A list containing the api.
         */
        @java.lang.Override
        public java.util.List<java.lang.Integer>
            getApiList() {
          return api_;
        }
        /**
         * <pre>
         * List of supported API frameworks for this impression.
         * If an API is not explicitly listed, it is assumed not to be supported.
         * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
         * </pre>
         *
         * <code>repeated int32 api = 3 [packed = true];</code>
         * @return The count of api.
         */
        public int getApiCount() {
          return api_.size();
        }
        /**
         * <pre>
         * List of supported API frameworks for this impression.
         * If an API is not explicitly listed, it is assumed not to be supported.
         * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
         * </pre>
         *
         * <code>repeated int32 api = 3 [packed = true];</code>
         * @param index The index of the element to return.
         * @return The api at the given index.
         */
        public int getApi(int index) {
          return api_.getInt(index);
        }
        private int apiMemoizedSerializedSize = -1;

        public static final int BATTR_FIELD_NUMBER = 4;
        private com.google.protobuf.Internal.IntList battr_;
        /**
         * <pre>
         * Blocked creative attributes.
         * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
         * </pre>
         *
         * <code>repeated int32 battr = 4 [packed = true];</code>
         * @return A list containing the battr.
         */
        @java.lang.Override
        public java.util.List<java.lang.Integer>
            getBattrList() {
          return battr_;
        }
        /**
         * <pre>
         * Blocked creative attributes.
         * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
         * </pre>
         *
         * <code>repeated int32 battr = 4 [packed = true];</code>
         * @return The count of battr.
         */
        public int getBattrCount() {
          return battr_.size();
        }
        /**
         * <pre>
         * Blocked creative attributes.
         * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
         * </pre>
         *
         * <code>repeated int32 battr = 4 [packed = true];</code>
         * @param index The index of the element to return.
         * @return The battr at the given index.
         */
        public int getBattr(int index) {
          return battr_.getInt(index);
        }
        private int battrMemoizedSerializedSize = -1;

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

          if (hasRequestNative()) {
            if (!getRequestNative().isInitialized()) {
              memoizedIsInitialized = 0;
              return false;
            }
          }
          if (!extensionsAreInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
          memoizedIsInitialized = 1;
          return true;
        }

        @java.lang.Override
        public void writeTo(com.google.protobuf.CodedOutputStream output)
                            throws java.io.IOException {
          getSerializedSize();
          com.google.protobuf.GeneratedMessageV3
            .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native>.ExtensionWriter
              extensionWriter = newExtensionWriter();
          if (requestOneofCase_ == 1) {
            com.google.protobuf.GeneratedMessageV3.writeString(output, 1, requestOneof_);
          }
          if (((bitField0_ & 0x00000004) != 0)) {
            com.google.protobuf.GeneratedMessageV3.writeString(output, 2, ver_);
          }
          if (getApiList().size() > 0) {
            output.writeUInt32NoTag(26);
            output.writeUInt32NoTag(apiMemoizedSerializedSize);
          }
          for (int i = 0; i < api_.size(); i++) {
            output.writeInt32NoTag(api_.getInt(i));
          }
          if (getBattrList().size() > 0) {
            output.writeUInt32NoTag(34);
            output.writeUInt32NoTag(battrMemoizedSerializedSize);
          }
          for (int i = 0; i < battr_.size(); i++) {
            output.writeInt32NoTag(battr_.getInt(i));
          }
          if (requestOneofCase_ == 50) {
            output.writeMessage(50, (com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest) requestOneof_);
          }
          extensionWriter.writeUntil(10000, output);
          unknownFields.writeTo(output);
        }

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

          size = 0;
          if (requestOneofCase_ == 1) {
            size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, requestOneof_);
          }
          if (((bitField0_ & 0x00000004) != 0)) {
            size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, ver_);
          }
          {
            int dataSize = 0;
            for (int i = 0; i < api_.size(); i++) {
              dataSize += com.google.protobuf.CodedOutputStream
                .computeInt32SizeNoTag(api_.getInt(i));
            }
            size += dataSize;
            if (!getApiList().isEmpty()) {
              size += 1;
              size += com.google.protobuf.CodedOutputStream
                  .computeInt32SizeNoTag(dataSize);
            }
            apiMemoizedSerializedSize = dataSize;
          }
          {
            int dataSize = 0;
            for (int i = 0; i < battr_.size(); i++) {
              dataSize += com.google.protobuf.CodedOutputStream
                .computeInt32SizeNoTag(battr_.getInt(i));
            }
            size += dataSize;
            if (!getBattrList().isEmpty()) {
              size += 1;
              size += com.google.protobuf.CodedOutputStream
                  .computeInt32SizeNoTag(dataSize);
            }
            battrMemoizedSerializedSize = dataSize;
          }
          if (requestOneofCase_ == 50) {
            size += com.google.protobuf.CodedOutputStream
              .computeMessageSize(50, (com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest) requestOneof_);
          }
          size += extensionsSerializedSize();
          size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native)) {
            return super.equals(obj);
          }
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native other = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native) obj;

          if (hasVer() != other.hasVer()) return false;
          if (hasVer()) {
            if (!getVer()
                .equals(other.getVer())) return false;
          }
          if (!getApiList()
              .equals(other.getApiList())) return false;
          if (!getBattrList()
              .equals(other.getBattrList())) return false;
          if (!getRequestOneofCase().equals(other.getRequestOneofCase())) return false;
          switch (requestOneofCase_) {
            case 1:
              if (!getRequest()
                  .equals(other.getRequest())) return false;
              break;
            case 50:
              if (!getRequestNative()
                  .equals(other.getRequestNative())) return false;
              break;
            case 0:
            default:
          }
          if (!unknownFields.equals(other.unknownFields)) return false;
          if (!getExtensionFields().equals(other.getExtensionFields()))
            return false;
          return true;
        }

        @java.lang.Override
        public int hashCode() {
          if (memoizedHashCode != 0) {
            return memoizedHashCode;
          }
          int hash = 41;
          hash = (19 * hash) + getDescriptor().hashCode();
          if (hasVer()) {
            hash = (37 * hash) + VER_FIELD_NUMBER;
            hash = (53 * hash) + getVer().hashCode();
          }
          if (getApiCount() > 0) {
            hash = (37 * hash) + API_FIELD_NUMBER;
            hash = (53 * hash) + getApiList().hashCode();
          }
          if (getBattrCount() > 0) {
            hash = (37 * hash) + BATTR_FIELD_NUMBER;
            hash = (53 * hash) + getBattrList().hashCode();
          }
          switch (requestOneofCase_) {
            case 1:
              hash = (37 * hash) + REQUEST_FIELD_NUMBER;
              hash = (53 * hash) + getRequest().hashCode();
              break;
            case 50:
              hash = (37 * hash) + REQUEST_NATIVE_FIELD_NUMBER;
              hash = (53 * hash) + getRequestNative().hashCode();
              break;
            case 0:
            default:
          }
          hash = hashFields(hash, getExtensionFields());
          hash = (29 * hash) + unknownFields.hashCode();
          memoizedHashCode = hash;
          return hash;
        }

        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native parseFrom(
            java.nio.ByteBuffer data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native parseFrom(
            java.nio.ByteBuffer data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native parseFrom(
            com.google.protobuf.ByteString data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native parseFrom(
            com.google.protobuf.ByteString data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native parseFrom(byte[] data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native parseFrom(
            byte[] data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native parseFrom(java.io.InputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native parseDelimitedFrom(java.io.InputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseDelimitedWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native parseFrom(
            com.google.protobuf.CodedInputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native 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>
         * OpenRTB 2.3: This object represents a native type impression.
         * Native ad units are intended to blend seamlessly into the surrounding
         * content (e.g., a sponsored Twitter or Facebook post). As such, the
         * response must be well-structured to afford the publisher fine-grained
         * control over rendering.
         * The Native Subcommittee has developed a companion specification to
         * OpenRTB called the Native Ad Specification. It defines the request
         * parameters and response markup structure of native ad units.
         * This object provides the means of transporting request parameters as an
         * opaque string so that the specific parameters can evolve separately
         * under the auspices of the Native Ad Specification. Similarly, the
         * ad markup served will be structured according to that specification.
         * The presence of a Native as a subordinate of the Imp object indicates
         * that this impression is offered as a native type impression.
         * At the publisher's discretion, that same impression may also be offered
         * as banner and/or video by also including as Imp subordinates the Banner
         * and/or Video objects, respectively. However, any given bid for the
         * impression must conform to one of the offered types.
         * </pre>
         *
         * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Imp.Native}
         */
        public static final class Builder extends
            com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native, Builder> implements
            // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.BidRequest.Imp.Native)
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.NativeOrBuilder {
          public static final com.google.protobuf.Descriptors.Descriptor
              getDescriptor() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Native_descriptor;
          }

          @java.lang.Override
          protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
              internalGetFieldAccessorTable() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Native_fieldAccessorTable
                .ensureFieldAccessorsInitialized(
                    com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native.Builder.class);
          }

          // Construct using com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native.newBuilder()
          private Builder() {
            maybeForceBuilderInitialization();
          }

          private Builder(
              com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
            super(parent);
            maybeForceBuilderInitialization();
          }
          private void maybeForceBuilderInitialization() {
            if (com.google.protobuf.GeneratedMessageV3
                    .alwaysUseFieldBuilders) {
            }
          }
          @java.lang.Override
          public Builder clear() {
            super.clear();
            ver_ = "";
            bitField0_ = (bitField0_ & ~0x00000004);
            api_ = emptyIntList();
            bitField0_ = (bitField0_ & ~0x00000008);
            battr_ = emptyIntList();
            bitField0_ = (bitField0_ & ~0x00000010);
            requestOneofCase_ = 0;
            requestOneof_ = null;
            return this;
          }

          @java.lang.Override
          public com.google.protobuf.Descriptors.Descriptor
              getDescriptorForType() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Native_descriptor;
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native getDefaultInstanceForType() {
            return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native.getDefaultInstance();
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native build() {
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native result = buildPartial();
            if (!result.isInitialized()) {
              throw newUninitializedMessageException(result);
            }
            return result;
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native buildPartial() {
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native result = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native(this);
            int from_bitField0_ = bitField0_;
            int to_bitField0_ = 0;
            if (requestOneofCase_ == 1) {
              result.requestOneof_ = requestOneof_;
            }
            if (requestOneofCase_ == 50) {
              if (requestNativeBuilder_ == null) {
                result.requestOneof_ = requestOneof_;
              } else {
                result.requestOneof_ = requestNativeBuilder_.build();
              }
            }
            if (((from_bitField0_ & 0x00000004) != 0)) {
              to_bitField0_ |= 0x00000004;
            }
            result.ver_ = ver_;
            if (((bitField0_ & 0x00000008) != 0)) {
              api_.makeImmutable();
              bitField0_ = (bitField0_ & ~0x00000008);
            }
            result.api_ = api_;
            if (((bitField0_ & 0x00000010) != 0)) {
              battr_.makeImmutable();
              bitField0_ = (bitField0_ & ~0x00000010);
            }
            result.battr_ = battr_;
            result.bitField0_ = to_bitField0_;
            result.requestOneofCase_ = requestOneofCase_;
            onBuilt();
            return result;
          }

          @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 <Type> Builder setExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native, Type> extension,
              Type value) {
            return super.setExtension(extension, value);
          }
          @java.lang.Override
          public <Type> Builder setExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native, java.util.List<Type>> extension,
              int index, Type value) {
            return super.setExtension(extension, index, value);
          }
          @java.lang.Override
          public <Type> Builder addExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native, java.util.List<Type>> extension,
              Type value) {
            return super.addExtension(extension, value);
          }
          @java.lang.Override
          public <Type> Builder clearExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native, ?> extension) {
            return super.clearExtension(extension);
          }
          @java.lang.Override
          public Builder mergeFrom(com.google.protobuf.Message other) {
            if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native) {
              return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native)other);
            } else {
              super.mergeFrom(other);
              return this;
            }
          }

          public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native other) {
            if (other == com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native.getDefaultInstance()) return this;
            if (other.hasVer()) {
              bitField0_ |= 0x00000004;
              ver_ = other.ver_;
              onChanged();
            }
            if (!other.api_.isEmpty()) {
              if (api_.isEmpty()) {
                api_ = other.api_;
                bitField0_ = (bitField0_ & ~0x00000008);
              } else {
                ensureApiIsMutable();
                api_.addAll(other.api_);
              }
              onChanged();
            }
            if (!other.battr_.isEmpty()) {
              if (battr_.isEmpty()) {
                battr_ = other.battr_;
                bitField0_ = (bitField0_ & ~0x00000010);
              } else {
                ensureBattrIsMutable();
                battr_.addAll(other.battr_);
              }
              onChanged();
            }
            switch (other.getRequestOneofCase()) {
              case REQUEST: {
                requestOneofCase_ = 1;
                requestOneof_ = other.requestOneof_;
                onChanged();
                break;
              }
              case REQUEST_NATIVE: {
                mergeRequestNative(other.getRequestNative());
                break;
              }
              case REQUESTONEOF_NOT_SET: {
                break;
              }
            }
            this.mergeExtensionFields(other);
            this.mergeUnknownFields(other.unknownFields);
            onChanged();
            return this;
          }

          @java.lang.Override
          public final boolean isInitialized() {
            if (hasRequestNative()) {
              if (!getRequestNative().isInitialized()) {
                return false;
              }
            }
            if (!extensionsAreInitialized()) {
              return false;
            }
            return true;
          }

          @java.lang.Override
          public Builder mergeFrom(
              com.google.protobuf.CodedInputStream input,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native parsedMessage = null;
            try {
              parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
              parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native) e.getUnfinishedMessage();
              throw e.unwrapIOException();
            } finally {
              if (parsedMessage != null) {
                mergeFrom(parsedMessage);
              }
            }
            return this;
          }
          private int requestOneofCase_ = 0;
          private java.lang.Object requestOneof_;
          public RequestOneofCase
              getRequestOneofCase() {
            return RequestOneofCase.forNumber(
                requestOneofCase_);
          }

          public Builder clearRequestOneof() {
            requestOneofCase_ = 0;
            requestOneof_ = null;
            onChanged();
            return this;
          }

          private int bitField0_;

          /**
           * <pre>
           * Request payload complying with the Native Ad Specification.
           * Exactly one of {request, request_native} should be used;
           * this is the OpenRTB-compliant field for JSON serialization.
           * </pre>
           *
           * <code>string request = 1;</code>
           * @return Whether the request field is set.
           */
          @java.lang.Override
          public boolean hasRequest() {
            return requestOneofCase_ == 1;
          }
          /**
           * <pre>
           * Request payload complying with the Native Ad Specification.
           * Exactly one of {request, request_native} should be used;
           * this is the OpenRTB-compliant field for JSON serialization.
           * </pre>
           *
           * <code>string request = 1;</code>
           * @return The request.
           */
          @java.lang.Override
          public java.lang.String getRequest() {
            java.lang.Object ref = "";
            if (requestOneofCase_ == 1) {
              ref = requestOneof_;
            }
            if (!(ref instanceof java.lang.String)) {
              com.google.protobuf.ByteString bs =
                  (com.google.protobuf.ByteString) ref;
              java.lang.String s = bs.toStringUtf8();
              if (requestOneofCase_ == 1) {
                if (bs.isValidUtf8()) {
                  requestOneof_ = s;
                }
              }
              return s;
            } else {
              return (java.lang.String) ref;
            }
          }
          /**
           * <pre>
           * Request payload complying with the Native Ad Specification.
           * Exactly one of {request, request_native} should be used;
           * this is the OpenRTB-compliant field for JSON serialization.
           * </pre>
           *
           * <code>string request = 1;</code>
           * @return The bytes for request.
           */
          @java.lang.Override
          public com.google.protobuf.ByteString
              getRequestBytes() {
            java.lang.Object ref = "";
            if (requestOneofCase_ == 1) {
              ref = requestOneof_;
            }
            if (ref instanceof String) {
              com.google.protobuf.ByteString b = 
                  com.google.protobuf.ByteString.copyFromUtf8(
                      (java.lang.String) ref);
              if (requestOneofCase_ == 1) {
                requestOneof_ = b;
              }
              return b;
            } else {
              return (com.google.protobuf.ByteString) ref;
            }
          }
          /**
           * <pre>
           * Request payload complying with the Native Ad Specification.
           * Exactly one of {request, request_native} should be used;
           * this is the OpenRTB-compliant field for JSON serialization.
           * </pre>
           *
           * <code>string request = 1;</code>
           * @param value The request to set.
           * @return This builder for chaining.
           */
          public Builder setRequest(
              java.lang.String value) {
            if (value == null) {
    throw new NullPointerException();
  }
  requestOneofCase_ = 1;
            requestOneof_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Request payload complying with the Native Ad Specification.
           * Exactly one of {request, request_native} should be used;
           * this is the OpenRTB-compliant field for JSON serialization.
           * </pre>
           *
           * <code>string request = 1;</code>
           * @return This builder for chaining.
           */
          public Builder clearRequest() {
            if (requestOneofCase_ == 1) {
              requestOneofCase_ = 0;
              requestOneof_ = null;
              onChanged();
            }
            return this;
          }
          /**
           * <pre>
           * Request payload complying with the Native Ad Specification.
           * Exactly one of {request, request_native} should be used;
           * this is the OpenRTB-compliant field for JSON serialization.
           * </pre>
           *
           * <code>string request = 1;</code>
           * @param value The bytes for request to set.
           * @return This builder for chaining.
           */
          public Builder setRequestBytes(
              com.google.protobuf.ByteString value) {
            if (value == null) {
    throw new NullPointerException();
  }
  requestOneofCase_ = 1;
            requestOneof_ = value;
            onChanged();
            return this;
          }

          private com.google.protobuf.SingleFieldBuilderV3<
              com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Builder, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequestOrBuilder> requestNativeBuilder_;
          /**
           * <pre>
           * Request payload complying with the Native Ad Specification.
           * Exactly one of {request, request_native} should be used;
           * this is an alternate field preferred for Protobuf serialization.
           * </pre>
           *
           * <code>.com.iabtechlab.openrtb.v2.NativeRequest request_native = 50;</code>
           * @return Whether the requestNative field is set.
           */
          @java.lang.Override
          public boolean hasRequestNative() {
            return requestOneofCase_ == 50;
          }
          /**
           * <pre>
           * Request payload complying with the Native Ad Specification.
           * Exactly one of {request, request_native} should be used;
           * this is an alternate field preferred for Protobuf serialization.
           * </pre>
           *
           * <code>.com.iabtechlab.openrtb.v2.NativeRequest request_native = 50;</code>
           * @return The requestNative.
           */
          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest getRequestNative() {
            if (requestNativeBuilder_ == null) {
              if (requestOneofCase_ == 50) {
                return (com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest) requestOneof_;
              }
              return com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.getDefaultInstance();
            } else {
              if (requestOneofCase_ == 50) {
                return requestNativeBuilder_.getMessage();
              }
              return com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.getDefaultInstance();
            }
          }
          /**
           * <pre>
           * Request payload complying with the Native Ad Specification.
           * Exactly one of {request, request_native} should be used;
           * this is an alternate field preferred for Protobuf serialization.
           * </pre>
           *
           * <code>.com.iabtechlab.openrtb.v2.NativeRequest request_native = 50;</code>
           */
          public Builder setRequestNative(com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest value) {
            if (requestNativeBuilder_ == null) {
              if (value == null) {
                throw new NullPointerException();
              }
              requestOneof_ = value;
              onChanged();
            } else {
              requestNativeBuilder_.setMessage(value);
            }
            requestOneofCase_ = 50;
            return this;
          }
          /**
           * <pre>
           * Request payload complying with the Native Ad Specification.
           * Exactly one of {request, request_native} should be used;
           * this is an alternate field preferred for Protobuf serialization.
           * </pre>
           *
           * <code>.com.iabtechlab.openrtb.v2.NativeRequest request_native = 50;</code>
           */
          public Builder setRequestNative(
              com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Builder builderForValue) {
            if (requestNativeBuilder_ == null) {
              requestOneof_ = builderForValue.build();
              onChanged();
            } else {
              requestNativeBuilder_.setMessage(builderForValue.build());
            }
            requestOneofCase_ = 50;
            return this;
          }
          /**
           * <pre>
           * Request payload complying with the Native Ad Specification.
           * Exactly one of {request, request_native} should be used;
           * this is an alternate field preferred for Protobuf serialization.
           * </pre>
           *
           * <code>.com.iabtechlab.openrtb.v2.NativeRequest request_native = 50;</code>
           */
          public Builder mergeRequestNative(com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest value) {
            if (requestNativeBuilder_ == null) {
              if (requestOneofCase_ == 50 &&
                  requestOneof_ != com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.getDefaultInstance()) {
                requestOneof_ = com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.newBuilder((com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest) requestOneof_)
                    .mergeFrom(value).buildPartial();
              } else {
                requestOneof_ = value;
              }
              onChanged();
            } else {
              if (requestOneofCase_ == 50) {
                requestNativeBuilder_.mergeFrom(value);
              }
              requestNativeBuilder_.setMessage(value);
            }
            requestOneofCase_ = 50;
            return this;
          }
          /**
           * <pre>
           * Request payload complying with the Native Ad Specification.
           * Exactly one of {request, request_native} should be used;
           * this is an alternate field preferred for Protobuf serialization.
           * </pre>
           *
           * <code>.com.iabtechlab.openrtb.v2.NativeRequest request_native = 50;</code>
           */
          public Builder clearRequestNative() {
            if (requestNativeBuilder_ == null) {
              if (requestOneofCase_ == 50) {
                requestOneofCase_ = 0;
                requestOneof_ = null;
                onChanged();
              }
            } else {
              if (requestOneofCase_ == 50) {
                requestOneofCase_ = 0;
                requestOneof_ = null;
              }
              requestNativeBuilder_.clear();
            }
            return this;
          }
          /**
           * <pre>
           * Request payload complying with the Native Ad Specification.
           * Exactly one of {request, request_native} should be used;
           * this is an alternate field preferred for Protobuf serialization.
           * </pre>
           *
           * <code>.com.iabtechlab.openrtb.v2.NativeRequest request_native = 50;</code>
           */
          public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Builder getRequestNativeBuilder() {
            return getRequestNativeFieldBuilder().getBuilder();
          }
          /**
           * <pre>
           * Request payload complying with the Native Ad Specification.
           * Exactly one of {request, request_native} should be used;
           * this is an alternate field preferred for Protobuf serialization.
           * </pre>
           *
           * <code>.com.iabtechlab.openrtb.v2.NativeRequest request_native = 50;</code>
           */
          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequestOrBuilder getRequestNativeOrBuilder() {
            if ((requestOneofCase_ == 50) && (requestNativeBuilder_ != null)) {
              return requestNativeBuilder_.getMessageOrBuilder();
            } else {
              if (requestOneofCase_ == 50) {
                return (com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest) requestOneof_;
              }
              return com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.getDefaultInstance();
            }
          }
          /**
           * <pre>
           * Request payload complying with the Native Ad Specification.
           * Exactly one of {request, request_native} should be used;
           * this is an alternate field preferred for Protobuf serialization.
           * </pre>
           *
           * <code>.com.iabtechlab.openrtb.v2.NativeRequest request_native = 50;</code>
           */
          private com.google.protobuf.SingleFieldBuilderV3<
              com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Builder, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequestOrBuilder> 
              getRequestNativeFieldBuilder() {
            if (requestNativeBuilder_ == null) {
              if (!(requestOneofCase_ == 50)) {
                requestOneof_ = com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.getDefaultInstance();
              }
              requestNativeBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
                  com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Builder, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequestOrBuilder>(
                      (com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest) requestOneof_,
                      getParentForChildren(),
                      isClean());
              requestOneof_ = null;
            }
            requestOneofCase_ = 50;
            onChanged();;
            return requestNativeBuilder_;
          }

          private java.lang.Object ver_ = "";
          /**
           * <pre>
           * Version of the Native Ad Specification to which request complies.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional string ver = 2;</code>
           * @return Whether the ver field is set.
           */
          public boolean hasVer() {
            return ((bitField0_ & 0x00000004) != 0);
          }
          /**
           * <pre>
           * Version of the Native Ad Specification to which request complies.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional string ver = 2;</code>
           * @return The ver.
           */
          public java.lang.String getVer() {
            java.lang.Object ref = ver_;
            if (!(ref instanceof java.lang.String)) {
              com.google.protobuf.ByteString bs =
                  (com.google.protobuf.ByteString) ref;
              java.lang.String s = bs.toStringUtf8();
              if (bs.isValidUtf8()) {
                ver_ = s;
              }
              return s;
            } else {
              return (java.lang.String) ref;
            }
          }
          /**
           * <pre>
           * Version of the Native Ad Specification to which request complies.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional string ver = 2;</code>
           * @return The bytes for ver.
           */
          public com.google.protobuf.ByteString
              getVerBytes() {
            java.lang.Object ref = ver_;
            if (ref instanceof String) {
              com.google.protobuf.ByteString b = 
                  com.google.protobuf.ByteString.copyFromUtf8(
                      (java.lang.String) ref);
              ver_ = b;
              return b;
            } else {
              return (com.google.protobuf.ByteString) ref;
            }
          }
          /**
           * <pre>
           * Version of the Native Ad Specification to which request complies.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional string ver = 2;</code>
           * @param value The ver to set.
           * @return This builder for chaining.
           */
          public Builder setVer(
              java.lang.String value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
            ver_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Version of the Native Ad Specification to which request complies.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional string ver = 2;</code>
           * @return This builder for chaining.
           */
          public Builder clearVer() {
            bitField0_ = (bitField0_ & ~0x00000004);
            ver_ = getDefaultInstance().getVer();
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Version of the Native Ad Specification to which request complies.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional string ver = 2;</code>
           * @param value The bytes for ver to set.
           * @return This builder for chaining.
           */
          public Builder setVerBytes(
              com.google.protobuf.ByteString value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
            ver_ = value;
            onChanged();
            return this;
          }

          private com.google.protobuf.Internal.IntList api_ = emptyIntList();
          private void ensureApiIsMutable() {
            if (!((bitField0_ & 0x00000008) != 0)) {
              api_ = mutableCopy(api_);
              bitField0_ |= 0x00000008;
             }
          }
          /**
           * <pre>
           * List of supported API frameworks for this impression.
           * If an API is not explicitly listed, it is assumed not to be supported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
           * </pre>
           *
           * <code>repeated int32 api = 3 [packed = true];</code>
           * @return A list containing the api.
           */
          public java.util.List<java.lang.Integer>
              getApiList() {
            return ((bitField0_ & 0x00000008) != 0) ?
                     java.util.Collections.unmodifiableList(api_) : api_;
          }
          /**
           * <pre>
           * List of supported API frameworks for this impression.
           * If an API is not explicitly listed, it is assumed not to be supported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
           * </pre>
           *
           * <code>repeated int32 api = 3 [packed = true];</code>
           * @return The count of api.
           */
          public int getApiCount() {
            return api_.size();
          }
          /**
           * <pre>
           * List of supported API frameworks for this impression.
           * If an API is not explicitly listed, it is assumed not to be supported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
           * </pre>
           *
           * <code>repeated int32 api = 3 [packed = true];</code>
           * @param index The index of the element to return.
           * @return The api at the given index.
           */
          public int getApi(int index) {
            return api_.getInt(index);
          }
          /**
           * <pre>
           * List of supported API frameworks for this impression.
           * If an API is not explicitly listed, it is assumed not to be supported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
           * </pre>
           *
           * <code>repeated int32 api = 3 [packed = true];</code>
           * @param index The index to set the value at.
           * @param value The api to set.
           * @return This builder for chaining.
           */
          public Builder setApi(
              int index, int value) {
            ensureApiIsMutable();
            api_.setInt(index, value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * List of supported API frameworks for this impression.
           * If an API is not explicitly listed, it is assumed not to be supported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
           * </pre>
           *
           * <code>repeated int32 api = 3 [packed = true];</code>
           * @param value The api to add.
           * @return This builder for chaining.
           */
          public Builder addApi(int value) {
            ensureApiIsMutable();
            api_.addInt(value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * List of supported API frameworks for this impression.
           * If an API is not explicitly listed, it is assumed not to be supported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
           * </pre>
           *
           * <code>repeated int32 api = 3 [packed = true];</code>
           * @param values The api to add.
           * @return This builder for chaining.
           */
          public Builder addAllApi(
              java.lang.Iterable<? extends java.lang.Integer> values) {
            ensureApiIsMutable();
            com.google.protobuf.AbstractMessageLite.Builder.addAll(
                values, api_);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * List of supported API frameworks for this impression.
           * If an API is not explicitly listed, it is assumed not to be supported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
           * </pre>
           *
           * <code>repeated int32 api = 3 [packed = true];</code>
           * @return This builder for chaining.
           */
          public Builder clearApi() {
            api_ = emptyIntList();
            bitField0_ = (bitField0_ & ~0x00000008);
            onChanged();
            return this;
          }

          private com.google.protobuf.Internal.IntList battr_ = emptyIntList();
          private void ensureBattrIsMutable() {
            if (!((bitField0_ & 0x00000010) != 0)) {
              battr_ = mutableCopy(battr_);
              bitField0_ |= 0x00000010;
             }
          }
          /**
           * <pre>
           * Blocked creative attributes.
           * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
           * </pre>
           *
           * <code>repeated int32 battr = 4 [packed = true];</code>
           * @return A list containing the battr.
           */
          public java.util.List<java.lang.Integer>
              getBattrList() {
            return ((bitField0_ & 0x00000010) != 0) ?
                     java.util.Collections.unmodifiableList(battr_) : battr_;
          }
          /**
           * <pre>
           * Blocked creative attributes.
           * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
           * </pre>
           *
           * <code>repeated int32 battr = 4 [packed = true];</code>
           * @return The count of battr.
           */
          public int getBattrCount() {
            return battr_.size();
          }
          /**
           * <pre>
           * Blocked creative attributes.
           * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
           * </pre>
           *
           * <code>repeated int32 battr = 4 [packed = true];</code>
           * @param index The index of the element to return.
           * @return The battr at the given index.
           */
          public int getBattr(int index) {
            return battr_.getInt(index);
          }
          /**
           * <pre>
           * Blocked creative attributes.
           * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
           * </pre>
           *
           * <code>repeated int32 battr = 4 [packed = true];</code>
           * @param index The index to set the value at.
           * @param value The battr to set.
           * @return This builder for chaining.
           */
          public Builder setBattr(
              int index, int value) {
            ensureBattrIsMutable();
            battr_.setInt(index, value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Blocked creative attributes.
           * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
           * </pre>
           *
           * <code>repeated int32 battr = 4 [packed = true];</code>
           * @param value The battr to add.
           * @return This builder for chaining.
           */
          public Builder addBattr(int value) {
            ensureBattrIsMutable();
            battr_.addInt(value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Blocked creative attributes.
           * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
           * </pre>
           *
           * <code>repeated int32 battr = 4 [packed = true];</code>
           * @param values The battr to add.
           * @return This builder for chaining.
           */
          public Builder addAllBattr(
              java.lang.Iterable<? extends java.lang.Integer> values) {
            ensureBattrIsMutable();
            com.google.protobuf.AbstractMessageLite.Builder.addAll(
                values, battr_);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Blocked creative attributes.
           * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
           * </pre>
           *
           * <code>repeated int32 battr = 4 [packed = true];</code>
           * @return This builder for chaining.
           */
          public Builder clearBattr() {
            battr_ = emptyIntList();
            bitField0_ = (bitField0_ & ~0x00000010);
            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:com.iabtechlab.openrtb.v2.BidRequest.Imp.Native)
        }

        // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.BidRequest.Imp.Native)
        private static final com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native DEFAULT_INSTANCE;
        static {
          DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native();
        }

        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native getDefaultInstance() {
          return DEFAULT_INSTANCE;
        }

        @java.lang.Deprecated public static final com.google.protobuf.Parser<Native>
            PARSER = new com.google.protobuf.AbstractParser<Native>() {
          @java.lang.Override
          public Native parsePartialFrom(
              com.google.protobuf.CodedInputStream input,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.protobuf.InvalidProtocolBufferException {
            return new Native(input, extensionRegistry);
          }
        };

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

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

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native getDefaultInstanceForType() {
          return DEFAULT_INSTANCE;
        }

      }

      public interface QtyOrBuilder extends
          // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.BidRequest.Imp.Qty)
          com.google.protobuf.GeneratedMessageV3.
              ExtendableMessageOrBuilder<Qty> {

        /**
         * <pre>
         * The quantity of billable events which will be deemed to have occurred if
         * this item is purchased. For example, a DOOH opportunity may be
         * considered to be 14.2 impressions. Equivalent to qtyflt in OpenRTB 3.0.
         * </pre>
         *
         * <code>optional double multiplier = 1;</code>
         * @return Whether the multiplier field is set.
         */
        boolean hasMultiplier();
        /**
         * <pre>
         * The quantity of billable events which will be deemed to have occurred if
         * this item is purchased. For example, a DOOH opportunity may be
         * considered to be 14.2 impressions. Equivalent to qtyflt in OpenRTB 3.0.
         * </pre>
         *
         * <code>optional double multiplier = 1;</code>
         * @return The multiplier.
         */
        double getMultiplier();

        /**
         * <pre>
         * The source type of the quantity measurement, ie. publisher.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional int32 sourcetype = 2;</code>
         * @return Whether the sourcetype field is set.
         */
        boolean hasSourcetype();
        /**
         * <pre>
         * The source type of the quantity measurement, ie. publisher.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional int32 sourcetype = 2;</code>
         * @return The sourcetype.
         */
        int getSourcetype();

        /**
         * <pre>
         * The top level business domain name of the measurement vendor providing
         * the quantity measurement.
         * REQUIRED by the OpenRTB specification if sourcetype is equal to 1.
         * </pre>
         *
         * <code>optional string vendor = 3;</code>
         * @return Whether the vendor field is set.
         */
        boolean hasVendor();
        /**
         * <pre>
         * The top level business domain name of the measurement vendor providing
         * the quantity measurement.
         * REQUIRED by the OpenRTB specification if sourcetype is equal to 1.
         * </pre>
         *
         * <code>optional string vendor = 3;</code>
         * @return The vendor.
         */
        java.lang.String getVendor();
        /**
         * <pre>
         * The top level business domain name of the measurement vendor providing
         * the quantity measurement.
         * REQUIRED by the OpenRTB specification if sourcetype is equal to 1.
         * </pre>
         *
         * <code>optional string vendor = 3;</code>
         * @return The bytes for vendor.
         */
        com.google.protobuf.ByteString
            getVendorBytes();
      }
      /**
       * <pre>
       * A programmatic impression is often referred to as a ‘spot’ in digital
       * out-of-home and CTV, with an impression being a unique member of the
       * audience viewing it. Therefore, a standard means of passing a multiplier
       * in the bid request, representing the total quantity of impressions, is
       * required. This object includes the impression multiplier, and describes
       * the source of the multiplier value.
       * </pre>
       *
       * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Imp.Qty}
       */
      public static final class Qty extends
          com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
            Qty> implements
          // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.BidRequest.Imp.Qty)
          QtyOrBuilder {
      private static final long serialVersionUID = 0L;
        // Use Qty.newBuilder() to construct.
        private Qty(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty, ?> builder) {
          super(builder);
        }
        private Qty() {
          vendor_ = "";
        }

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

        @java.lang.Override
        public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
          return this.unknownFields;
        }
        private Qty(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          this();
          if (extensionRegistry == null) {
            throw new java.lang.NullPointerException();
          }
          int mutable_bitField0_ = 0;
          com.google.protobuf.UnknownFieldSet.Builder unknownFields =
              com.google.protobuf.UnknownFieldSet.newBuilder();
          try {
            boolean done = false;
            while (!done) {
              int tag = input.readTag();
              switch (tag) {
                case 0:
                  done = true;
                  break;
                case 9: {
                  bitField0_ |= 0x00000001;
                  multiplier_ = input.readDouble();
                  break;
                }
                case 16: {
                  bitField0_ |= 0x00000002;
                  sourcetype_ = input.readInt32();
                  break;
                }
                case 26: {
                  com.google.protobuf.ByteString bs = input.readBytes();
                  bitField0_ |= 0x00000004;
                  vendor_ = bs;
                  break;
                }
                default: {
                  if (!parseUnknownField(
                      input, unknownFields, extensionRegistry, tag)) {
                    done = true;
                  }
                  break;
                }
              }
            }
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            throw e.setUnfinishedMessage(this);
          } catch (java.io.IOException e) {
            throw new com.google.protobuf.InvalidProtocolBufferException(
                e).setUnfinishedMessage(this);
          } finally {
            this.unknownFields = unknownFields.build();
            makeExtensionsImmutable();
          }
        }
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Qty_descriptor;
        }

        @java.lang.Override
        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Qty_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty.Builder.class);
        }

        private int bitField0_;
        public static final int MULTIPLIER_FIELD_NUMBER = 1;
        private double multiplier_;
        /**
         * <pre>
         * The quantity of billable events which will be deemed to have occurred if
         * this item is purchased. For example, a DOOH opportunity may be
         * considered to be 14.2 impressions. Equivalent to qtyflt in OpenRTB 3.0.
         * </pre>
         *
         * <code>optional double multiplier = 1;</code>
         * @return Whether the multiplier field is set.
         */
        @java.lang.Override
        public boolean hasMultiplier() {
          return ((bitField0_ & 0x00000001) != 0);
        }
        /**
         * <pre>
         * The quantity of billable events which will be deemed to have occurred if
         * this item is purchased. For example, a DOOH opportunity may be
         * considered to be 14.2 impressions. Equivalent to qtyflt in OpenRTB 3.0.
         * </pre>
         *
         * <code>optional double multiplier = 1;</code>
         * @return The multiplier.
         */
        @java.lang.Override
        public double getMultiplier() {
          return multiplier_;
        }

        public static final int SOURCETYPE_FIELD_NUMBER = 2;
        private int sourcetype_;
        /**
         * <pre>
         * The source type of the quantity measurement, ie. publisher.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional int32 sourcetype = 2;</code>
         * @return Whether the sourcetype field is set.
         */
        @java.lang.Override
        public boolean hasSourcetype() {
          return ((bitField0_ & 0x00000002) != 0);
        }
        /**
         * <pre>
         * The source type of the quantity measurement, ie. publisher.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional int32 sourcetype = 2;</code>
         * @return The sourcetype.
         */
        @java.lang.Override
        public int getSourcetype() {
          return sourcetype_;
        }

        public static final int VENDOR_FIELD_NUMBER = 3;
        private volatile java.lang.Object vendor_;
        /**
         * <pre>
         * The top level business domain name of the measurement vendor providing
         * the quantity measurement.
         * REQUIRED by the OpenRTB specification if sourcetype is equal to 1.
         * </pre>
         *
         * <code>optional string vendor = 3;</code>
         * @return Whether the vendor field is set.
         */
        @java.lang.Override
        public boolean hasVendor() {
          return ((bitField0_ & 0x00000004) != 0);
        }
        /**
         * <pre>
         * The top level business domain name of the measurement vendor providing
         * the quantity measurement.
         * REQUIRED by the OpenRTB specification if sourcetype is equal to 1.
         * </pre>
         *
         * <code>optional string vendor = 3;</code>
         * @return The vendor.
         */
        @java.lang.Override
        public java.lang.String getVendor() {
          java.lang.Object ref = vendor_;
          if (ref instanceof java.lang.String) {
            return (java.lang.String) ref;
          } else {
            com.google.protobuf.ByteString bs = 
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              vendor_ = s;
            }
            return s;
          }
        }
        /**
         * <pre>
         * The top level business domain name of the measurement vendor providing
         * the quantity measurement.
         * REQUIRED by the OpenRTB specification if sourcetype is equal to 1.
         * </pre>
         *
         * <code>optional string vendor = 3;</code>
         * @return The bytes for vendor.
         */
        @java.lang.Override
        public com.google.protobuf.ByteString
            getVendorBytes() {
          java.lang.Object ref = vendor_;
          if (ref instanceof java.lang.String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            vendor_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }

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

          if (!extensionsAreInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
          memoizedIsInitialized = 1;
          return true;
        }

        @java.lang.Override
        public void writeTo(com.google.protobuf.CodedOutputStream output)
                            throws java.io.IOException {
          com.google.protobuf.GeneratedMessageV3
            .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty>.ExtensionWriter
              extensionWriter = newExtensionWriter();
          if (((bitField0_ & 0x00000001) != 0)) {
            output.writeDouble(1, multiplier_);
          }
          if (((bitField0_ & 0x00000002) != 0)) {
            output.writeInt32(2, sourcetype_);
          }
          if (((bitField0_ & 0x00000004) != 0)) {
            com.google.protobuf.GeneratedMessageV3.writeString(output, 3, vendor_);
          }
          extensionWriter.writeUntil(10000, output);
          unknownFields.writeTo(output);
        }

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

          size = 0;
          if (((bitField0_ & 0x00000001) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeDoubleSize(1, multiplier_);
          }
          if (((bitField0_ & 0x00000002) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(2, sourcetype_);
          }
          if (((bitField0_ & 0x00000004) != 0)) {
            size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, vendor_);
          }
          size += extensionsSerializedSize();
          size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty)) {
            return super.equals(obj);
          }
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty other = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty) obj;

          if (hasMultiplier() != other.hasMultiplier()) return false;
          if (hasMultiplier()) {
            if (java.lang.Double.doubleToLongBits(getMultiplier())
                != java.lang.Double.doubleToLongBits(
                    other.getMultiplier())) return false;
          }
          if (hasSourcetype() != other.hasSourcetype()) return false;
          if (hasSourcetype()) {
            if (getSourcetype()
                != other.getSourcetype()) return false;
          }
          if (hasVendor() != other.hasVendor()) return false;
          if (hasVendor()) {
            if (!getVendor()
                .equals(other.getVendor())) return false;
          }
          if (!unknownFields.equals(other.unknownFields)) return false;
          if (!getExtensionFields().equals(other.getExtensionFields()))
            return false;
          return true;
        }

        @java.lang.Override
        public int hashCode() {
          if (memoizedHashCode != 0) {
            return memoizedHashCode;
          }
          int hash = 41;
          hash = (19 * hash) + getDescriptor().hashCode();
          if (hasMultiplier()) {
            hash = (37 * hash) + MULTIPLIER_FIELD_NUMBER;
            hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
                java.lang.Double.doubleToLongBits(getMultiplier()));
          }
          if (hasSourcetype()) {
            hash = (37 * hash) + SOURCETYPE_FIELD_NUMBER;
            hash = (53 * hash) + getSourcetype();
          }
          if (hasVendor()) {
            hash = (37 * hash) + VENDOR_FIELD_NUMBER;
            hash = (53 * hash) + getVendor().hashCode();
          }
          hash = hashFields(hash, getExtensionFields());
          hash = (29 * hash) + unknownFields.hashCode();
          memoizedHashCode = hash;
          return hash;
        }

        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty parseFrom(
            java.nio.ByteBuffer data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty parseFrom(
            java.nio.ByteBuffer data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty parseFrom(
            com.google.protobuf.ByteString data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty parseFrom(
            com.google.protobuf.ByteString data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty parseFrom(byte[] data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty parseFrom(
            byte[] data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty parseFrom(java.io.InputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty parseDelimitedFrom(java.io.InputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseDelimitedWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty parseFrom(
            com.google.protobuf.CodedInputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty 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>
         * A programmatic impression is often referred to as a ‘spot’ in digital
         * out-of-home and CTV, with an impression being a unique member of the
         * audience viewing it. Therefore, a standard means of passing a multiplier
         * in the bid request, representing the total quantity of impressions, is
         * required. This object includes the impression multiplier, and describes
         * the source of the multiplier value.
         * </pre>
         *
         * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Imp.Qty}
         */
        public static final class Builder extends
            com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty, Builder> implements
            // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.BidRequest.Imp.Qty)
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.QtyOrBuilder {
          public static final com.google.protobuf.Descriptors.Descriptor
              getDescriptor() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Qty_descriptor;
          }

          @java.lang.Override
          protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
              internalGetFieldAccessorTable() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Qty_fieldAccessorTable
                .ensureFieldAccessorsInitialized(
                    com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty.Builder.class);
          }

          // Construct using com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty.newBuilder()
          private Builder() {
            maybeForceBuilderInitialization();
          }

          private Builder(
              com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
            super(parent);
            maybeForceBuilderInitialization();
          }
          private void maybeForceBuilderInitialization() {
            if (com.google.protobuf.GeneratedMessageV3
                    .alwaysUseFieldBuilders) {
            }
          }
          @java.lang.Override
          public Builder clear() {
            super.clear();
            multiplier_ = 0D;
            bitField0_ = (bitField0_ & ~0x00000001);
            sourcetype_ = 0;
            bitField0_ = (bitField0_ & ~0x00000002);
            vendor_ = "";
            bitField0_ = (bitField0_ & ~0x00000004);
            return this;
          }

          @java.lang.Override
          public com.google.protobuf.Descriptors.Descriptor
              getDescriptorForType() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Qty_descriptor;
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty getDefaultInstanceForType() {
            return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty.getDefaultInstance();
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty build() {
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty result = buildPartial();
            if (!result.isInitialized()) {
              throw newUninitializedMessageException(result);
            }
            return result;
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty buildPartial() {
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty result = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty(this);
            int from_bitField0_ = bitField0_;
            int to_bitField0_ = 0;
            if (((from_bitField0_ & 0x00000001) != 0)) {
              result.multiplier_ = multiplier_;
              to_bitField0_ |= 0x00000001;
            }
            if (((from_bitField0_ & 0x00000002) != 0)) {
              result.sourcetype_ = sourcetype_;
              to_bitField0_ |= 0x00000002;
            }
            if (((from_bitField0_ & 0x00000004) != 0)) {
              to_bitField0_ |= 0x00000004;
            }
            result.vendor_ = vendor_;
            result.bitField0_ = to_bitField0_;
            onBuilt();
            return result;
          }

          @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 <Type> Builder setExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty, Type> extension,
              Type value) {
            return super.setExtension(extension, value);
          }
          @java.lang.Override
          public <Type> Builder setExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty, java.util.List<Type>> extension,
              int index, Type value) {
            return super.setExtension(extension, index, value);
          }
          @java.lang.Override
          public <Type> Builder addExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty, java.util.List<Type>> extension,
              Type value) {
            return super.addExtension(extension, value);
          }
          @java.lang.Override
          public <Type> Builder clearExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty, ?> extension) {
            return super.clearExtension(extension);
          }
          @java.lang.Override
          public Builder mergeFrom(com.google.protobuf.Message other) {
            if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty) {
              return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty)other);
            } else {
              super.mergeFrom(other);
              return this;
            }
          }

          public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty other) {
            if (other == com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty.getDefaultInstance()) return this;
            if (other.hasMultiplier()) {
              setMultiplier(other.getMultiplier());
            }
            if (other.hasSourcetype()) {
              setSourcetype(other.getSourcetype());
            }
            if (other.hasVendor()) {
              bitField0_ |= 0x00000004;
              vendor_ = other.vendor_;
              onChanged();
            }
            this.mergeExtensionFields(other);
            this.mergeUnknownFields(other.unknownFields);
            onChanged();
            return this;
          }

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

          @java.lang.Override
          public Builder mergeFrom(
              com.google.protobuf.CodedInputStream input,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty parsedMessage = null;
            try {
              parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
              parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty) e.getUnfinishedMessage();
              throw e.unwrapIOException();
            } finally {
              if (parsedMessage != null) {
                mergeFrom(parsedMessage);
              }
            }
            return this;
          }
          private int bitField0_;

          private double multiplier_ ;
          /**
           * <pre>
           * The quantity of billable events which will be deemed to have occurred if
           * this item is purchased. For example, a DOOH opportunity may be
           * considered to be 14.2 impressions. Equivalent to qtyflt in OpenRTB 3.0.
           * </pre>
           *
           * <code>optional double multiplier = 1;</code>
           * @return Whether the multiplier field is set.
           */
          @java.lang.Override
          public boolean hasMultiplier() {
            return ((bitField0_ & 0x00000001) != 0);
          }
          /**
           * <pre>
           * The quantity of billable events which will be deemed to have occurred if
           * this item is purchased. For example, a DOOH opportunity may be
           * considered to be 14.2 impressions. Equivalent to qtyflt in OpenRTB 3.0.
           * </pre>
           *
           * <code>optional double multiplier = 1;</code>
           * @return The multiplier.
           */
          @java.lang.Override
          public double getMultiplier() {
            return multiplier_;
          }
          /**
           * <pre>
           * The quantity of billable events which will be deemed to have occurred if
           * this item is purchased. For example, a DOOH opportunity may be
           * considered to be 14.2 impressions. Equivalent to qtyflt in OpenRTB 3.0.
           * </pre>
           *
           * <code>optional double multiplier = 1;</code>
           * @param value The multiplier to set.
           * @return This builder for chaining.
           */
          public Builder setMultiplier(double value) {
            bitField0_ |= 0x00000001;
            multiplier_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * The quantity of billable events which will be deemed to have occurred if
           * this item is purchased. For example, a DOOH opportunity may be
           * considered to be 14.2 impressions. Equivalent to qtyflt in OpenRTB 3.0.
           * </pre>
           *
           * <code>optional double multiplier = 1;</code>
           * @return This builder for chaining.
           */
          public Builder clearMultiplier() {
            bitField0_ = (bitField0_ & ~0x00000001);
            multiplier_ = 0D;
            onChanged();
            return this;
          }

          private int sourcetype_ ;
          /**
           * <pre>
           * The source type of the quantity measurement, ie. publisher.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional int32 sourcetype = 2;</code>
           * @return Whether the sourcetype field is set.
           */
          @java.lang.Override
          public boolean hasSourcetype() {
            return ((bitField0_ & 0x00000002) != 0);
          }
          /**
           * <pre>
           * The source type of the quantity measurement, ie. publisher.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional int32 sourcetype = 2;</code>
           * @return The sourcetype.
           */
          @java.lang.Override
          public int getSourcetype() {
            return sourcetype_;
          }
          /**
           * <pre>
           * The source type of the quantity measurement, ie. publisher.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional int32 sourcetype = 2;</code>
           * @param value The sourcetype to set.
           * @return This builder for chaining.
           */
          public Builder setSourcetype(int value) {
            bitField0_ |= 0x00000002;
            sourcetype_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * The source type of the quantity measurement, ie. publisher.
           * RECOMMENDED by the OpenRTB specification.
           * </pre>
           *
           * <code>optional int32 sourcetype = 2;</code>
           * @return This builder for chaining.
           */
          public Builder clearSourcetype() {
            bitField0_ = (bitField0_ & ~0x00000002);
            sourcetype_ = 0;
            onChanged();
            return this;
          }

          private java.lang.Object vendor_ = "";
          /**
           * <pre>
           * The top level business domain name of the measurement vendor providing
           * the quantity measurement.
           * REQUIRED by the OpenRTB specification if sourcetype is equal to 1.
           * </pre>
           *
           * <code>optional string vendor = 3;</code>
           * @return Whether the vendor field is set.
           */
          public boolean hasVendor() {
            return ((bitField0_ & 0x00000004) != 0);
          }
          /**
           * <pre>
           * The top level business domain name of the measurement vendor providing
           * the quantity measurement.
           * REQUIRED by the OpenRTB specification if sourcetype is equal to 1.
           * </pre>
           *
           * <code>optional string vendor = 3;</code>
           * @return The vendor.
           */
          public java.lang.String getVendor() {
            java.lang.Object ref = vendor_;
            if (!(ref instanceof java.lang.String)) {
              com.google.protobuf.ByteString bs =
                  (com.google.protobuf.ByteString) ref;
              java.lang.String s = bs.toStringUtf8();
              if (bs.isValidUtf8()) {
                vendor_ = s;
              }
              return s;
            } else {
              return (java.lang.String) ref;
            }
          }
          /**
           * <pre>
           * The top level business domain name of the measurement vendor providing
           * the quantity measurement.
           * REQUIRED by the OpenRTB specification if sourcetype is equal to 1.
           * </pre>
           *
           * <code>optional string vendor = 3;</code>
           * @return The bytes for vendor.
           */
          public com.google.protobuf.ByteString
              getVendorBytes() {
            java.lang.Object ref = vendor_;
            if (ref instanceof String) {
              com.google.protobuf.ByteString b = 
                  com.google.protobuf.ByteString.copyFromUtf8(
                      (java.lang.String) ref);
              vendor_ = b;
              return b;
            } else {
              return (com.google.protobuf.ByteString) ref;
            }
          }
          /**
           * <pre>
           * The top level business domain name of the measurement vendor providing
           * the quantity measurement.
           * REQUIRED by the OpenRTB specification if sourcetype is equal to 1.
           * </pre>
           *
           * <code>optional string vendor = 3;</code>
           * @param value The vendor to set.
           * @return This builder for chaining.
           */
          public Builder setVendor(
              java.lang.String value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
            vendor_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * The top level business domain name of the measurement vendor providing
           * the quantity measurement.
           * REQUIRED by the OpenRTB specification if sourcetype is equal to 1.
           * </pre>
           *
           * <code>optional string vendor = 3;</code>
           * @return This builder for chaining.
           */
          public Builder clearVendor() {
            bitField0_ = (bitField0_ & ~0x00000004);
            vendor_ = getDefaultInstance().getVendor();
            onChanged();
            return this;
          }
          /**
           * <pre>
           * The top level business domain name of the measurement vendor providing
           * the quantity measurement.
           * REQUIRED by the OpenRTB specification if sourcetype is equal to 1.
           * </pre>
           *
           * <code>optional string vendor = 3;</code>
           * @param value The bytes for vendor to set.
           * @return This builder for chaining.
           */
          public Builder setVendorBytes(
              com.google.protobuf.ByteString value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
            vendor_ = value;
            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:com.iabtechlab.openrtb.v2.BidRequest.Imp.Qty)
        }

        // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.BidRequest.Imp.Qty)
        private static final com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty DEFAULT_INSTANCE;
        static {
          DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty();
        }

        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty getDefaultInstance() {
          return DEFAULT_INSTANCE;
        }

        @java.lang.Deprecated public static final com.google.protobuf.Parser<Qty>
            PARSER = new com.google.protobuf.AbstractParser<Qty>() {
          @java.lang.Override
          public Qty parsePartialFrom(
              com.google.protobuf.CodedInputStream input,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.protobuf.InvalidProtocolBufferException {
            return new Qty(input, extensionRegistry);
          }
        };

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

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

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty getDefaultInstanceForType() {
          return DEFAULT_INSTANCE;
        }

      }

      public interface RefreshOrBuilder extends
          // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh)
          com.google.protobuf.GeneratedMessageV3.
              ExtendableMessageOrBuilder<Refresh> {

        /**
         * <pre>
         * A RefSettings object describing the mechanics of how an ad placement
         * automatically refreshes.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh.RefSettings refsettings = 1;</code>
         */
        java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings> 
            getRefsettingsList();
        /**
         * <pre>
         * A RefSettings object describing the mechanics of how an ad placement
         * automatically refreshes.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh.RefSettings refsettings = 1;</code>
         */
        com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings getRefsettings(int index);
        /**
         * <pre>
         * A RefSettings object describing the mechanics of how an ad placement
         * automatically refreshes.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh.RefSettings refsettings = 1;</code>
         */
        int getRefsettingsCount();
        /**
         * <pre>
         * A RefSettings object describing the mechanics of how an ad placement
         * automatically refreshes.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh.RefSettings refsettings = 1;</code>
         */
        java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettingsOrBuilder> 
            getRefsettingsOrBuilderList();
        /**
         * <pre>
         * A RefSettings object describing the mechanics of how an ad placement
         * automatically refreshes.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh.RefSettings refsettings = 1;</code>
         */
        com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettingsOrBuilder getRefsettingsOrBuilder(
            int index);

        /**
         * <pre>
         * The number of times this ad slot had been refreshed since last page
         * load.
         * </pre>
         *
         * <code>optional int32 count = 2;</code>
         * @return Whether the count field is set.
         */
        boolean hasCount();
        /**
         * <pre>
         * The number of times this ad slot had been refreshed since last page
         * load.
         * </pre>
         *
         * <code>optional int32 count = 2;</code>
         * @return The count.
         */
        int getCount();
      }
      /**
       * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh}
       */
      public static final class Refresh extends
          com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
            Refresh> implements
          // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh)
          RefreshOrBuilder {
      private static final long serialVersionUID = 0L;
        // Use Refresh.newBuilder() to construct.
        private Refresh(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh, ?> builder) {
          super(builder);
        }
        private Refresh() {
          refsettings_ = java.util.Collections.emptyList();
        }

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

        @java.lang.Override
        public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
          return this.unknownFields;
        }
        private Refresh(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          this();
          if (extensionRegistry == null) {
            throw new java.lang.NullPointerException();
          }
          int mutable_bitField0_ = 0;
          com.google.protobuf.UnknownFieldSet.Builder unknownFields =
              com.google.protobuf.UnknownFieldSet.newBuilder();
          try {
            boolean done = false;
            while (!done) {
              int tag = input.readTag();
              switch (tag) {
                case 0:
                  done = true;
                  break;
                case 10: {
                  if (!((mutable_bitField0_ & 0x00000001) != 0)) {
                    refsettings_ = new java.util.ArrayList<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings>();
                    mutable_bitField0_ |= 0x00000001;
                  }
                  refsettings_.add(
                      input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings.PARSER, extensionRegistry));
                  break;
                }
                case 16: {
                  bitField0_ |= 0x00000001;
                  count_ = input.readInt32();
                  break;
                }
                default: {
                  if (!parseUnknownField(
                      input, unknownFields, extensionRegistry, tag)) {
                    done = true;
                  }
                  break;
                }
              }
            }
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            throw e.setUnfinishedMessage(this);
          } catch (java.io.IOException e) {
            throw new com.google.protobuf.InvalidProtocolBufferException(
                e).setUnfinishedMessage(this);
          } finally {
            if (((mutable_bitField0_ & 0x00000001) != 0)) {
              refsettings_ = java.util.Collections.unmodifiableList(refsettings_);
            }
            this.unknownFields = unknownFields.build();
            makeExtensionsImmutable();
          }
        }
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Refresh_descriptor;
        }

        @java.lang.Override
        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Refresh_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.Builder.class);
        }

        public interface RefSettingsOrBuilder extends
            // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh.RefSettings)
            com.google.protobuf.GeneratedMessageV3.
                ExtendableMessageOrBuilder<RefSettings> {

          /**
           * <pre>
           * The type of the declared auto refresh.
           * </pre>
           *
           * <code>optional int32 reftype = 1 [default = 0];</code>
           * @return Whether the reftype field is set.
           */
          boolean hasReftype();
          /**
           * <pre>
           * The type of the declared auto refresh.
           * </pre>
           *
           * <code>optional int32 reftype = 1 [default = 0];</code>
           * @return The reftype.
           */
          int getReftype();

          /**
           * <pre>
           * The minimum refresh interval in seconds. This applies to all refresh
           * types. This is the (uninterrupted) time the ad creative will be
           * rendered before refreshing to the next creative. If the field is
           * absent, the exposure time is unknown. This field does not account for
           * viewability or external factors such as a user leaving a page.
           * </pre>
           *
           * <code>optional int32 minint = 2;</code>
           * @return Whether the minint field is set.
           */
          boolean hasMinint();
          /**
           * <pre>
           * The minimum refresh interval in seconds. This applies to all refresh
           * types. This is the (uninterrupted) time the ad creative will be
           * rendered before refreshing to the next creative. If the field is
           * absent, the exposure time is unknown. This field does not account for
           * viewability or external factors such as a user leaving a page.
           * </pre>
           *
           * <code>optional int32 minint = 2;</code>
           * @return The minint.
           */
          int getMinint();
        }
        /**
         * <pre>
         * Information on how often and what triggers an ad slot being refreshed.
         * </pre>
         *
         * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh.RefSettings}
         */
        public static final class RefSettings extends
            com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
              RefSettings> implements
            // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh.RefSettings)
            RefSettingsOrBuilder {
        private static final long serialVersionUID = 0L;
          // Use RefSettings.newBuilder() to construct.
          private RefSettings(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings, ?> builder) {
            super(builder);
          }
          private RefSettings() {
          }

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

          @java.lang.Override
          public final com.google.protobuf.UnknownFieldSet
          getUnknownFields() {
            return this.unknownFields;
          }
          private RefSettings(
              com.google.protobuf.CodedInputStream input,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.protobuf.InvalidProtocolBufferException {
            this();
            if (extensionRegistry == null) {
              throw new java.lang.NullPointerException();
            }
            int mutable_bitField0_ = 0;
            com.google.protobuf.UnknownFieldSet.Builder unknownFields =
                com.google.protobuf.UnknownFieldSet.newBuilder();
            try {
              boolean done = false;
              while (!done) {
                int tag = input.readTag();
                switch (tag) {
                  case 0:
                    done = true;
                    break;
                  case 8: {
                    bitField0_ |= 0x00000001;
                    reftype_ = input.readInt32();
                    break;
                  }
                  case 16: {
                    bitField0_ |= 0x00000002;
                    minint_ = input.readInt32();
                    break;
                  }
                  default: {
                    if (!parseUnknownField(
                        input, unknownFields, extensionRegistry, tag)) {
                      done = true;
                    }
                    break;
                  }
                }
              }
            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
              throw e.setUnfinishedMessage(this);
            } catch (java.io.IOException e) {
              throw new com.google.protobuf.InvalidProtocolBufferException(
                  e).setUnfinishedMessage(this);
            } finally {
              this.unknownFields = unknownFields.build();
              makeExtensionsImmutable();
            }
          }
          public static final com.google.protobuf.Descriptors.Descriptor
              getDescriptor() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Refresh_RefSettings_descriptor;
          }

          @java.lang.Override
          protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
              internalGetFieldAccessorTable() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Refresh_RefSettings_fieldAccessorTable
                .ensureFieldAccessorsInitialized(
                    com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings.Builder.class);
          }

          private int bitField0_;
          public static final int REFTYPE_FIELD_NUMBER = 1;
          private int reftype_;
          /**
           * <pre>
           * The type of the declared auto refresh.
           * </pre>
           *
           * <code>optional int32 reftype = 1 [default = 0];</code>
           * @return Whether the reftype field is set.
           */
          @java.lang.Override
          public boolean hasReftype() {
            return ((bitField0_ & 0x00000001) != 0);
          }
          /**
           * <pre>
           * The type of the declared auto refresh.
           * </pre>
           *
           * <code>optional int32 reftype = 1 [default = 0];</code>
           * @return The reftype.
           */
          @java.lang.Override
          public int getReftype() {
            return reftype_;
          }

          public static final int MININT_FIELD_NUMBER = 2;
          private int minint_;
          /**
           * <pre>
           * The minimum refresh interval in seconds. This applies to all refresh
           * types. This is the (uninterrupted) time the ad creative will be
           * rendered before refreshing to the next creative. If the field is
           * absent, the exposure time is unknown. This field does not account for
           * viewability or external factors such as a user leaving a page.
           * </pre>
           *
           * <code>optional int32 minint = 2;</code>
           * @return Whether the minint field is set.
           */
          @java.lang.Override
          public boolean hasMinint() {
            return ((bitField0_ & 0x00000002) != 0);
          }
          /**
           * <pre>
           * The minimum refresh interval in seconds. This applies to all refresh
           * types. This is the (uninterrupted) time the ad creative will be
           * rendered before refreshing to the next creative. If the field is
           * absent, the exposure time is unknown. This field does not account for
           * viewability or external factors such as a user leaving a page.
           * </pre>
           *
           * <code>optional int32 minint = 2;</code>
           * @return The minint.
           */
          @java.lang.Override
          public int getMinint() {
            return minint_;
          }

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

            if (!extensionsAreInitialized()) {
              memoizedIsInitialized = 0;
              return false;
            }
            memoizedIsInitialized = 1;
            return true;
          }

          @java.lang.Override
          public void writeTo(com.google.protobuf.CodedOutputStream output)
                              throws java.io.IOException {
            com.google.protobuf.GeneratedMessageV3
              .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings>.ExtensionWriter
                extensionWriter = newExtensionWriter();
            if (((bitField0_ & 0x00000001) != 0)) {
              output.writeInt32(1, reftype_);
            }
            if (((bitField0_ & 0x00000002) != 0)) {
              output.writeInt32(2, minint_);
            }
            extensionWriter.writeUntil(10000, output);
            unknownFields.writeTo(output);
          }

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

            size = 0;
            if (((bitField0_ & 0x00000001) != 0)) {
              size += com.google.protobuf.CodedOutputStream
                .computeInt32Size(1, reftype_);
            }
            if (((bitField0_ & 0x00000002) != 0)) {
              size += com.google.protobuf.CodedOutputStream
                .computeInt32Size(2, minint_);
            }
            size += extensionsSerializedSize();
            size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings)) {
              return super.equals(obj);
            }
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings other = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings) obj;

            if (hasReftype() != other.hasReftype()) return false;
            if (hasReftype()) {
              if (getReftype()
                  != other.getReftype()) return false;
            }
            if (hasMinint() != other.hasMinint()) return false;
            if (hasMinint()) {
              if (getMinint()
                  != other.getMinint()) return false;
            }
            if (!unknownFields.equals(other.unknownFields)) return false;
            if (!getExtensionFields().equals(other.getExtensionFields()))
              return false;
            return true;
          }

          @java.lang.Override
          public int hashCode() {
            if (memoizedHashCode != 0) {
              return memoizedHashCode;
            }
            int hash = 41;
            hash = (19 * hash) + getDescriptor().hashCode();
            if (hasReftype()) {
              hash = (37 * hash) + REFTYPE_FIELD_NUMBER;
              hash = (53 * hash) + getReftype();
            }
            if (hasMinint()) {
              hash = (37 * hash) + MININT_FIELD_NUMBER;
              hash = (53 * hash) + getMinint();
            }
            hash = hashFields(hash, getExtensionFields());
            hash = (29 * hash) + unknownFields.hashCode();
            memoizedHashCode = hash;
            return hash;
          }

          public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings parseFrom(
              java.nio.ByteBuffer data)
              throws com.google.protobuf.InvalidProtocolBufferException {
            return PARSER.parseFrom(data);
          }
          public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings parseFrom(
              java.nio.ByteBuffer data,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.protobuf.InvalidProtocolBufferException {
            return PARSER.parseFrom(data, extensionRegistry);
          }
          public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings parseFrom(
              com.google.protobuf.ByteString data)
              throws com.google.protobuf.InvalidProtocolBufferException {
            return PARSER.parseFrom(data);
          }
          public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings parseFrom(
              com.google.protobuf.ByteString data,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.protobuf.InvalidProtocolBufferException {
            return PARSER.parseFrom(data, extensionRegistry);
          }
          public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings parseFrom(byte[] data)
              throws com.google.protobuf.InvalidProtocolBufferException {
            return PARSER.parseFrom(data);
          }
          public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings parseFrom(
              byte[] data,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.protobuf.InvalidProtocolBufferException {
            return PARSER.parseFrom(data, extensionRegistry);
          }
          public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings parseFrom(java.io.InputStream input)
              throws java.io.IOException {
            return com.google.protobuf.GeneratedMessageV3
                .parseWithIOException(PARSER, input);
          }
          public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings parseDelimitedFrom(java.io.InputStream input)
              throws java.io.IOException {
            return com.google.protobuf.GeneratedMessageV3
                .parseDelimitedWithIOException(PARSER, input);
          }
          public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings parseFrom(
              com.google.protobuf.CodedInputStream input)
              throws java.io.IOException {
            return com.google.protobuf.GeneratedMessageV3
                .parseWithIOException(PARSER, input);
          }
          public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings 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>
           * Information on how often and what triggers an ad slot being refreshed.
           * </pre>
           *
           * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh.RefSettings}
           */
          public static final class Builder extends
              com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings, Builder> implements
              // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh.RefSettings)
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettingsOrBuilder {
            public static final com.google.protobuf.Descriptors.Descriptor
                getDescriptor() {
              return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Refresh_RefSettings_descriptor;
            }

            @java.lang.Override
            protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
                internalGetFieldAccessorTable() {
              return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Refresh_RefSettings_fieldAccessorTable
                  .ensureFieldAccessorsInitialized(
                      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings.Builder.class);
            }

            // Construct using com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings.newBuilder()
            private Builder() {
              maybeForceBuilderInitialization();
            }

            private Builder(
                com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
              super(parent);
              maybeForceBuilderInitialization();
            }
            private void maybeForceBuilderInitialization() {
              if (com.google.protobuf.GeneratedMessageV3
                      .alwaysUseFieldBuilders) {
              }
            }
            @java.lang.Override
            public Builder clear() {
              super.clear();
              reftype_ = 0;
              bitField0_ = (bitField0_ & ~0x00000001);
              minint_ = 0;
              bitField0_ = (bitField0_ & ~0x00000002);
              return this;
            }

            @java.lang.Override
            public com.google.protobuf.Descriptors.Descriptor
                getDescriptorForType() {
              return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Refresh_RefSettings_descriptor;
            }

            @java.lang.Override
            public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings getDefaultInstanceForType() {
              return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings.getDefaultInstance();
            }

            @java.lang.Override
            public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings build() {
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings result = buildPartial();
              if (!result.isInitialized()) {
                throw newUninitializedMessageException(result);
              }
              return result;
            }

            @java.lang.Override
            public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings buildPartial() {
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings result = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings(this);
              int from_bitField0_ = bitField0_;
              int to_bitField0_ = 0;
              if (((from_bitField0_ & 0x00000001) != 0)) {
                result.reftype_ = reftype_;
                to_bitField0_ |= 0x00000001;
              }
              if (((from_bitField0_ & 0x00000002) != 0)) {
                result.minint_ = minint_;
                to_bitField0_ |= 0x00000002;
              }
              result.bitField0_ = to_bitField0_;
              onBuilt();
              return result;
            }

            @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 <Type> Builder setExtension(
                com.google.protobuf.GeneratedMessage.GeneratedExtension<
                    com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings, Type> extension,
                Type value) {
              return super.setExtension(extension, value);
            }
            @java.lang.Override
            public <Type> Builder setExtension(
                com.google.protobuf.GeneratedMessage.GeneratedExtension<
                    com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings, java.util.List<Type>> extension,
                int index, Type value) {
              return super.setExtension(extension, index, value);
            }
            @java.lang.Override
            public <Type> Builder addExtension(
                com.google.protobuf.GeneratedMessage.GeneratedExtension<
                    com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings, java.util.List<Type>> extension,
                Type value) {
              return super.addExtension(extension, value);
            }
            @java.lang.Override
            public <Type> Builder clearExtension(
                com.google.protobuf.GeneratedMessage.GeneratedExtension<
                    com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings, ?> extension) {
              return super.clearExtension(extension);
            }
            @java.lang.Override
            public Builder mergeFrom(com.google.protobuf.Message other) {
              if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings) {
                return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings)other);
              } else {
                super.mergeFrom(other);
                return this;
              }
            }

            public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings other) {
              if (other == com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings.getDefaultInstance()) return this;
              if (other.hasReftype()) {
                setReftype(other.getReftype());
              }
              if (other.hasMinint()) {
                setMinint(other.getMinint());
              }
              this.mergeExtensionFields(other);
              this.mergeUnknownFields(other.unknownFields);
              onChanged();
              return this;
            }

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

            @java.lang.Override
            public Builder mergeFrom(
                com.google.protobuf.CodedInputStream input,
                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
                throws java.io.IOException {
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings parsedMessage = null;
              try {
                parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
              } catch (com.google.protobuf.InvalidProtocolBufferException e) {
                parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings) e.getUnfinishedMessage();
                throw e.unwrapIOException();
              } finally {
                if (parsedMessage != null) {
                  mergeFrom(parsedMessage);
                }
              }
              return this;
            }
            private int bitField0_;

            private int reftype_ ;
            /**
             * <pre>
             * The type of the declared auto refresh.
             * </pre>
             *
             * <code>optional int32 reftype = 1 [default = 0];</code>
             * @return Whether the reftype field is set.
             */
            @java.lang.Override
            public boolean hasReftype() {
              return ((bitField0_ & 0x00000001) != 0);
            }
            /**
             * <pre>
             * The type of the declared auto refresh.
             * </pre>
             *
             * <code>optional int32 reftype = 1 [default = 0];</code>
             * @return The reftype.
             */
            @java.lang.Override
            public int getReftype() {
              return reftype_;
            }
            /**
             * <pre>
             * The type of the declared auto refresh.
             * </pre>
             *
             * <code>optional int32 reftype = 1 [default = 0];</code>
             * @param value The reftype to set.
             * @return This builder for chaining.
             */
            public Builder setReftype(int value) {
              bitField0_ |= 0x00000001;
              reftype_ = value;
              onChanged();
              return this;
            }
            /**
             * <pre>
             * The type of the declared auto refresh.
             * </pre>
             *
             * <code>optional int32 reftype = 1 [default = 0];</code>
             * @return This builder for chaining.
             */
            public Builder clearReftype() {
              bitField0_ = (bitField0_ & ~0x00000001);
              reftype_ = 0;
              onChanged();
              return this;
            }

            private int minint_ ;
            /**
             * <pre>
             * The minimum refresh interval in seconds. This applies to all refresh
             * types. This is the (uninterrupted) time the ad creative will be
             * rendered before refreshing to the next creative. If the field is
             * absent, the exposure time is unknown. This field does not account for
             * viewability or external factors such as a user leaving a page.
             * </pre>
             *
             * <code>optional int32 minint = 2;</code>
             * @return Whether the minint field is set.
             */
            @java.lang.Override
            public boolean hasMinint() {
              return ((bitField0_ & 0x00000002) != 0);
            }
            /**
             * <pre>
             * The minimum refresh interval in seconds. This applies to all refresh
             * types. This is the (uninterrupted) time the ad creative will be
             * rendered before refreshing to the next creative. If the field is
             * absent, the exposure time is unknown. This field does not account for
             * viewability or external factors such as a user leaving a page.
             * </pre>
             *
             * <code>optional int32 minint = 2;</code>
             * @return The minint.
             */
            @java.lang.Override
            public int getMinint() {
              return minint_;
            }
            /**
             * <pre>
             * The minimum refresh interval in seconds. This applies to all refresh
             * types. This is the (uninterrupted) time the ad creative will be
             * rendered before refreshing to the next creative. If the field is
             * absent, the exposure time is unknown. This field does not account for
             * viewability or external factors such as a user leaving a page.
             * </pre>
             *
             * <code>optional int32 minint = 2;</code>
             * @param value The minint to set.
             * @return This builder for chaining.
             */
            public Builder setMinint(int value) {
              bitField0_ |= 0x00000002;
              minint_ = value;
              onChanged();
              return this;
            }
            /**
             * <pre>
             * The minimum refresh interval in seconds. This applies to all refresh
             * types. This is the (uninterrupted) time the ad creative will be
             * rendered before refreshing to the next creative. If the field is
             * absent, the exposure time is unknown. This field does not account for
             * viewability or external factors such as a user leaving a page.
             * </pre>
             *
             * <code>optional int32 minint = 2;</code>
             * @return This builder for chaining.
             */
            public Builder clearMinint() {
              bitField0_ = (bitField0_ & ~0x00000002);
              minint_ = 0;
              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:com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh.RefSettings)
          }

          // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh.RefSettings)
          private static final com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings DEFAULT_INSTANCE;
          static {
            DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings();
          }

          public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings getDefaultInstance() {
            return DEFAULT_INSTANCE;
          }

          @java.lang.Deprecated public static final com.google.protobuf.Parser<RefSettings>
              PARSER = new com.google.protobuf.AbstractParser<RefSettings>() {
            @java.lang.Override
            public RefSettings parsePartialFrom(
                com.google.protobuf.CodedInputStream input,
                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
                throws com.google.protobuf.InvalidProtocolBufferException {
              return new RefSettings(input, extensionRegistry);
            }
          };

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

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

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings getDefaultInstanceForType() {
            return DEFAULT_INSTANCE;
          }

        }

        private int bitField0_;
        public static final int REFSETTINGS_FIELD_NUMBER = 1;
        private java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings> refsettings_;
        /**
         * <pre>
         * A RefSettings object describing the mechanics of how an ad placement
         * automatically refreshes.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh.RefSettings refsettings = 1;</code>
         */
        @java.lang.Override
        public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings> getRefsettingsList() {
          return refsettings_;
        }
        /**
         * <pre>
         * A RefSettings object describing the mechanics of how an ad placement
         * automatically refreshes.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh.RefSettings refsettings = 1;</code>
         */
        @java.lang.Override
        public java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettingsOrBuilder> 
            getRefsettingsOrBuilderList() {
          return refsettings_;
        }
        /**
         * <pre>
         * A RefSettings object describing the mechanics of how an ad placement
         * automatically refreshes.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh.RefSettings refsettings = 1;</code>
         */
        @java.lang.Override
        public int getRefsettingsCount() {
          return refsettings_.size();
        }
        /**
         * <pre>
         * A RefSettings object describing the mechanics of how an ad placement
         * automatically refreshes.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh.RefSettings refsettings = 1;</code>
         */
        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings getRefsettings(int index) {
          return refsettings_.get(index);
        }
        /**
         * <pre>
         * A RefSettings object describing the mechanics of how an ad placement
         * automatically refreshes.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh.RefSettings refsettings = 1;</code>
         */
        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettingsOrBuilder getRefsettingsOrBuilder(
            int index) {
          return refsettings_.get(index);
        }

        public static final int COUNT_FIELD_NUMBER = 2;
        private int count_;
        /**
         * <pre>
         * The number of times this ad slot had been refreshed since last page
         * load.
         * </pre>
         *
         * <code>optional int32 count = 2;</code>
         * @return Whether the count field is set.
         */
        @java.lang.Override
        public boolean hasCount() {
          return ((bitField0_ & 0x00000001) != 0);
        }
        /**
         * <pre>
         * The number of times this ad slot had been refreshed since last page
         * load.
         * </pre>
         *
         * <code>optional int32 count = 2;</code>
         * @return The count.
         */
        @java.lang.Override
        public int getCount() {
          return count_;
        }

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

          for (int i = 0; i < getRefsettingsCount(); i++) {
            if (!getRefsettings(i).isInitialized()) {
              memoizedIsInitialized = 0;
              return false;
            }
          }
          if (!extensionsAreInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
          memoizedIsInitialized = 1;
          return true;
        }

        @java.lang.Override
        public void writeTo(com.google.protobuf.CodedOutputStream output)
                            throws java.io.IOException {
          com.google.protobuf.GeneratedMessageV3
            .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh>.ExtensionWriter
              extensionWriter = newExtensionWriter();
          for (int i = 0; i < refsettings_.size(); i++) {
            output.writeMessage(1, refsettings_.get(i));
          }
          if (((bitField0_ & 0x00000001) != 0)) {
            output.writeInt32(2, count_);
          }
          extensionWriter.writeUntil(10000, output);
          unknownFields.writeTo(output);
        }

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

          size = 0;
          for (int i = 0; i < refsettings_.size(); i++) {
            size += com.google.protobuf.CodedOutputStream
              .computeMessageSize(1, refsettings_.get(i));
          }
          if (((bitField0_ & 0x00000001) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(2, count_);
          }
          size += extensionsSerializedSize();
          size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh)) {
            return super.equals(obj);
          }
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh other = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh) obj;

          if (!getRefsettingsList()
              .equals(other.getRefsettingsList())) return false;
          if (hasCount() != other.hasCount()) return false;
          if (hasCount()) {
            if (getCount()
                != other.getCount()) return false;
          }
          if (!unknownFields.equals(other.unknownFields)) return false;
          if (!getExtensionFields().equals(other.getExtensionFields()))
            return false;
          return true;
        }

        @java.lang.Override
        public int hashCode() {
          if (memoizedHashCode != 0) {
            return memoizedHashCode;
          }
          int hash = 41;
          hash = (19 * hash) + getDescriptor().hashCode();
          if (getRefsettingsCount() > 0) {
            hash = (37 * hash) + REFSETTINGS_FIELD_NUMBER;
            hash = (53 * hash) + getRefsettingsList().hashCode();
          }
          if (hasCount()) {
            hash = (37 * hash) + COUNT_FIELD_NUMBER;
            hash = (53 * hash) + getCount();
          }
          hash = hashFields(hash, getExtensionFields());
          hash = (29 * hash) + unknownFields.hashCode();
          memoizedHashCode = hash;
          return hash;
        }

        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh parseFrom(
            java.nio.ByteBuffer data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh parseFrom(
            java.nio.ByteBuffer data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh parseFrom(
            com.google.protobuf.ByteString data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh parseFrom(
            com.google.protobuf.ByteString data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh parseFrom(byte[] data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh parseFrom(
            byte[] data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh parseFrom(java.io.InputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh parseDelimitedFrom(java.io.InputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseDelimitedWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh parseFrom(
            com.google.protobuf.CodedInputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh 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;
        }
        /**
         * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh}
         */
        public static final class Builder extends
            com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh, Builder> implements
            // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh)
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.RefreshOrBuilder {
          public static final com.google.protobuf.Descriptors.Descriptor
              getDescriptor() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Refresh_descriptor;
          }

          @java.lang.Override
          protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
              internalGetFieldAccessorTable() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Refresh_fieldAccessorTable
                .ensureFieldAccessorsInitialized(
                    com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.Builder.class);
          }

          // Construct using com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.newBuilder()
          private Builder() {
            maybeForceBuilderInitialization();
          }

          private Builder(
              com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
            super(parent);
            maybeForceBuilderInitialization();
          }
          private void maybeForceBuilderInitialization() {
            if (com.google.protobuf.GeneratedMessageV3
                    .alwaysUseFieldBuilders) {
              getRefsettingsFieldBuilder();
            }
          }
          @java.lang.Override
          public Builder clear() {
            super.clear();
            if (refsettingsBuilder_ == null) {
              refsettings_ = java.util.Collections.emptyList();
              bitField0_ = (bitField0_ & ~0x00000001);
            } else {
              refsettingsBuilder_.clear();
            }
            count_ = 0;
            bitField0_ = (bitField0_ & ~0x00000002);
            return this;
          }

          @java.lang.Override
          public com.google.protobuf.Descriptors.Descriptor
              getDescriptorForType() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Refresh_descriptor;
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh getDefaultInstanceForType() {
            return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.getDefaultInstance();
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh build() {
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh result = buildPartial();
            if (!result.isInitialized()) {
              throw newUninitializedMessageException(result);
            }
            return result;
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh buildPartial() {
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh result = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh(this);
            int from_bitField0_ = bitField0_;
            int to_bitField0_ = 0;
            if (refsettingsBuilder_ == null) {
              if (((bitField0_ & 0x00000001) != 0)) {
                refsettings_ = java.util.Collections.unmodifiableList(refsettings_);
                bitField0_ = (bitField0_ & ~0x00000001);
              }
              result.refsettings_ = refsettings_;
            } else {
              result.refsettings_ = refsettingsBuilder_.build();
            }
            if (((from_bitField0_ & 0x00000002) != 0)) {
              result.count_ = count_;
              to_bitField0_ |= 0x00000001;
            }
            result.bitField0_ = to_bitField0_;
            onBuilt();
            return result;
          }

          @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 <Type> Builder setExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh, Type> extension,
              Type value) {
            return super.setExtension(extension, value);
          }
          @java.lang.Override
          public <Type> Builder setExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh, java.util.List<Type>> extension,
              int index, Type value) {
            return super.setExtension(extension, index, value);
          }
          @java.lang.Override
          public <Type> Builder addExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh, java.util.List<Type>> extension,
              Type value) {
            return super.addExtension(extension, value);
          }
          @java.lang.Override
          public <Type> Builder clearExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh, ?> extension) {
            return super.clearExtension(extension);
          }
          @java.lang.Override
          public Builder mergeFrom(com.google.protobuf.Message other) {
            if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh) {
              return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh)other);
            } else {
              super.mergeFrom(other);
              return this;
            }
          }

          public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh other) {
            if (other == com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.getDefaultInstance()) return this;
            if (refsettingsBuilder_ == null) {
              if (!other.refsettings_.isEmpty()) {
                if (refsettings_.isEmpty()) {
                  refsettings_ = other.refsettings_;
                  bitField0_ = (bitField0_ & ~0x00000001);
                } else {
                  ensureRefsettingsIsMutable();
                  refsettings_.addAll(other.refsettings_);
                }
                onChanged();
              }
            } else {
              if (!other.refsettings_.isEmpty()) {
                if (refsettingsBuilder_.isEmpty()) {
                  refsettingsBuilder_.dispose();
                  refsettingsBuilder_ = null;
                  refsettings_ = other.refsettings_;
                  bitField0_ = (bitField0_ & ~0x00000001);
                  refsettingsBuilder_ = 
                    com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
                       getRefsettingsFieldBuilder() : null;
                } else {
                  refsettingsBuilder_.addAllMessages(other.refsettings_);
                }
              }
            }
            if (other.hasCount()) {
              setCount(other.getCount());
            }
            this.mergeExtensionFields(other);
            this.mergeUnknownFields(other.unknownFields);
            onChanged();
            return this;
          }

          @java.lang.Override
          public final boolean isInitialized() {
            for (int i = 0; i < getRefsettingsCount(); i++) {
              if (!getRefsettings(i).isInitialized()) {
                return false;
              }
            }
            if (!extensionsAreInitialized()) {
              return false;
            }
            return true;
          }

          @java.lang.Override
          public Builder mergeFrom(
              com.google.protobuf.CodedInputStream input,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh parsedMessage = null;
            try {
              parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
              parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh) e.getUnfinishedMessage();
              throw e.unwrapIOException();
            } finally {
              if (parsedMessage != null) {
                mergeFrom(parsedMessage);
              }
            }
            return this;
          }
          private int bitField0_;

          private java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings> refsettings_ =
            java.util.Collections.emptyList();
          private void ensureRefsettingsIsMutable() {
            if (!((bitField0_ & 0x00000001) != 0)) {
              refsettings_ = new java.util.ArrayList<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings>(refsettings_);
              bitField0_ |= 0x00000001;
             }
          }

          private com.google.protobuf.RepeatedFieldBuilderV3<
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettingsOrBuilder> refsettingsBuilder_;

          /**
           * <pre>
           * A RefSettings object describing the mechanics of how an ad placement
           * automatically refreshes.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh.RefSettings refsettings = 1;</code>
           */
          public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings> getRefsettingsList() {
            if (refsettingsBuilder_ == null) {
              return java.util.Collections.unmodifiableList(refsettings_);
            } else {
              return refsettingsBuilder_.getMessageList();
            }
          }
          /**
           * <pre>
           * A RefSettings object describing the mechanics of how an ad placement
           * automatically refreshes.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh.RefSettings refsettings = 1;</code>
           */
          public int getRefsettingsCount() {
            if (refsettingsBuilder_ == null) {
              return refsettings_.size();
            } else {
              return refsettingsBuilder_.getCount();
            }
          }
          /**
           * <pre>
           * A RefSettings object describing the mechanics of how an ad placement
           * automatically refreshes.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh.RefSettings refsettings = 1;</code>
           */
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings getRefsettings(int index) {
            if (refsettingsBuilder_ == null) {
              return refsettings_.get(index);
            } else {
              return refsettingsBuilder_.getMessage(index);
            }
          }
          /**
           * <pre>
           * A RefSettings object describing the mechanics of how an ad placement
           * automatically refreshes.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh.RefSettings refsettings = 1;</code>
           */
          public Builder setRefsettings(
              int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings value) {
            if (refsettingsBuilder_ == null) {
              if (value == null) {
                throw new NullPointerException();
              }
              ensureRefsettingsIsMutable();
              refsettings_.set(index, value);
              onChanged();
            } else {
              refsettingsBuilder_.setMessage(index, value);
            }
            return this;
          }
          /**
           * <pre>
           * A RefSettings object describing the mechanics of how an ad placement
           * automatically refreshes.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh.RefSettings refsettings = 1;</code>
           */
          public Builder setRefsettings(
              int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings.Builder builderForValue) {
            if (refsettingsBuilder_ == null) {
              ensureRefsettingsIsMutable();
              refsettings_.set(index, builderForValue.build());
              onChanged();
            } else {
              refsettingsBuilder_.setMessage(index, builderForValue.build());
            }
            return this;
          }
          /**
           * <pre>
           * A RefSettings object describing the mechanics of how an ad placement
           * automatically refreshes.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh.RefSettings refsettings = 1;</code>
           */
          public Builder addRefsettings(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings value) {
            if (refsettingsBuilder_ == null) {
              if (value == null) {
                throw new NullPointerException();
              }
              ensureRefsettingsIsMutable();
              refsettings_.add(value);
              onChanged();
            } else {
              refsettingsBuilder_.addMessage(value);
            }
            return this;
          }
          /**
           * <pre>
           * A RefSettings object describing the mechanics of how an ad placement
           * automatically refreshes.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh.RefSettings refsettings = 1;</code>
           */
          public Builder addRefsettings(
              int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings value) {
            if (refsettingsBuilder_ == null) {
              if (value == null) {
                throw new NullPointerException();
              }
              ensureRefsettingsIsMutable();
              refsettings_.add(index, value);
              onChanged();
            } else {
              refsettingsBuilder_.addMessage(index, value);
            }
            return this;
          }
          /**
           * <pre>
           * A RefSettings object describing the mechanics of how an ad placement
           * automatically refreshes.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh.RefSettings refsettings = 1;</code>
           */
          public Builder addRefsettings(
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings.Builder builderForValue) {
            if (refsettingsBuilder_ == null) {
              ensureRefsettingsIsMutable();
              refsettings_.add(builderForValue.build());
              onChanged();
            } else {
              refsettingsBuilder_.addMessage(builderForValue.build());
            }
            return this;
          }
          /**
           * <pre>
           * A RefSettings object describing the mechanics of how an ad placement
           * automatically refreshes.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh.RefSettings refsettings = 1;</code>
           */
          public Builder addRefsettings(
              int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings.Builder builderForValue) {
            if (refsettingsBuilder_ == null) {
              ensureRefsettingsIsMutable();
              refsettings_.add(index, builderForValue.build());
              onChanged();
            } else {
              refsettingsBuilder_.addMessage(index, builderForValue.build());
            }
            return this;
          }
          /**
           * <pre>
           * A RefSettings object describing the mechanics of how an ad placement
           * automatically refreshes.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh.RefSettings refsettings = 1;</code>
           */
          public Builder addAllRefsettings(
              java.lang.Iterable<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings> values) {
            if (refsettingsBuilder_ == null) {
              ensureRefsettingsIsMutable();
              com.google.protobuf.AbstractMessageLite.Builder.addAll(
                  values, refsettings_);
              onChanged();
            } else {
              refsettingsBuilder_.addAllMessages(values);
            }
            return this;
          }
          /**
           * <pre>
           * A RefSettings object describing the mechanics of how an ad placement
           * automatically refreshes.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh.RefSettings refsettings = 1;</code>
           */
          public Builder clearRefsettings() {
            if (refsettingsBuilder_ == null) {
              refsettings_ = java.util.Collections.emptyList();
              bitField0_ = (bitField0_ & ~0x00000001);
              onChanged();
            } else {
              refsettingsBuilder_.clear();
            }
            return this;
          }
          /**
           * <pre>
           * A RefSettings object describing the mechanics of how an ad placement
           * automatically refreshes.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh.RefSettings refsettings = 1;</code>
           */
          public Builder removeRefsettings(int index) {
            if (refsettingsBuilder_ == null) {
              ensureRefsettingsIsMutable();
              refsettings_.remove(index);
              onChanged();
            } else {
              refsettingsBuilder_.remove(index);
            }
            return this;
          }
          /**
           * <pre>
           * A RefSettings object describing the mechanics of how an ad placement
           * automatically refreshes.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh.RefSettings refsettings = 1;</code>
           */
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings.Builder getRefsettingsBuilder(
              int index) {
            return getRefsettingsFieldBuilder().getBuilder(index);
          }
          /**
           * <pre>
           * A RefSettings object describing the mechanics of how an ad placement
           * automatically refreshes.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh.RefSettings refsettings = 1;</code>
           */
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettingsOrBuilder getRefsettingsOrBuilder(
              int index) {
            if (refsettingsBuilder_ == null) {
              return refsettings_.get(index);  } else {
              return refsettingsBuilder_.getMessageOrBuilder(index);
            }
          }
          /**
           * <pre>
           * A RefSettings object describing the mechanics of how an ad placement
           * automatically refreshes.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh.RefSettings refsettings = 1;</code>
           */
          public java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettingsOrBuilder> 
               getRefsettingsOrBuilderList() {
            if (refsettingsBuilder_ != null) {
              return refsettingsBuilder_.getMessageOrBuilderList();
            } else {
              return java.util.Collections.unmodifiableList(refsettings_);
            }
          }
          /**
           * <pre>
           * A RefSettings object describing the mechanics of how an ad placement
           * automatically refreshes.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh.RefSettings refsettings = 1;</code>
           */
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings.Builder addRefsettingsBuilder() {
            return getRefsettingsFieldBuilder().addBuilder(
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings.getDefaultInstance());
          }
          /**
           * <pre>
           * A RefSettings object describing the mechanics of how an ad placement
           * automatically refreshes.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh.RefSettings refsettings = 1;</code>
           */
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings.Builder addRefsettingsBuilder(
              int index) {
            return getRefsettingsFieldBuilder().addBuilder(
                index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings.getDefaultInstance());
          }
          /**
           * <pre>
           * A RefSettings object describing the mechanics of how an ad placement
           * automatically refreshes.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh.RefSettings refsettings = 1;</code>
           */
          public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings.Builder> 
               getRefsettingsBuilderList() {
            return getRefsettingsFieldBuilder().getBuilderList();
          }
          private com.google.protobuf.RepeatedFieldBuilderV3<
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettingsOrBuilder> 
              getRefsettingsFieldBuilder() {
            if (refsettingsBuilder_ == null) {
              refsettingsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettings.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.RefSettingsOrBuilder>(
                      refsettings_,
                      ((bitField0_ & 0x00000001) != 0),
                      getParentForChildren(),
                      isClean());
              refsettings_ = null;
            }
            return refsettingsBuilder_;
          }

          private int count_ ;
          /**
           * <pre>
           * The number of times this ad slot had been refreshed since last page
           * load.
           * </pre>
           *
           * <code>optional int32 count = 2;</code>
           * @return Whether the count field is set.
           */
          @java.lang.Override
          public boolean hasCount() {
            return ((bitField0_ & 0x00000002) != 0);
          }
          /**
           * <pre>
           * The number of times this ad slot had been refreshed since last page
           * load.
           * </pre>
           *
           * <code>optional int32 count = 2;</code>
           * @return The count.
           */
          @java.lang.Override
          public int getCount() {
            return count_;
          }
          /**
           * <pre>
           * The number of times this ad slot had been refreshed since last page
           * load.
           * </pre>
           *
           * <code>optional int32 count = 2;</code>
           * @param value The count to set.
           * @return This builder for chaining.
           */
          public Builder setCount(int value) {
            bitField0_ |= 0x00000002;
            count_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * The number of times this ad slot had been refreshed since last page
           * load.
           * </pre>
           *
           * <code>optional int32 count = 2;</code>
           * @return This builder for chaining.
           */
          public Builder clearCount() {
            bitField0_ = (bitField0_ & ~0x00000002);
            count_ = 0;
            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:com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh)
        }

        // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh)
        private static final com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh DEFAULT_INSTANCE;
        static {
          DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh();
        }

        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh getDefaultInstance() {
          return DEFAULT_INSTANCE;
        }

        @java.lang.Deprecated public static final com.google.protobuf.Parser<Refresh>
            PARSER = new com.google.protobuf.AbstractParser<Refresh>() {
          @java.lang.Override
          public Refresh parsePartialFrom(
              com.google.protobuf.CodedInputStream input,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.protobuf.InvalidProtocolBufferException {
            return new Refresh(input, extensionRegistry);
          }
        };

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

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

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh getDefaultInstanceForType() {
          return DEFAULT_INSTANCE;
        }

      }

      public interface PmpOrBuilder extends
          // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp)
          com.google.protobuf.GeneratedMessageV3.
              ExtendableMessageOrBuilder<Pmp> {

        /**
         * <pre>
         * Indicator of auction eligibility to seats named in the Direct Deals
         * object, where 0 = all bids are accepted, 1 = bids are restricted to
         * the deals specified and the terms thereof.
         * </pre>
         *
         * <code>optional bool private_auction = 1 [default = false];</code>
         * @return Whether the privateAuction field is set.
         */
        boolean hasPrivateAuction();
        /**
         * <pre>
         * Indicator of auction eligibility to seats named in the Direct Deals
         * object, where 0 = all bids are accepted, 1 = bids are restricted to
         * the deals specified and the terms thereof.
         * </pre>
         *
         * <code>optional bool private_auction = 1 [default = false];</code>
         * @return The privateAuction.
         */
        boolean getPrivateAuction();

        /**
         * <pre>
         * Array of Deal (Section 3.2.18) objects that convey the specific deals
         * applicable to this impression.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp.Deal deals = 2;</code>
         */
        java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal> 
            getDealsList();
        /**
         * <pre>
         * Array of Deal (Section 3.2.18) objects that convey the specific deals
         * applicable to this impression.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp.Deal deals = 2;</code>
         */
        com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal getDeals(int index);
        /**
         * <pre>
         * Array of Deal (Section 3.2.18) objects that convey the specific deals
         * applicable to this impression.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp.Deal deals = 2;</code>
         */
        int getDealsCount();
        /**
         * <pre>
         * Array of Deal (Section 3.2.18) objects that convey the specific deals
         * applicable to this impression.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp.Deal deals = 2;</code>
         */
        java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.DealOrBuilder> 
            getDealsOrBuilderList();
        /**
         * <pre>
         * Array of Deal (Section 3.2.18) objects that convey the specific deals
         * applicable to this impression.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp.Deal deals = 2;</code>
         */
        com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.DealOrBuilder getDealsOrBuilder(
            int index);
      }
      /**
       * <pre>
       * OpenRTB 2.2: This object is the private marketplace container for
       * direct deals between buyers and sellers that may pertain to this
       * impression. The actual deals are represented as a collection of
       * Deal objects. Refer to Section 7.2 for more details.
       * </pre>
       *
       * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp}
       */
      public static final class Pmp extends
          com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
            Pmp> implements
          // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp)
          PmpOrBuilder {
      private static final long serialVersionUID = 0L;
        // Use Pmp.newBuilder() to construct.
        private Pmp(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp, ?> builder) {
          super(builder);
        }
        private Pmp() {
          deals_ = java.util.Collections.emptyList();
        }

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

        @java.lang.Override
        public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
          return this.unknownFields;
        }
        private Pmp(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          this();
          if (extensionRegistry == null) {
            throw new java.lang.NullPointerException();
          }
          int mutable_bitField0_ = 0;
          com.google.protobuf.UnknownFieldSet.Builder unknownFields =
              com.google.protobuf.UnknownFieldSet.newBuilder();
          try {
            boolean done = false;
            while (!done) {
              int tag = input.readTag();
              switch (tag) {
                case 0:
                  done = true;
                  break;
                case 8: {
                  bitField0_ |= 0x00000001;
                  privateAuction_ = input.readBool();
                  break;
                }
                case 18: {
                  if (!((mutable_bitField0_ & 0x00000002) != 0)) {
                    deals_ = new java.util.ArrayList<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal>();
                    mutable_bitField0_ |= 0x00000002;
                  }
                  deals_.add(
                      input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal.PARSER, extensionRegistry));
                  break;
                }
                default: {
                  if (!parseUnknownField(
                      input, unknownFields, extensionRegistry, tag)) {
                    done = true;
                  }
                  break;
                }
              }
            }
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            throw e.setUnfinishedMessage(this);
          } catch (java.io.IOException e) {
            throw new com.google.protobuf.InvalidProtocolBufferException(
                e).setUnfinishedMessage(this);
          } finally {
            if (((mutable_bitField0_ & 0x00000002) != 0)) {
              deals_ = java.util.Collections.unmodifiableList(deals_);
            }
            this.unknownFields = unknownFields.build();
            makeExtensionsImmutable();
          }
        }
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Pmp_descriptor;
        }

        @java.lang.Override
        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Pmp_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Builder.class);
        }

        public interface DealOrBuilder extends
            // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp.Deal)
            com.google.protobuf.GeneratedMessageV3.
                ExtendableMessageOrBuilder<Deal> {

          /**
           * <pre>
           * A unique identifier for the direct deal.
           * REQUIRED by the OpenRTB specification.
           * </pre>
           *
           * <code>required string id = 1;</code>
           * @return Whether the id field is set.
           */
          boolean hasId();
          /**
           * <pre>
           * A unique identifier for the direct deal.
           * REQUIRED by the OpenRTB specification.
           * </pre>
           *
           * <code>required string id = 1;</code>
           * @return The id.
           */
          java.lang.String getId();
          /**
           * <pre>
           * A unique identifier for the direct deal.
           * REQUIRED by the OpenRTB specification.
           * </pre>
           *
           * <code>required string id = 1;</code>
           * @return The bytes for id.
           */
          com.google.protobuf.ByteString
              getIdBytes();

          /**
           * <pre>
           * Minimum bid for this impression expressed in CPM.
           * </pre>
           *
           * <code>optional double bidfloor = 2 [default = 0];</code>
           * @return Whether the bidfloor field is set.
           */
          boolean hasBidfloor();
          /**
           * <pre>
           * Minimum bid for this impression expressed in CPM.
           * </pre>
           *
           * <code>optional double bidfloor = 2 [default = 0];</code>
           * @return The bidfloor.
           */
          double getBidfloor();

          /**
           * <pre>
           * Currency specified using ISO-4217 alpha codes. This may be different
           * from bid currency returned by bidder if this is allowed
           * by the exchange.
           * </pre>
           *
           * <code>optional string bidfloorcur = 3 [default = "USD"];</code>
           * @return Whether the bidfloorcur field is set.
           */
          boolean hasBidfloorcur();
          /**
           * <pre>
           * Currency specified using ISO-4217 alpha codes. This may be different
           * from bid currency returned by bidder if this is allowed
           * by the exchange.
           * </pre>
           *
           * <code>optional string bidfloorcur = 3 [default = "USD"];</code>
           * @return The bidfloorcur.
           */
          java.lang.String getBidfloorcur();
          /**
           * <pre>
           * Currency specified using ISO-4217 alpha codes. This may be different
           * from bid currency returned by bidder if this is allowed
           * by the exchange.
           * </pre>
           *
           * <code>optional string bidfloorcur = 3 [default = "USD"];</code>
           * @return The bytes for bidfloorcur.
           */
          com.google.protobuf.ByteString
              getBidfloorcurBytes();

          /**
           * <pre>
           * Whitelist of buyer seats (e.g., advertisers, agencies) allowed to
           * bid on this deal. IDs of seats and knowledge of the buyer's
           * customers to which they refer must be coordinated between bidders
           * and the exchange a priori. Omission implies no seat restrictions.
           * </pre>
           *
           * <code>repeated string wseat = 4;</code>
           * @return A list containing the wseat.
           */
          java.util.List<java.lang.String>
              getWseatList();
          /**
           * <pre>
           * Whitelist of buyer seats (e.g., advertisers, agencies) allowed to
           * bid on this deal. IDs of seats and knowledge of the buyer's
           * customers to which they refer must be coordinated between bidders
           * and the exchange a priori. Omission implies no seat restrictions.
           * </pre>
           *
           * <code>repeated string wseat = 4;</code>
           * @return The count of wseat.
           */
          int getWseatCount();
          /**
           * <pre>
           * Whitelist of buyer seats (e.g., advertisers, agencies) allowed to
           * bid on this deal. IDs of seats and knowledge of the buyer's
           * customers to which they refer must be coordinated between bidders
           * and the exchange a priori. Omission implies no seat restrictions.
           * </pre>
           *
           * <code>repeated string wseat = 4;</code>
           * @param index The index of the element to return.
           * @return The wseat at the given index.
           */
          java.lang.String getWseat(int index);
          /**
           * <pre>
           * Whitelist of buyer seats (e.g., advertisers, agencies) allowed to
           * bid on this deal. IDs of seats and knowledge of the buyer's
           * customers to which they refer must be coordinated between bidders
           * and the exchange a priori. Omission implies no seat restrictions.
           * </pre>
           *
           * <code>repeated string wseat = 4;</code>
           * @param index The index of the value to return.
           * @return The bytes of the wseat at the given index.
           */
          com.google.protobuf.ByteString
              getWseatBytes(int index);

          /**
           * <pre>
           * Array of advertiser domains (e.g., advertiser.com) allowed to
           * bid on this deal. Omission implies no advertiser restrictions.
           * </pre>
           *
           * <code>repeated string wadomain = 5;</code>
           * @return A list containing the wadomain.
           */
          java.util.List<java.lang.String>
              getWadomainList();
          /**
           * <pre>
           * Array of advertiser domains (e.g., advertiser.com) allowed to
           * bid on this deal. Omission implies no advertiser restrictions.
           * </pre>
           *
           * <code>repeated string wadomain = 5;</code>
           * @return The count of wadomain.
           */
          int getWadomainCount();
          /**
           * <pre>
           * Array of advertiser domains (e.g., advertiser.com) allowed to
           * bid on this deal. Omission implies no advertiser restrictions.
           * </pre>
           *
           * <code>repeated string wadomain = 5;</code>
           * @param index The index of the element to return.
           * @return The wadomain at the given index.
           */
          java.lang.String getWadomain(int index);
          /**
           * <pre>
           * Array of advertiser domains (e.g., advertiser.com) allowed to
           * bid on this deal. Omission implies no advertiser restrictions.
           * </pre>
           *
           * <code>repeated string wadomain = 5;</code>
           * @param index The index of the value to return.
           * @return The bytes of the wadomain at the given index.
           */
          com.google.protobuf.ByteString
              getWadomainBytes(int index);

          /**
           * <pre>
           * Optional override of the overall auction type of the bid request,
           * where 1 = First Price, 2 = Second Price Plus, 3 = the value passed
           * in bidfloor is the agreed upon deal price. Additional auction types
           * can be defined by the exchange.
           * Refer to enum com.iabtechlab.openrtb.v3.AuctionType for generic values.
           * </pre>
           *
           * <code>optional int32 at = 6;</code>
           * @return Whether the at field is set.
           */
          boolean hasAt();
          /**
           * <pre>
           * Optional override of the overall auction type of the bid request,
           * where 1 = First Price, 2 = Second Price Plus, 3 = the value passed
           * in bidfloor is the agreed upon deal price. Additional auction types
           * can be defined by the exchange.
           * Refer to enum com.iabtechlab.openrtb.v3.AuctionType for generic values.
           * </pre>
           *
           * <code>optional int32 at = 6;</code>
           * @return The at.
           */
          int getAt();
        }
        /**
         * <pre>
         * OpenRTB 2.2: This object constitutes a specific deal that was struck
         * a priori between a buyer and a seller. Its presence with the Pmp
         * collection indicates that this impression is available under the terms
         * of that deal. Refer to Section 7.2 for more details.
         * </pre>
         *
         * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp.Deal}
         */
        public static final class Deal extends
            com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
              Deal> implements
            // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp.Deal)
            DealOrBuilder {
        private static final long serialVersionUID = 0L;
          // Use Deal.newBuilder() to construct.
          private Deal(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal, ?> builder) {
            super(builder);
          }
          private Deal() {
            id_ = "";
            bidfloorcur_ = "USD";
            wseat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
            wadomain_ = com.google.protobuf.LazyStringArrayList.EMPTY;
          }

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

          @java.lang.Override
          public final com.google.protobuf.UnknownFieldSet
          getUnknownFields() {
            return this.unknownFields;
          }
          private Deal(
              com.google.protobuf.CodedInputStream input,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.protobuf.InvalidProtocolBufferException {
            this();
            if (extensionRegistry == null) {
              throw new java.lang.NullPointerException();
            }
            int mutable_bitField0_ = 0;
            com.google.protobuf.UnknownFieldSet.Builder unknownFields =
                com.google.protobuf.UnknownFieldSet.newBuilder();
            try {
              boolean done = false;
              while (!done) {
                int tag = input.readTag();
                switch (tag) {
                  case 0:
                    done = true;
                    break;
                  case 10: {
                    com.google.protobuf.ByteString bs = input.readBytes();
                    bitField0_ |= 0x00000001;
                    id_ = bs;
                    break;
                  }
                  case 17: {
                    bitField0_ |= 0x00000002;
                    bidfloor_ = input.readDouble();
                    break;
                  }
                  case 26: {
                    com.google.protobuf.ByteString bs = input.readBytes();
                    bitField0_ |= 0x00000004;
                    bidfloorcur_ = bs;
                    break;
                  }
                  case 34: {
                    com.google.protobuf.ByteString bs = input.readBytes();
                    if (!((mutable_bitField0_ & 0x00000008) != 0)) {
                      wseat_ = new com.google.protobuf.LazyStringArrayList();
                      mutable_bitField0_ |= 0x00000008;
                    }
                    wseat_.add(bs);
                    break;
                  }
                  case 42: {
                    com.google.protobuf.ByteString bs = input.readBytes();
                    if (!((mutable_bitField0_ & 0x00000010) != 0)) {
                      wadomain_ = new com.google.protobuf.LazyStringArrayList();
                      mutable_bitField0_ |= 0x00000010;
                    }
                    wadomain_.add(bs);
                    break;
                  }
                  case 48: {
                    bitField0_ |= 0x00000008;
                    at_ = input.readInt32();
                    break;
                  }
                  default: {
                    if (!parseUnknownField(
                        input, unknownFields, extensionRegistry, tag)) {
                      done = true;
                    }
                    break;
                  }
                }
              }
            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
              throw e.setUnfinishedMessage(this);
            } catch (java.io.IOException e) {
              throw new com.google.protobuf.InvalidProtocolBufferException(
                  e).setUnfinishedMessage(this);
            } finally {
              if (((mutable_bitField0_ & 0x00000008) != 0)) {
                wseat_ = wseat_.getUnmodifiableView();
              }
              if (((mutable_bitField0_ & 0x00000010) != 0)) {
                wadomain_ = wadomain_.getUnmodifiableView();
              }
              this.unknownFields = unknownFields.build();
              makeExtensionsImmutable();
            }
          }
          public static final com.google.protobuf.Descriptors.Descriptor
              getDescriptor() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Pmp_Deal_descriptor;
          }

          @java.lang.Override
          protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
              internalGetFieldAccessorTable() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Pmp_Deal_fieldAccessorTable
                .ensureFieldAccessorsInitialized(
                    com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal.Builder.class);
          }

          private int bitField0_;
          public static final int ID_FIELD_NUMBER = 1;
          private volatile java.lang.Object id_;
          /**
           * <pre>
           * A unique identifier for the direct deal.
           * REQUIRED by the OpenRTB specification.
           * </pre>
           *
           * <code>required string id = 1;</code>
           * @return Whether the id field is set.
           */
          @java.lang.Override
          public boolean hasId() {
            return ((bitField0_ & 0x00000001) != 0);
          }
          /**
           * <pre>
           * A unique identifier for the direct deal.
           * REQUIRED by the OpenRTB specification.
           * </pre>
           *
           * <code>required string id = 1;</code>
           * @return The id.
           */
          @java.lang.Override
          public java.lang.String getId() {
            java.lang.Object ref = id_;
            if (ref instanceof java.lang.String) {
              return (java.lang.String) ref;
            } else {
              com.google.protobuf.ByteString bs = 
                  (com.google.protobuf.ByteString) ref;
              java.lang.String s = bs.toStringUtf8();
              if (bs.isValidUtf8()) {
                id_ = s;
              }
              return s;
            }
          }
          /**
           * <pre>
           * A unique identifier for the direct deal.
           * REQUIRED by the OpenRTB specification.
           * </pre>
           *
           * <code>required string id = 1;</code>
           * @return The bytes for id.
           */
          @java.lang.Override
          public com.google.protobuf.ByteString
              getIdBytes() {
            java.lang.Object ref = id_;
            if (ref instanceof java.lang.String) {
              com.google.protobuf.ByteString b = 
                  com.google.protobuf.ByteString.copyFromUtf8(
                      (java.lang.String) ref);
              id_ = b;
              return b;
            } else {
              return (com.google.protobuf.ByteString) ref;
            }
          }

          public static final int BIDFLOOR_FIELD_NUMBER = 2;
          private double bidfloor_;
          /**
           * <pre>
           * Minimum bid for this impression expressed in CPM.
           * </pre>
           *
           * <code>optional double bidfloor = 2 [default = 0];</code>
           * @return Whether the bidfloor field is set.
           */
          @java.lang.Override
          public boolean hasBidfloor() {
            return ((bitField0_ & 0x00000002) != 0);
          }
          /**
           * <pre>
           * Minimum bid for this impression expressed in CPM.
           * </pre>
           *
           * <code>optional double bidfloor = 2 [default = 0];</code>
           * @return The bidfloor.
           */
          @java.lang.Override
          public double getBidfloor() {
            return bidfloor_;
          }

          public static final int BIDFLOORCUR_FIELD_NUMBER = 3;
          private volatile java.lang.Object bidfloorcur_;
          /**
           * <pre>
           * Currency specified using ISO-4217 alpha codes. This may be different
           * from bid currency returned by bidder if this is allowed
           * by the exchange.
           * </pre>
           *
           * <code>optional string bidfloorcur = 3 [default = "USD"];</code>
           * @return Whether the bidfloorcur field is set.
           */
          @java.lang.Override
          public boolean hasBidfloorcur() {
            return ((bitField0_ & 0x00000004) != 0);
          }
          /**
           * <pre>
           * Currency specified using ISO-4217 alpha codes. This may be different
           * from bid currency returned by bidder if this is allowed
           * by the exchange.
           * </pre>
           *
           * <code>optional string bidfloorcur = 3 [default = "USD"];</code>
           * @return The bidfloorcur.
           */
          @java.lang.Override
          public java.lang.String getBidfloorcur() {
            java.lang.Object ref = bidfloorcur_;
            if (ref instanceof java.lang.String) {
              return (java.lang.String) ref;
            } else {
              com.google.protobuf.ByteString bs = 
                  (com.google.protobuf.ByteString) ref;
              java.lang.String s = bs.toStringUtf8();
              if (bs.isValidUtf8()) {
                bidfloorcur_ = s;
              }
              return s;
            }
          }
          /**
           * <pre>
           * Currency specified using ISO-4217 alpha codes. This may be different
           * from bid currency returned by bidder if this is allowed
           * by the exchange.
           * </pre>
           *
           * <code>optional string bidfloorcur = 3 [default = "USD"];</code>
           * @return The bytes for bidfloorcur.
           */
          @java.lang.Override
          public com.google.protobuf.ByteString
              getBidfloorcurBytes() {
            java.lang.Object ref = bidfloorcur_;
            if (ref instanceof java.lang.String) {
              com.google.protobuf.ByteString b = 
                  com.google.protobuf.ByteString.copyFromUtf8(
                      (java.lang.String) ref);
              bidfloorcur_ = b;
              return b;
            } else {
              return (com.google.protobuf.ByteString) ref;
            }
          }

          public static final int WSEAT_FIELD_NUMBER = 4;
          private com.google.protobuf.LazyStringList wseat_;
          /**
           * <pre>
           * Whitelist of buyer seats (e.g., advertisers, agencies) allowed to
           * bid on this deal. IDs of seats and knowledge of the buyer's
           * customers to which they refer must be coordinated between bidders
           * and the exchange a priori. Omission implies no seat restrictions.
           * </pre>
           *
           * <code>repeated string wseat = 4;</code>
           * @return A list containing the wseat.
           */
          public com.google.protobuf.ProtocolStringList
              getWseatList() {
            return wseat_;
          }
          /**
           * <pre>
           * Whitelist of buyer seats (e.g., advertisers, agencies) allowed to
           * bid on this deal. IDs of seats and knowledge of the buyer's
           * customers to which they refer must be coordinated between bidders
           * and the exchange a priori. Omission implies no seat restrictions.
           * </pre>
           *
           * <code>repeated string wseat = 4;</code>
           * @return The count of wseat.
           */
          public int getWseatCount() {
            return wseat_.size();
          }
          /**
           * <pre>
           * Whitelist of buyer seats (e.g., advertisers, agencies) allowed to
           * bid on this deal. IDs of seats and knowledge of the buyer's
           * customers to which they refer must be coordinated between bidders
           * and the exchange a priori. Omission implies no seat restrictions.
           * </pre>
           *
           * <code>repeated string wseat = 4;</code>
           * @param index The index of the element to return.
           * @return The wseat at the given index.
           */
          public java.lang.String getWseat(int index) {
            return wseat_.get(index);
          }
          /**
           * <pre>
           * Whitelist of buyer seats (e.g., advertisers, agencies) allowed to
           * bid on this deal. IDs of seats and knowledge of the buyer's
           * customers to which they refer must be coordinated between bidders
           * and the exchange a priori. Omission implies no seat restrictions.
           * </pre>
           *
           * <code>repeated string wseat = 4;</code>
           * @param index The index of the value to return.
           * @return The bytes of the wseat at the given index.
           */
          public com.google.protobuf.ByteString
              getWseatBytes(int index) {
            return wseat_.getByteString(index);
          }

          public static final int WADOMAIN_FIELD_NUMBER = 5;
          private com.google.protobuf.LazyStringList wadomain_;
          /**
           * <pre>
           * Array of advertiser domains (e.g., advertiser.com) allowed to
           * bid on this deal. Omission implies no advertiser restrictions.
           * </pre>
           *
           * <code>repeated string wadomain = 5;</code>
           * @return A list containing the wadomain.
           */
          public com.google.protobuf.ProtocolStringList
              getWadomainList() {
            return wadomain_;
          }
          /**
           * <pre>
           * Array of advertiser domains (e.g., advertiser.com) allowed to
           * bid on this deal. Omission implies no advertiser restrictions.
           * </pre>
           *
           * <code>repeated string wadomain = 5;</code>
           * @return The count of wadomain.
           */
          public int getWadomainCount() {
            return wadomain_.size();
          }
          /**
           * <pre>
           * Array of advertiser domains (e.g., advertiser.com) allowed to
           * bid on this deal. Omission implies no advertiser restrictions.
           * </pre>
           *
           * <code>repeated string wadomain = 5;</code>
           * @param index The index of the element to return.
           * @return The wadomain at the given index.
           */
          public java.lang.String getWadomain(int index) {
            return wadomain_.get(index);
          }
          /**
           * <pre>
           * Array of advertiser domains (e.g., advertiser.com) allowed to
           * bid on this deal. Omission implies no advertiser restrictions.
           * </pre>
           *
           * <code>repeated string wadomain = 5;</code>
           * @param index The index of the value to return.
           * @return The bytes of the wadomain at the given index.
           */
          public com.google.protobuf.ByteString
              getWadomainBytes(int index) {
            return wadomain_.getByteString(index);
          }

          public static final int AT_FIELD_NUMBER = 6;
          private int at_;
          /**
           * <pre>
           * Optional override of the overall auction type of the bid request,
           * where 1 = First Price, 2 = Second Price Plus, 3 = the value passed
           * in bidfloor is the agreed upon deal price. Additional auction types
           * can be defined by the exchange.
           * Refer to enum com.iabtechlab.openrtb.v3.AuctionType for generic values.
           * </pre>
           *
           * <code>optional int32 at = 6;</code>
           * @return Whether the at field is set.
           */
          @java.lang.Override
          public boolean hasAt() {
            return ((bitField0_ & 0x00000008) != 0);
          }
          /**
           * <pre>
           * Optional override of the overall auction type of the bid request,
           * where 1 = First Price, 2 = Second Price Plus, 3 = the value passed
           * in bidfloor is the agreed upon deal price. Additional auction types
           * can be defined by the exchange.
           * Refer to enum com.iabtechlab.openrtb.v3.AuctionType for generic values.
           * </pre>
           *
           * <code>optional int32 at = 6;</code>
           * @return The at.
           */
          @java.lang.Override
          public int getAt() {
            return at_;
          }

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

            if (!hasId()) {
              memoizedIsInitialized = 0;
              return false;
            }
            if (!extensionsAreInitialized()) {
              memoizedIsInitialized = 0;
              return false;
            }
            memoizedIsInitialized = 1;
            return true;
          }

          @java.lang.Override
          public void writeTo(com.google.protobuf.CodedOutputStream output)
                              throws java.io.IOException {
            com.google.protobuf.GeneratedMessageV3
              .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal>.ExtensionWriter
                extensionWriter = newExtensionWriter();
            if (((bitField0_ & 0x00000001) != 0)) {
              com.google.protobuf.GeneratedMessageV3.writeString(output, 1, id_);
            }
            if (((bitField0_ & 0x00000002) != 0)) {
              output.writeDouble(2, bidfloor_);
            }
            if (((bitField0_ & 0x00000004) != 0)) {
              com.google.protobuf.GeneratedMessageV3.writeString(output, 3, bidfloorcur_);
            }
            for (int i = 0; i < wseat_.size(); i++) {
              com.google.protobuf.GeneratedMessageV3.writeString(output, 4, wseat_.getRaw(i));
            }
            for (int i = 0; i < wadomain_.size(); i++) {
              com.google.protobuf.GeneratedMessageV3.writeString(output, 5, wadomain_.getRaw(i));
            }
            if (((bitField0_ & 0x00000008) != 0)) {
              output.writeInt32(6, at_);
            }
            extensionWriter.writeUntil(10000, output);
            unknownFields.writeTo(output);
          }

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

            size = 0;
            if (((bitField0_ & 0x00000001) != 0)) {
              size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, id_);
            }
            if (((bitField0_ & 0x00000002) != 0)) {
              size += com.google.protobuf.CodedOutputStream
                .computeDoubleSize(2, bidfloor_);
            }
            if (((bitField0_ & 0x00000004) != 0)) {
              size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, bidfloorcur_);
            }
            {
              int dataSize = 0;
              for (int i = 0; i < wseat_.size(); i++) {
                dataSize += computeStringSizeNoTag(wseat_.getRaw(i));
              }
              size += dataSize;
              size += 1 * getWseatList().size();
            }
            {
              int dataSize = 0;
              for (int i = 0; i < wadomain_.size(); i++) {
                dataSize += computeStringSizeNoTag(wadomain_.getRaw(i));
              }
              size += dataSize;
              size += 1 * getWadomainList().size();
            }
            if (((bitField0_ & 0x00000008) != 0)) {
              size += com.google.protobuf.CodedOutputStream
                .computeInt32Size(6, at_);
            }
            size += extensionsSerializedSize();
            size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal)) {
              return super.equals(obj);
            }
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal other = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal) obj;

            if (hasId() != other.hasId()) return false;
            if (hasId()) {
              if (!getId()
                  .equals(other.getId())) return false;
            }
            if (hasBidfloor() != other.hasBidfloor()) return false;
            if (hasBidfloor()) {
              if (java.lang.Double.doubleToLongBits(getBidfloor())
                  != java.lang.Double.doubleToLongBits(
                      other.getBidfloor())) return false;
            }
            if (hasBidfloorcur() != other.hasBidfloorcur()) return false;
            if (hasBidfloorcur()) {
              if (!getBidfloorcur()
                  .equals(other.getBidfloorcur())) return false;
            }
            if (!getWseatList()
                .equals(other.getWseatList())) return false;
            if (!getWadomainList()
                .equals(other.getWadomainList())) return false;
            if (hasAt() != other.hasAt()) return false;
            if (hasAt()) {
              if (getAt()
                  != other.getAt()) return false;
            }
            if (!unknownFields.equals(other.unknownFields)) return false;
            if (!getExtensionFields().equals(other.getExtensionFields()))
              return false;
            return true;
          }

          @java.lang.Override
          public int hashCode() {
            if (memoizedHashCode != 0) {
              return memoizedHashCode;
            }
            int hash = 41;
            hash = (19 * hash) + getDescriptor().hashCode();
            if (hasId()) {
              hash = (37 * hash) + ID_FIELD_NUMBER;
              hash = (53 * hash) + getId().hashCode();
            }
            if (hasBidfloor()) {
              hash = (37 * hash) + BIDFLOOR_FIELD_NUMBER;
              hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
                  java.lang.Double.doubleToLongBits(getBidfloor()));
            }
            if (hasBidfloorcur()) {
              hash = (37 * hash) + BIDFLOORCUR_FIELD_NUMBER;
              hash = (53 * hash) + getBidfloorcur().hashCode();
            }
            if (getWseatCount() > 0) {
              hash = (37 * hash) + WSEAT_FIELD_NUMBER;
              hash = (53 * hash) + getWseatList().hashCode();
            }
            if (getWadomainCount() > 0) {
              hash = (37 * hash) + WADOMAIN_FIELD_NUMBER;
              hash = (53 * hash) + getWadomainList().hashCode();
            }
            if (hasAt()) {
              hash = (37 * hash) + AT_FIELD_NUMBER;
              hash = (53 * hash) + getAt();
            }
            hash = hashFields(hash, getExtensionFields());
            hash = (29 * hash) + unknownFields.hashCode();
            memoizedHashCode = hash;
            return hash;
          }

          public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal parseFrom(
              java.nio.ByteBuffer data)
              throws com.google.protobuf.InvalidProtocolBufferException {
            return PARSER.parseFrom(data);
          }
          public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal parseFrom(
              java.nio.ByteBuffer data,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.protobuf.InvalidProtocolBufferException {
            return PARSER.parseFrom(data, extensionRegistry);
          }
          public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal parseFrom(
              com.google.protobuf.ByteString data)
              throws com.google.protobuf.InvalidProtocolBufferException {
            return PARSER.parseFrom(data);
          }
          public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal parseFrom(
              com.google.protobuf.ByteString data,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.protobuf.InvalidProtocolBufferException {
            return PARSER.parseFrom(data, extensionRegistry);
          }
          public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal parseFrom(byte[] data)
              throws com.google.protobuf.InvalidProtocolBufferException {
            return PARSER.parseFrom(data);
          }
          public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal parseFrom(
              byte[] data,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.protobuf.InvalidProtocolBufferException {
            return PARSER.parseFrom(data, extensionRegistry);
          }
          public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal parseFrom(java.io.InputStream input)
              throws java.io.IOException {
            return com.google.protobuf.GeneratedMessageV3
                .parseWithIOException(PARSER, input);
          }
          public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal parseDelimitedFrom(java.io.InputStream input)
              throws java.io.IOException {
            return com.google.protobuf.GeneratedMessageV3
                .parseDelimitedWithIOException(PARSER, input);
          }
          public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal parseFrom(
              com.google.protobuf.CodedInputStream input)
              throws java.io.IOException {
            return com.google.protobuf.GeneratedMessageV3
                .parseWithIOException(PARSER, input);
          }
          public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal 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>
           * OpenRTB 2.2: This object constitutes a specific deal that was struck
           * a priori between a buyer and a seller. Its presence with the Pmp
           * collection indicates that this impression is available under the terms
           * of that deal. Refer to Section 7.2 for more details.
           * </pre>
           *
           * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp.Deal}
           */
          public static final class Builder extends
              com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal, Builder> implements
              // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp.Deal)
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.DealOrBuilder {
            public static final com.google.protobuf.Descriptors.Descriptor
                getDescriptor() {
              return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Pmp_Deal_descriptor;
            }

            @java.lang.Override
            protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
                internalGetFieldAccessorTable() {
              return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Pmp_Deal_fieldAccessorTable
                  .ensureFieldAccessorsInitialized(
                      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal.Builder.class);
            }

            // Construct using com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal.newBuilder()
            private Builder() {
              maybeForceBuilderInitialization();
            }

            private Builder(
                com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
              super(parent);
              maybeForceBuilderInitialization();
            }
            private void maybeForceBuilderInitialization() {
              if (com.google.protobuf.GeneratedMessageV3
                      .alwaysUseFieldBuilders) {
              }
            }
            @java.lang.Override
            public Builder clear() {
              super.clear();
              id_ = "";
              bitField0_ = (bitField0_ & ~0x00000001);
              bidfloor_ = 0D;
              bitField0_ = (bitField0_ & ~0x00000002);
              bidfloorcur_ = "USD";
              bitField0_ = (bitField0_ & ~0x00000004);
              wseat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
              bitField0_ = (bitField0_ & ~0x00000008);
              wadomain_ = com.google.protobuf.LazyStringArrayList.EMPTY;
              bitField0_ = (bitField0_ & ~0x00000010);
              at_ = 0;
              bitField0_ = (bitField0_ & ~0x00000020);
              return this;
            }

            @java.lang.Override
            public com.google.protobuf.Descriptors.Descriptor
                getDescriptorForType() {
              return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Pmp_Deal_descriptor;
            }

            @java.lang.Override
            public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal getDefaultInstanceForType() {
              return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal.getDefaultInstance();
            }

            @java.lang.Override
            public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal build() {
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal result = buildPartial();
              if (!result.isInitialized()) {
                throw newUninitializedMessageException(result);
              }
              return result;
            }

            @java.lang.Override
            public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal buildPartial() {
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal result = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal(this);
              int from_bitField0_ = bitField0_;
              int to_bitField0_ = 0;
              if (((from_bitField0_ & 0x00000001) != 0)) {
                to_bitField0_ |= 0x00000001;
              }
              result.id_ = id_;
              if (((from_bitField0_ & 0x00000002) != 0)) {
                result.bidfloor_ = bidfloor_;
                to_bitField0_ |= 0x00000002;
              }
              if (((from_bitField0_ & 0x00000004) != 0)) {
                to_bitField0_ |= 0x00000004;
              }
              result.bidfloorcur_ = bidfloorcur_;
              if (((bitField0_ & 0x00000008) != 0)) {
                wseat_ = wseat_.getUnmodifiableView();
                bitField0_ = (bitField0_ & ~0x00000008);
              }
              result.wseat_ = wseat_;
              if (((bitField0_ & 0x00000010) != 0)) {
                wadomain_ = wadomain_.getUnmodifiableView();
                bitField0_ = (bitField0_ & ~0x00000010);
              }
              result.wadomain_ = wadomain_;
              if (((from_bitField0_ & 0x00000020) != 0)) {
                result.at_ = at_;
                to_bitField0_ |= 0x00000008;
              }
              result.bitField0_ = to_bitField0_;
              onBuilt();
              return result;
            }

            @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 <Type> Builder setExtension(
                com.google.protobuf.GeneratedMessage.GeneratedExtension<
                    com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal, Type> extension,
                Type value) {
              return super.setExtension(extension, value);
            }
            @java.lang.Override
            public <Type> Builder setExtension(
                com.google.protobuf.GeneratedMessage.GeneratedExtension<
                    com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal, java.util.List<Type>> extension,
                int index, Type value) {
              return super.setExtension(extension, index, value);
            }
            @java.lang.Override
            public <Type> Builder addExtension(
                com.google.protobuf.GeneratedMessage.GeneratedExtension<
                    com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal, java.util.List<Type>> extension,
                Type value) {
              return super.addExtension(extension, value);
            }
            @java.lang.Override
            public <Type> Builder clearExtension(
                com.google.protobuf.GeneratedMessage.GeneratedExtension<
                    com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal, ?> extension) {
              return super.clearExtension(extension);
            }
            @java.lang.Override
            public Builder mergeFrom(com.google.protobuf.Message other) {
              if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal) {
                return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal)other);
              } else {
                super.mergeFrom(other);
                return this;
              }
            }

            public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal other) {
              if (other == com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal.getDefaultInstance()) return this;
              if (other.hasId()) {
                bitField0_ |= 0x00000001;
                id_ = other.id_;
                onChanged();
              }
              if (other.hasBidfloor()) {
                setBidfloor(other.getBidfloor());
              }
              if (other.hasBidfloorcur()) {
                bitField0_ |= 0x00000004;
                bidfloorcur_ = other.bidfloorcur_;
                onChanged();
              }
              if (!other.wseat_.isEmpty()) {
                if (wseat_.isEmpty()) {
                  wseat_ = other.wseat_;
                  bitField0_ = (bitField0_ & ~0x00000008);
                } else {
                  ensureWseatIsMutable();
                  wseat_.addAll(other.wseat_);
                }
                onChanged();
              }
              if (!other.wadomain_.isEmpty()) {
                if (wadomain_.isEmpty()) {
                  wadomain_ = other.wadomain_;
                  bitField0_ = (bitField0_ & ~0x00000010);
                } else {
                  ensureWadomainIsMutable();
                  wadomain_.addAll(other.wadomain_);
                }
                onChanged();
              }
              if (other.hasAt()) {
                setAt(other.getAt());
              }
              this.mergeExtensionFields(other);
              this.mergeUnknownFields(other.unknownFields);
              onChanged();
              return this;
            }

            @java.lang.Override
            public final boolean isInitialized() {
              if (!hasId()) {
                return false;
              }
              if (!extensionsAreInitialized()) {
                return false;
              }
              return true;
            }

            @java.lang.Override
            public Builder mergeFrom(
                com.google.protobuf.CodedInputStream input,
                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
                throws java.io.IOException {
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal parsedMessage = null;
              try {
                parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
              } catch (com.google.protobuf.InvalidProtocolBufferException e) {
                parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal) e.getUnfinishedMessage();
                throw e.unwrapIOException();
              } finally {
                if (parsedMessage != null) {
                  mergeFrom(parsedMessage);
                }
              }
              return this;
            }
            private int bitField0_;

            private java.lang.Object id_ = "";
            /**
             * <pre>
             * A unique identifier for the direct deal.
             * REQUIRED by the OpenRTB specification.
             * </pre>
             *
             * <code>required string id = 1;</code>
             * @return Whether the id field is set.
             */
            public boolean hasId() {
              return ((bitField0_ & 0x00000001) != 0);
            }
            /**
             * <pre>
             * A unique identifier for the direct deal.
             * REQUIRED by the OpenRTB specification.
             * </pre>
             *
             * <code>required string id = 1;</code>
             * @return The id.
             */
            public java.lang.String getId() {
              java.lang.Object ref = id_;
              if (!(ref instanceof java.lang.String)) {
                com.google.protobuf.ByteString bs =
                    (com.google.protobuf.ByteString) ref;
                java.lang.String s = bs.toStringUtf8();
                if (bs.isValidUtf8()) {
                  id_ = s;
                }
                return s;
              } else {
                return (java.lang.String) ref;
              }
            }
            /**
             * <pre>
             * A unique identifier for the direct deal.
             * REQUIRED by the OpenRTB specification.
             * </pre>
             *
             * <code>required string id = 1;</code>
             * @return The bytes for id.
             */
            public com.google.protobuf.ByteString
                getIdBytes() {
              java.lang.Object ref = id_;
              if (ref instanceof String) {
                com.google.protobuf.ByteString b = 
                    com.google.protobuf.ByteString.copyFromUtf8(
                        (java.lang.String) ref);
                id_ = b;
                return b;
              } else {
                return (com.google.protobuf.ByteString) ref;
              }
            }
            /**
             * <pre>
             * A unique identifier for the direct deal.
             * REQUIRED by the OpenRTB specification.
             * </pre>
             *
             * <code>required string id = 1;</code>
             * @param value The id to set.
             * @return This builder for chaining.
             */
            public Builder setId(
                java.lang.String value) {
              if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
              id_ = value;
              onChanged();
              return this;
            }
            /**
             * <pre>
             * A unique identifier for the direct deal.
             * REQUIRED by the OpenRTB specification.
             * </pre>
             *
             * <code>required string id = 1;</code>
             * @return This builder for chaining.
             */
            public Builder clearId() {
              bitField0_ = (bitField0_ & ~0x00000001);
              id_ = getDefaultInstance().getId();
              onChanged();
              return this;
            }
            /**
             * <pre>
             * A unique identifier for the direct deal.
             * REQUIRED by the OpenRTB specification.
             * </pre>
             *
             * <code>required string id = 1;</code>
             * @param value The bytes for id to set.
             * @return This builder for chaining.
             */
            public Builder setIdBytes(
                com.google.protobuf.ByteString value) {
              if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
              id_ = value;
              onChanged();
              return this;
            }

            private double bidfloor_ ;
            /**
             * <pre>
             * Minimum bid for this impression expressed in CPM.
             * </pre>
             *
             * <code>optional double bidfloor = 2 [default = 0];</code>
             * @return Whether the bidfloor field is set.
             */
            @java.lang.Override
            public boolean hasBidfloor() {
              return ((bitField0_ & 0x00000002) != 0);
            }
            /**
             * <pre>
             * Minimum bid for this impression expressed in CPM.
             * </pre>
             *
             * <code>optional double bidfloor = 2 [default = 0];</code>
             * @return The bidfloor.
             */
            @java.lang.Override
            public double getBidfloor() {
              return bidfloor_;
            }
            /**
             * <pre>
             * Minimum bid for this impression expressed in CPM.
             * </pre>
             *
             * <code>optional double bidfloor = 2 [default = 0];</code>
             * @param value The bidfloor to set.
             * @return This builder for chaining.
             */
            public Builder setBidfloor(double value) {
              bitField0_ |= 0x00000002;
              bidfloor_ = value;
              onChanged();
              return this;
            }
            /**
             * <pre>
             * Minimum bid for this impression expressed in CPM.
             * </pre>
             *
             * <code>optional double bidfloor = 2 [default = 0];</code>
             * @return This builder for chaining.
             */
            public Builder clearBidfloor() {
              bitField0_ = (bitField0_ & ~0x00000002);
              bidfloor_ = 0D;
              onChanged();
              return this;
            }

            private java.lang.Object bidfloorcur_ = "USD";
            /**
             * <pre>
             * Currency specified using ISO-4217 alpha codes. This may be different
             * from bid currency returned by bidder if this is allowed
             * by the exchange.
             * </pre>
             *
             * <code>optional string bidfloorcur = 3 [default = "USD"];</code>
             * @return Whether the bidfloorcur field is set.
             */
            public boolean hasBidfloorcur() {
              return ((bitField0_ & 0x00000004) != 0);
            }
            /**
             * <pre>
             * Currency specified using ISO-4217 alpha codes. This may be different
             * from bid currency returned by bidder if this is allowed
             * by the exchange.
             * </pre>
             *
             * <code>optional string bidfloorcur = 3 [default = "USD"];</code>
             * @return The bidfloorcur.
             */
            public java.lang.String getBidfloorcur() {
              java.lang.Object ref = bidfloorcur_;
              if (!(ref instanceof java.lang.String)) {
                com.google.protobuf.ByteString bs =
                    (com.google.protobuf.ByteString) ref;
                java.lang.String s = bs.toStringUtf8();
                if (bs.isValidUtf8()) {
                  bidfloorcur_ = s;
                }
                return s;
              } else {
                return (java.lang.String) ref;
              }
            }
            /**
             * <pre>
             * Currency specified using ISO-4217 alpha codes. This may be different
             * from bid currency returned by bidder if this is allowed
             * by the exchange.
             * </pre>
             *
             * <code>optional string bidfloorcur = 3 [default = "USD"];</code>
             * @return The bytes for bidfloorcur.
             */
            public com.google.protobuf.ByteString
                getBidfloorcurBytes() {
              java.lang.Object ref = bidfloorcur_;
              if (ref instanceof String) {
                com.google.protobuf.ByteString b = 
                    com.google.protobuf.ByteString.copyFromUtf8(
                        (java.lang.String) ref);
                bidfloorcur_ = b;
                return b;
              } else {
                return (com.google.protobuf.ByteString) ref;
              }
            }
            /**
             * <pre>
             * Currency specified using ISO-4217 alpha codes. This may be different
             * from bid currency returned by bidder if this is allowed
             * by the exchange.
             * </pre>
             *
             * <code>optional string bidfloorcur = 3 [default = "USD"];</code>
             * @param value The bidfloorcur to set.
             * @return This builder for chaining.
             */
            public Builder setBidfloorcur(
                java.lang.String value) {
              if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
              bidfloorcur_ = value;
              onChanged();
              return this;
            }
            /**
             * <pre>
             * Currency specified using ISO-4217 alpha codes. This may be different
             * from bid currency returned by bidder if this is allowed
             * by the exchange.
             * </pre>
             *
             * <code>optional string bidfloorcur = 3 [default = "USD"];</code>
             * @return This builder for chaining.
             */
            public Builder clearBidfloorcur() {
              bitField0_ = (bitField0_ & ~0x00000004);
              bidfloorcur_ = getDefaultInstance().getBidfloorcur();
              onChanged();
              return this;
            }
            /**
             * <pre>
             * Currency specified using ISO-4217 alpha codes. This may be different
             * from bid currency returned by bidder if this is allowed
             * by the exchange.
             * </pre>
             *
             * <code>optional string bidfloorcur = 3 [default = "USD"];</code>
             * @param value The bytes for bidfloorcur to set.
             * @return This builder for chaining.
             */
            public Builder setBidfloorcurBytes(
                com.google.protobuf.ByteString value) {
              if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
              bidfloorcur_ = value;
              onChanged();
              return this;
            }

            private com.google.protobuf.LazyStringList wseat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
            private void ensureWseatIsMutable() {
              if (!((bitField0_ & 0x00000008) != 0)) {
                wseat_ = new com.google.protobuf.LazyStringArrayList(wseat_);
                bitField0_ |= 0x00000008;
               }
            }
            /**
             * <pre>
             * Whitelist of buyer seats (e.g., advertisers, agencies) allowed to
             * bid on this deal. IDs of seats and knowledge of the buyer's
             * customers to which they refer must be coordinated between bidders
             * and the exchange a priori. Omission implies no seat restrictions.
             * </pre>
             *
             * <code>repeated string wseat = 4;</code>
             * @return A list containing the wseat.
             */
            public com.google.protobuf.ProtocolStringList
                getWseatList() {
              return wseat_.getUnmodifiableView();
            }
            /**
             * <pre>
             * Whitelist of buyer seats (e.g., advertisers, agencies) allowed to
             * bid on this deal. IDs of seats and knowledge of the buyer's
             * customers to which they refer must be coordinated between bidders
             * and the exchange a priori. Omission implies no seat restrictions.
             * </pre>
             *
             * <code>repeated string wseat = 4;</code>
             * @return The count of wseat.
             */
            public int getWseatCount() {
              return wseat_.size();
            }
            /**
             * <pre>
             * Whitelist of buyer seats (e.g., advertisers, agencies) allowed to
             * bid on this deal. IDs of seats and knowledge of the buyer's
             * customers to which they refer must be coordinated between bidders
             * and the exchange a priori. Omission implies no seat restrictions.
             * </pre>
             *
             * <code>repeated string wseat = 4;</code>
             * @param index The index of the element to return.
             * @return The wseat at the given index.
             */
            public java.lang.String getWseat(int index) {
              return wseat_.get(index);
            }
            /**
             * <pre>
             * Whitelist of buyer seats (e.g., advertisers, agencies) allowed to
             * bid on this deal. IDs of seats and knowledge of the buyer's
             * customers to which they refer must be coordinated between bidders
             * and the exchange a priori. Omission implies no seat restrictions.
             * </pre>
             *
             * <code>repeated string wseat = 4;</code>
             * @param index The index of the value to return.
             * @return The bytes of the wseat at the given index.
             */
            public com.google.protobuf.ByteString
                getWseatBytes(int index) {
              return wseat_.getByteString(index);
            }
            /**
             * <pre>
             * Whitelist of buyer seats (e.g., advertisers, agencies) allowed to
             * bid on this deal. IDs of seats and knowledge of the buyer's
             * customers to which they refer must be coordinated between bidders
             * and the exchange a priori. Omission implies no seat restrictions.
             * </pre>
             *
             * <code>repeated string wseat = 4;</code>
             * @param index The index to set the value at.
             * @param value The wseat to set.
             * @return This builder for chaining.
             */
            public Builder setWseat(
                int index, java.lang.String value) {
              if (value == null) {
    throw new NullPointerException();
  }
  ensureWseatIsMutable();
              wseat_.set(index, value);
              onChanged();
              return this;
            }
            /**
             * <pre>
             * Whitelist of buyer seats (e.g., advertisers, agencies) allowed to
             * bid on this deal. IDs of seats and knowledge of the buyer's
             * customers to which they refer must be coordinated between bidders
             * and the exchange a priori. Omission implies no seat restrictions.
             * </pre>
             *
             * <code>repeated string wseat = 4;</code>
             * @param value The wseat to add.
             * @return This builder for chaining.
             */
            public Builder addWseat(
                java.lang.String value) {
              if (value == null) {
    throw new NullPointerException();
  }
  ensureWseatIsMutable();
              wseat_.add(value);
              onChanged();
              return this;
            }
            /**
             * <pre>
             * Whitelist of buyer seats (e.g., advertisers, agencies) allowed to
             * bid on this deal. IDs of seats and knowledge of the buyer's
             * customers to which they refer must be coordinated between bidders
             * and the exchange a priori. Omission implies no seat restrictions.
             * </pre>
             *
             * <code>repeated string wseat = 4;</code>
             * @param values The wseat to add.
             * @return This builder for chaining.
             */
            public Builder addAllWseat(
                java.lang.Iterable<java.lang.String> values) {
              ensureWseatIsMutable();
              com.google.protobuf.AbstractMessageLite.Builder.addAll(
                  values, wseat_);
              onChanged();
              return this;
            }
            /**
             * <pre>
             * Whitelist of buyer seats (e.g., advertisers, agencies) allowed to
             * bid on this deal. IDs of seats and knowledge of the buyer's
             * customers to which they refer must be coordinated between bidders
             * and the exchange a priori. Omission implies no seat restrictions.
             * </pre>
             *
             * <code>repeated string wseat = 4;</code>
             * @return This builder for chaining.
             */
            public Builder clearWseat() {
              wseat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
              bitField0_ = (bitField0_ & ~0x00000008);
              onChanged();
              return this;
            }
            /**
             * <pre>
             * Whitelist of buyer seats (e.g., advertisers, agencies) allowed to
             * bid on this deal. IDs of seats and knowledge of the buyer's
             * customers to which they refer must be coordinated between bidders
             * and the exchange a priori. Omission implies no seat restrictions.
             * </pre>
             *
             * <code>repeated string wseat = 4;</code>
             * @param value The bytes of the wseat to add.
             * @return This builder for chaining.
             */
            public Builder addWseatBytes(
                com.google.protobuf.ByteString value) {
              if (value == null) {
    throw new NullPointerException();
  }
  ensureWseatIsMutable();
              wseat_.add(value);
              onChanged();
              return this;
            }

            private com.google.protobuf.LazyStringList wadomain_ = com.google.protobuf.LazyStringArrayList.EMPTY;
            private void ensureWadomainIsMutable() {
              if (!((bitField0_ & 0x00000010) != 0)) {
                wadomain_ = new com.google.protobuf.LazyStringArrayList(wadomain_);
                bitField0_ |= 0x00000010;
               }
            }
            /**
             * <pre>
             * Array of advertiser domains (e.g., advertiser.com) allowed to
             * bid on this deal. Omission implies no advertiser restrictions.
             * </pre>
             *
             * <code>repeated string wadomain = 5;</code>
             * @return A list containing the wadomain.
             */
            public com.google.protobuf.ProtocolStringList
                getWadomainList() {
              return wadomain_.getUnmodifiableView();
            }
            /**
             * <pre>
             * Array of advertiser domains (e.g., advertiser.com) allowed to
             * bid on this deal. Omission implies no advertiser restrictions.
             * </pre>
             *
             * <code>repeated string wadomain = 5;</code>
             * @return The count of wadomain.
             */
            public int getWadomainCount() {
              return wadomain_.size();
            }
            /**
             * <pre>
             * Array of advertiser domains (e.g., advertiser.com) allowed to
             * bid on this deal. Omission implies no advertiser restrictions.
             * </pre>
             *
             * <code>repeated string wadomain = 5;</code>
             * @param index The index of the element to return.
             * @return The wadomain at the given index.
             */
            public java.lang.String getWadomain(int index) {
              return wadomain_.get(index);
            }
            /**
             * <pre>
             * Array of advertiser domains (e.g., advertiser.com) allowed to
             * bid on this deal. Omission implies no advertiser restrictions.
             * </pre>
             *
             * <code>repeated string wadomain = 5;</code>
             * @param index The index of the value to return.
             * @return The bytes of the wadomain at the given index.
             */
            public com.google.protobuf.ByteString
                getWadomainBytes(int index) {
              return wadomain_.getByteString(index);
            }
            /**
             * <pre>
             * Array of advertiser domains (e.g., advertiser.com) allowed to
             * bid on this deal. Omission implies no advertiser restrictions.
             * </pre>
             *
             * <code>repeated string wadomain = 5;</code>
             * @param index The index to set the value at.
             * @param value The wadomain to set.
             * @return This builder for chaining.
             */
            public Builder setWadomain(
                int index, java.lang.String value) {
              if (value == null) {
    throw new NullPointerException();
  }
  ensureWadomainIsMutable();
              wadomain_.set(index, value);
              onChanged();
              return this;
            }
            /**
             * <pre>
             * Array of advertiser domains (e.g., advertiser.com) allowed to
             * bid on this deal. Omission implies no advertiser restrictions.
             * </pre>
             *
             * <code>repeated string wadomain = 5;</code>
             * @param value The wadomain to add.
             * @return This builder for chaining.
             */
            public Builder addWadomain(
                java.lang.String value) {
              if (value == null) {
    throw new NullPointerException();
  }
  ensureWadomainIsMutable();
              wadomain_.add(value);
              onChanged();
              return this;
            }
            /**
             * <pre>
             * Array of advertiser domains (e.g., advertiser.com) allowed to
             * bid on this deal. Omission implies no advertiser restrictions.
             * </pre>
             *
             * <code>repeated string wadomain = 5;</code>
             * @param values The wadomain to add.
             * @return This builder for chaining.
             */
            public Builder addAllWadomain(
                java.lang.Iterable<java.lang.String> values) {
              ensureWadomainIsMutable();
              com.google.protobuf.AbstractMessageLite.Builder.addAll(
                  values, wadomain_);
              onChanged();
              return this;
            }
            /**
             * <pre>
             * Array of advertiser domains (e.g., advertiser.com) allowed to
             * bid on this deal. Omission implies no advertiser restrictions.
             * </pre>
             *
             * <code>repeated string wadomain = 5;</code>
             * @return This builder for chaining.
             */
            public Builder clearWadomain() {
              wadomain_ = com.google.protobuf.LazyStringArrayList.EMPTY;
              bitField0_ = (bitField0_ & ~0x00000010);
              onChanged();
              return this;
            }
            /**
             * <pre>
             * Array of advertiser domains (e.g., advertiser.com) allowed to
             * bid on this deal. Omission implies no advertiser restrictions.
             * </pre>
             *
             * <code>repeated string wadomain = 5;</code>
             * @param value The bytes of the wadomain to add.
             * @return This builder for chaining.
             */
            public Builder addWadomainBytes(
                com.google.protobuf.ByteString value) {
              if (value == null) {
    throw new NullPointerException();
  }
  ensureWadomainIsMutable();
              wadomain_.add(value);
              onChanged();
              return this;
            }

            private int at_ ;
            /**
             * <pre>
             * Optional override of the overall auction type of the bid request,
             * where 1 = First Price, 2 = Second Price Plus, 3 = the value passed
             * in bidfloor is the agreed upon deal price. Additional auction types
             * can be defined by the exchange.
             * Refer to enum com.iabtechlab.openrtb.v3.AuctionType for generic values.
             * </pre>
             *
             * <code>optional int32 at = 6;</code>
             * @return Whether the at field is set.
             */
            @java.lang.Override
            public boolean hasAt() {
              return ((bitField0_ & 0x00000020) != 0);
            }
            /**
             * <pre>
             * Optional override of the overall auction type of the bid request,
             * where 1 = First Price, 2 = Second Price Plus, 3 = the value passed
             * in bidfloor is the agreed upon deal price. Additional auction types
             * can be defined by the exchange.
             * Refer to enum com.iabtechlab.openrtb.v3.AuctionType for generic values.
             * </pre>
             *
             * <code>optional int32 at = 6;</code>
             * @return The at.
             */
            @java.lang.Override
            public int getAt() {
              return at_;
            }
            /**
             * <pre>
             * Optional override of the overall auction type of the bid request,
             * where 1 = First Price, 2 = Second Price Plus, 3 = the value passed
             * in bidfloor is the agreed upon deal price. Additional auction types
             * can be defined by the exchange.
             * Refer to enum com.iabtechlab.openrtb.v3.AuctionType for generic values.
             * </pre>
             *
             * <code>optional int32 at = 6;</code>
             * @param value The at to set.
             * @return This builder for chaining.
             */
            public Builder setAt(int value) {
              bitField0_ |= 0x00000020;
              at_ = value;
              onChanged();
              return this;
            }
            /**
             * <pre>
             * Optional override of the overall auction type of the bid request,
             * where 1 = First Price, 2 = Second Price Plus, 3 = the value passed
             * in bidfloor is the agreed upon deal price. Additional auction types
             * can be defined by the exchange.
             * Refer to enum com.iabtechlab.openrtb.v3.AuctionType for generic values.
             * </pre>
             *
             * <code>optional int32 at = 6;</code>
             * @return This builder for chaining.
             */
            public Builder clearAt() {
              bitField0_ = (bitField0_ & ~0x00000020);
              at_ = 0;
              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:com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp.Deal)
          }

          // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp.Deal)
          private static final com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal DEFAULT_INSTANCE;
          static {
            DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal();
          }

          public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal getDefaultInstance() {
            return DEFAULT_INSTANCE;
          }

          @java.lang.Deprecated public static final com.google.protobuf.Parser<Deal>
              PARSER = new com.google.protobuf.AbstractParser<Deal>() {
            @java.lang.Override
            public Deal parsePartialFrom(
                com.google.protobuf.CodedInputStream input,
                com.google.protobuf.ExtensionRegistryLite extensionRegistry)
                throws com.google.protobuf.InvalidProtocolBufferException {
              return new Deal(input, extensionRegistry);
            }
          };

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

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

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal getDefaultInstanceForType() {
            return DEFAULT_INSTANCE;
          }

        }

        private int bitField0_;
        public static final int PRIVATE_AUCTION_FIELD_NUMBER = 1;
        private boolean privateAuction_;
        /**
         * <pre>
         * Indicator of auction eligibility to seats named in the Direct Deals
         * object, where 0 = all bids are accepted, 1 = bids are restricted to
         * the deals specified and the terms thereof.
         * </pre>
         *
         * <code>optional bool private_auction = 1 [default = false];</code>
         * @return Whether the privateAuction field is set.
         */
        @java.lang.Override
        public boolean hasPrivateAuction() {
          return ((bitField0_ & 0x00000001) != 0);
        }
        /**
         * <pre>
         * Indicator of auction eligibility to seats named in the Direct Deals
         * object, where 0 = all bids are accepted, 1 = bids are restricted to
         * the deals specified and the terms thereof.
         * </pre>
         *
         * <code>optional bool private_auction = 1 [default = false];</code>
         * @return The privateAuction.
         */
        @java.lang.Override
        public boolean getPrivateAuction() {
          return privateAuction_;
        }

        public static final int DEALS_FIELD_NUMBER = 2;
        private java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal> deals_;
        /**
         * <pre>
         * Array of Deal (Section 3.2.18) objects that convey the specific deals
         * applicable to this impression.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp.Deal deals = 2;</code>
         */
        @java.lang.Override
        public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal> getDealsList() {
          return deals_;
        }
        /**
         * <pre>
         * Array of Deal (Section 3.2.18) objects that convey the specific deals
         * applicable to this impression.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp.Deal deals = 2;</code>
         */
        @java.lang.Override
        public java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.DealOrBuilder> 
            getDealsOrBuilderList() {
          return deals_;
        }
        /**
         * <pre>
         * Array of Deal (Section 3.2.18) objects that convey the specific deals
         * applicable to this impression.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp.Deal deals = 2;</code>
         */
        @java.lang.Override
        public int getDealsCount() {
          return deals_.size();
        }
        /**
         * <pre>
         * Array of Deal (Section 3.2.18) objects that convey the specific deals
         * applicable to this impression.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp.Deal deals = 2;</code>
         */
        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal getDeals(int index) {
          return deals_.get(index);
        }
        /**
         * <pre>
         * Array of Deal (Section 3.2.18) objects that convey the specific deals
         * applicable to this impression.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp.Deal deals = 2;</code>
         */
        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.DealOrBuilder getDealsOrBuilder(
            int index) {
          return deals_.get(index);
        }

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

          for (int i = 0; i < getDealsCount(); i++) {
            if (!getDeals(i).isInitialized()) {
              memoizedIsInitialized = 0;
              return false;
            }
          }
          if (!extensionsAreInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
          memoizedIsInitialized = 1;
          return true;
        }

        @java.lang.Override
        public void writeTo(com.google.protobuf.CodedOutputStream output)
                            throws java.io.IOException {
          com.google.protobuf.GeneratedMessageV3
            .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp>.ExtensionWriter
              extensionWriter = newExtensionWriter();
          if (((bitField0_ & 0x00000001) != 0)) {
            output.writeBool(1, privateAuction_);
          }
          for (int i = 0; i < deals_.size(); i++) {
            output.writeMessage(2, deals_.get(i));
          }
          extensionWriter.writeUntil(10000, output);
          unknownFields.writeTo(output);
        }

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

          size = 0;
          if (((bitField0_ & 0x00000001) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeBoolSize(1, privateAuction_);
          }
          for (int i = 0; i < deals_.size(); i++) {
            size += com.google.protobuf.CodedOutputStream
              .computeMessageSize(2, deals_.get(i));
          }
          size += extensionsSerializedSize();
          size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp)) {
            return super.equals(obj);
          }
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp other = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp) obj;

          if (hasPrivateAuction() != other.hasPrivateAuction()) return false;
          if (hasPrivateAuction()) {
            if (getPrivateAuction()
                != other.getPrivateAuction()) return false;
          }
          if (!getDealsList()
              .equals(other.getDealsList())) return false;
          if (!unknownFields.equals(other.unknownFields)) return false;
          if (!getExtensionFields().equals(other.getExtensionFields()))
            return false;
          return true;
        }

        @java.lang.Override
        public int hashCode() {
          if (memoizedHashCode != 0) {
            return memoizedHashCode;
          }
          int hash = 41;
          hash = (19 * hash) + getDescriptor().hashCode();
          if (hasPrivateAuction()) {
            hash = (37 * hash) + PRIVATE_AUCTION_FIELD_NUMBER;
            hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
                getPrivateAuction());
          }
          if (getDealsCount() > 0) {
            hash = (37 * hash) + DEALS_FIELD_NUMBER;
            hash = (53 * hash) + getDealsList().hashCode();
          }
          hash = hashFields(hash, getExtensionFields());
          hash = (29 * hash) + unknownFields.hashCode();
          memoizedHashCode = hash;
          return hash;
        }

        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp parseFrom(
            java.nio.ByteBuffer data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp parseFrom(
            java.nio.ByteBuffer data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp parseFrom(
            com.google.protobuf.ByteString data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp parseFrom(
            com.google.protobuf.ByteString data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp parseFrom(byte[] data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp parseFrom(
            byte[] data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp parseFrom(java.io.InputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp parseDelimitedFrom(java.io.InputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseDelimitedWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp parseFrom(
            com.google.protobuf.CodedInputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp 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>
         * OpenRTB 2.2: This object is the private marketplace container for
         * direct deals between buyers and sellers that may pertain to this
         * impression. The actual deals are represented as a collection of
         * Deal objects. Refer to Section 7.2 for more details.
         * </pre>
         *
         * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp}
         */
        public static final class Builder extends
            com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp, Builder> implements
            // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp)
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.PmpOrBuilder {
          public static final com.google.protobuf.Descriptors.Descriptor
              getDescriptor() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Pmp_descriptor;
          }

          @java.lang.Override
          protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
              internalGetFieldAccessorTable() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Pmp_fieldAccessorTable
                .ensureFieldAccessorsInitialized(
                    com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Builder.class);
          }

          // Construct using com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.newBuilder()
          private Builder() {
            maybeForceBuilderInitialization();
          }

          private Builder(
              com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
            super(parent);
            maybeForceBuilderInitialization();
          }
          private void maybeForceBuilderInitialization() {
            if (com.google.protobuf.GeneratedMessageV3
                    .alwaysUseFieldBuilders) {
              getDealsFieldBuilder();
            }
          }
          @java.lang.Override
          public Builder clear() {
            super.clear();
            privateAuction_ = false;
            bitField0_ = (bitField0_ & ~0x00000001);
            if (dealsBuilder_ == null) {
              deals_ = java.util.Collections.emptyList();
              bitField0_ = (bitField0_ & ~0x00000002);
            } else {
              dealsBuilder_.clear();
            }
            return this;
          }

          @java.lang.Override
          public com.google.protobuf.Descriptors.Descriptor
              getDescriptorForType() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Pmp_descriptor;
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp getDefaultInstanceForType() {
            return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.getDefaultInstance();
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp build() {
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp result = buildPartial();
            if (!result.isInitialized()) {
              throw newUninitializedMessageException(result);
            }
            return result;
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp buildPartial() {
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp result = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp(this);
            int from_bitField0_ = bitField0_;
            int to_bitField0_ = 0;
            if (((from_bitField0_ & 0x00000001) != 0)) {
              result.privateAuction_ = privateAuction_;
              to_bitField0_ |= 0x00000001;
            }
            if (dealsBuilder_ == null) {
              if (((bitField0_ & 0x00000002) != 0)) {
                deals_ = java.util.Collections.unmodifiableList(deals_);
                bitField0_ = (bitField0_ & ~0x00000002);
              }
              result.deals_ = deals_;
            } else {
              result.deals_ = dealsBuilder_.build();
            }
            result.bitField0_ = to_bitField0_;
            onBuilt();
            return result;
          }

          @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 <Type> Builder setExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp, Type> extension,
              Type value) {
            return super.setExtension(extension, value);
          }
          @java.lang.Override
          public <Type> Builder setExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp, java.util.List<Type>> extension,
              int index, Type value) {
            return super.setExtension(extension, index, value);
          }
          @java.lang.Override
          public <Type> Builder addExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp, java.util.List<Type>> extension,
              Type value) {
            return super.addExtension(extension, value);
          }
          @java.lang.Override
          public <Type> Builder clearExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp, ?> extension) {
            return super.clearExtension(extension);
          }
          @java.lang.Override
          public Builder mergeFrom(com.google.protobuf.Message other) {
            if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp) {
              return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp)other);
            } else {
              super.mergeFrom(other);
              return this;
            }
          }

          public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp other) {
            if (other == com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.getDefaultInstance()) return this;
            if (other.hasPrivateAuction()) {
              setPrivateAuction(other.getPrivateAuction());
            }
            if (dealsBuilder_ == null) {
              if (!other.deals_.isEmpty()) {
                if (deals_.isEmpty()) {
                  deals_ = other.deals_;
                  bitField0_ = (bitField0_ & ~0x00000002);
                } else {
                  ensureDealsIsMutable();
                  deals_.addAll(other.deals_);
                }
                onChanged();
              }
            } else {
              if (!other.deals_.isEmpty()) {
                if (dealsBuilder_.isEmpty()) {
                  dealsBuilder_.dispose();
                  dealsBuilder_ = null;
                  deals_ = other.deals_;
                  bitField0_ = (bitField0_ & ~0x00000002);
                  dealsBuilder_ = 
                    com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
                       getDealsFieldBuilder() : null;
                } else {
                  dealsBuilder_.addAllMessages(other.deals_);
                }
              }
            }
            this.mergeExtensionFields(other);
            this.mergeUnknownFields(other.unknownFields);
            onChanged();
            return this;
          }

          @java.lang.Override
          public final boolean isInitialized() {
            for (int i = 0; i < getDealsCount(); i++) {
              if (!getDeals(i).isInitialized()) {
                return false;
              }
            }
            if (!extensionsAreInitialized()) {
              return false;
            }
            return true;
          }

          @java.lang.Override
          public Builder mergeFrom(
              com.google.protobuf.CodedInputStream input,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp parsedMessage = null;
            try {
              parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
              parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp) e.getUnfinishedMessage();
              throw e.unwrapIOException();
            } finally {
              if (parsedMessage != null) {
                mergeFrom(parsedMessage);
              }
            }
            return this;
          }
          private int bitField0_;

          private boolean privateAuction_ ;
          /**
           * <pre>
           * Indicator of auction eligibility to seats named in the Direct Deals
           * object, where 0 = all bids are accepted, 1 = bids are restricted to
           * the deals specified and the terms thereof.
           * </pre>
           *
           * <code>optional bool private_auction = 1 [default = false];</code>
           * @return Whether the privateAuction field is set.
           */
          @java.lang.Override
          public boolean hasPrivateAuction() {
            return ((bitField0_ & 0x00000001) != 0);
          }
          /**
           * <pre>
           * Indicator of auction eligibility to seats named in the Direct Deals
           * object, where 0 = all bids are accepted, 1 = bids are restricted to
           * the deals specified and the terms thereof.
           * </pre>
           *
           * <code>optional bool private_auction = 1 [default = false];</code>
           * @return The privateAuction.
           */
          @java.lang.Override
          public boolean getPrivateAuction() {
            return privateAuction_;
          }
          /**
           * <pre>
           * Indicator of auction eligibility to seats named in the Direct Deals
           * object, where 0 = all bids are accepted, 1 = bids are restricted to
           * the deals specified and the terms thereof.
           * </pre>
           *
           * <code>optional bool private_auction = 1 [default = false];</code>
           * @param value The privateAuction to set.
           * @return This builder for chaining.
           */
          public Builder setPrivateAuction(boolean value) {
            bitField0_ |= 0x00000001;
            privateAuction_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Indicator of auction eligibility to seats named in the Direct Deals
           * object, where 0 = all bids are accepted, 1 = bids are restricted to
           * the deals specified and the terms thereof.
           * </pre>
           *
           * <code>optional bool private_auction = 1 [default = false];</code>
           * @return This builder for chaining.
           */
          public Builder clearPrivateAuction() {
            bitField0_ = (bitField0_ & ~0x00000001);
            privateAuction_ = false;
            onChanged();
            return this;
          }

          private java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal> deals_ =
            java.util.Collections.emptyList();
          private void ensureDealsIsMutable() {
            if (!((bitField0_ & 0x00000002) != 0)) {
              deals_ = new java.util.ArrayList<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal>(deals_);
              bitField0_ |= 0x00000002;
             }
          }

          private com.google.protobuf.RepeatedFieldBuilderV3<
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.DealOrBuilder> dealsBuilder_;

          /**
           * <pre>
           * Array of Deal (Section 3.2.18) objects that convey the specific deals
           * applicable to this impression.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp.Deal deals = 2;</code>
           */
          public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal> getDealsList() {
            if (dealsBuilder_ == null) {
              return java.util.Collections.unmodifiableList(deals_);
            } else {
              return dealsBuilder_.getMessageList();
            }
          }
          /**
           * <pre>
           * Array of Deal (Section 3.2.18) objects that convey the specific deals
           * applicable to this impression.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp.Deal deals = 2;</code>
           */
          public int getDealsCount() {
            if (dealsBuilder_ == null) {
              return deals_.size();
            } else {
              return dealsBuilder_.getCount();
            }
          }
          /**
           * <pre>
           * Array of Deal (Section 3.2.18) objects that convey the specific deals
           * applicable to this impression.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp.Deal deals = 2;</code>
           */
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal getDeals(int index) {
            if (dealsBuilder_ == null) {
              return deals_.get(index);
            } else {
              return dealsBuilder_.getMessage(index);
            }
          }
          /**
           * <pre>
           * Array of Deal (Section 3.2.18) objects that convey the specific deals
           * applicable to this impression.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp.Deal deals = 2;</code>
           */
          public Builder setDeals(
              int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal value) {
            if (dealsBuilder_ == null) {
              if (value == null) {
                throw new NullPointerException();
              }
              ensureDealsIsMutable();
              deals_.set(index, value);
              onChanged();
            } else {
              dealsBuilder_.setMessage(index, value);
            }
            return this;
          }
          /**
           * <pre>
           * Array of Deal (Section 3.2.18) objects that convey the specific deals
           * applicable to this impression.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp.Deal deals = 2;</code>
           */
          public Builder setDeals(
              int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal.Builder builderForValue) {
            if (dealsBuilder_ == null) {
              ensureDealsIsMutable();
              deals_.set(index, builderForValue.build());
              onChanged();
            } else {
              dealsBuilder_.setMessage(index, builderForValue.build());
            }
            return this;
          }
          /**
           * <pre>
           * Array of Deal (Section 3.2.18) objects that convey the specific deals
           * applicable to this impression.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp.Deal deals = 2;</code>
           */
          public Builder addDeals(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal value) {
            if (dealsBuilder_ == null) {
              if (value == null) {
                throw new NullPointerException();
              }
              ensureDealsIsMutable();
              deals_.add(value);
              onChanged();
            } else {
              dealsBuilder_.addMessage(value);
            }
            return this;
          }
          /**
           * <pre>
           * Array of Deal (Section 3.2.18) objects that convey the specific deals
           * applicable to this impression.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp.Deal deals = 2;</code>
           */
          public Builder addDeals(
              int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal value) {
            if (dealsBuilder_ == null) {
              if (value == null) {
                throw new NullPointerException();
              }
              ensureDealsIsMutable();
              deals_.add(index, value);
              onChanged();
            } else {
              dealsBuilder_.addMessage(index, value);
            }
            return this;
          }
          /**
           * <pre>
           * Array of Deal (Section 3.2.18) objects that convey the specific deals
           * applicable to this impression.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp.Deal deals = 2;</code>
           */
          public Builder addDeals(
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal.Builder builderForValue) {
            if (dealsBuilder_ == null) {
              ensureDealsIsMutable();
              deals_.add(builderForValue.build());
              onChanged();
            } else {
              dealsBuilder_.addMessage(builderForValue.build());
            }
            return this;
          }
          /**
           * <pre>
           * Array of Deal (Section 3.2.18) objects that convey the specific deals
           * applicable to this impression.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp.Deal deals = 2;</code>
           */
          public Builder addDeals(
              int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal.Builder builderForValue) {
            if (dealsBuilder_ == null) {
              ensureDealsIsMutable();
              deals_.add(index, builderForValue.build());
              onChanged();
            } else {
              dealsBuilder_.addMessage(index, builderForValue.build());
            }
            return this;
          }
          /**
           * <pre>
           * Array of Deal (Section 3.2.18) objects that convey the specific deals
           * applicable to this impression.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp.Deal deals = 2;</code>
           */
          public Builder addAllDeals(
              java.lang.Iterable<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal> values) {
            if (dealsBuilder_ == null) {
              ensureDealsIsMutable();
              com.google.protobuf.AbstractMessageLite.Builder.addAll(
                  values, deals_);
              onChanged();
            } else {
              dealsBuilder_.addAllMessages(values);
            }
            return this;
          }
          /**
           * <pre>
           * Array of Deal (Section 3.2.18) objects that convey the specific deals
           * applicable to this impression.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp.Deal deals = 2;</code>
           */
          public Builder clearDeals() {
            if (dealsBuilder_ == null) {
              deals_ = java.util.Collections.emptyList();
              bitField0_ = (bitField0_ & ~0x00000002);
              onChanged();
            } else {
              dealsBuilder_.clear();
            }
            return this;
          }
          /**
           * <pre>
           * Array of Deal (Section 3.2.18) objects that convey the specific deals
           * applicable to this impression.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp.Deal deals = 2;</code>
           */
          public Builder removeDeals(int index) {
            if (dealsBuilder_ == null) {
              ensureDealsIsMutable();
              deals_.remove(index);
              onChanged();
            } else {
              dealsBuilder_.remove(index);
            }
            return this;
          }
          /**
           * <pre>
           * Array of Deal (Section 3.2.18) objects that convey the specific deals
           * applicable to this impression.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp.Deal deals = 2;</code>
           */
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal.Builder getDealsBuilder(
              int index) {
            return getDealsFieldBuilder().getBuilder(index);
          }
          /**
           * <pre>
           * Array of Deal (Section 3.2.18) objects that convey the specific deals
           * applicable to this impression.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp.Deal deals = 2;</code>
           */
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.DealOrBuilder getDealsOrBuilder(
              int index) {
            if (dealsBuilder_ == null) {
              return deals_.get(index);  } else {
              return dealsBuilder_.getMessageOrBuilder(index);
            }
          }
          /**
           * <pre>
           * Array of Deal (Section 3.2.18) objects that convey the specific deals
           * applicable to this impression.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp.Deal deals = 2;</code>
           */
          public java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.DealOrBuilder> 
               getDealsOrBuilderList() {
            if (dealsBuilder_ != null) {
              return dealsBuilder_.getMessageOrBuilderList();
            } else {
              return java.util.Collections.unmodifiableList(deals_);
            }
          }
          /**
           * <pre>
           * Array of Deal (Section 3.2.18) objects that convey the specific deals
           * applicable to this impression.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp.Deal deals = 2;</code>
           */
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal.Builder addDealsBuilder() {
            return getDealsFieldBuilder().addBuilder(
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal.getDefaultInstance());
          }
          /**
           * <pre>
           * Array of Deal (Section 3.2.18) objects that convey the specific deals
           * applicable to this impression.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp.Deal deals = 2;</code>
           */
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal.Builder addDealsBuilder(
              int index) {
            return getDealsFieldBuilder().addBuilder(
                index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal.getDefaultInstance());
          }
          /**
           * <pre>
           * Array of Deal (Section 3.2.18) objects that convey the specific deals
           * applicable to this impression.
           * </pre>
           *
           * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp.Deal deals = 2;</code>
           */
          public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal.Builder> 
               getDealsBuilderList() {
            return getDealsFieldBuilder().getBuilderList();
          }
          private com.google.protobuf.RepeatedFieldBuilderV3<
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.DealOrBuilder> 
              getDealsFieldBuilder() {
            if (dealsBuilder_ == null) {
              dealsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Deal.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.DealOrBuilder>(
                      deals_,
                      ((bitField0_ & 0x00000002) != 0),
                      getParentForChildren(),
                      isClean());
              deals_ = null;
            }
            return dealsBuilder_;
          }
          @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:com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp)
        }

        // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp)
        private static final com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp DEFAULT_INSTANCE;
        static {
          DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp();
        }

        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp getDefaultInstance() {
          return DEFAULT_INSTANCE;
        }

        @java.lang.Deprecated public static final com.google.protobuf.Parser<Pmp>
            PARSER = new com.google.protobuf.AbstractParser<Pmp>() {
          @java.lang.Override
          public Pmp parsePartialFrom(
              com.google.protobuf.CodedInputStream input,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.protobuf.InvalidProtocolBufferException {
            return new Pmp(input, extensionRegistry);
          }
        };

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

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

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp getDefaultInstanceForType() {
          return DEFAULT_INSTANCE;
        }

      }

      private int bitField0_;
      public static final int ID_FIELD_NUMBER = 1;
      private volatile java.lang.Object id_;
      /**
       * <pre>
       * A unique identifier for this impression within the context of the bid
       * request (typically, value starts with 1, and increments up to n
       * for n impressions).
       * </pre>
       *
       * <code>required string id = 1;</code>
       * @return Whether the id field is set.
       */
      @java.lang.Override
      public boolean hasId() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <pre>
       * A unique identifier for this impression within the context of the bid
       * request (typically, value starts with 1, and increments up to n
       * for n impressions).
       * </pre>
       *
       * <code>required string id = 1;</code>
       * @return The id.
       */
      @java.lang.Override
      public java.lang.String getId() {
        java.lang.Object ref = id_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            id_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * A unique identifier for this impression within the context of the bid
       * request (typically, value starts with 1, and increments up to n
       * for n impressions).
       * </pre>
       *
       * <code>required string id = 1;</code>
       * @return The bytes for id.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getIdBytes() {
        java.lang.Object ref = id_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          id_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int BANNER_FIELD_NUMBER = 2;
      private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner banner_;
      /**
       * <pre>
       * A Banner object (Section 3.2.3); required if this impression is
       * offered as a banner ad opportunity.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner banner = 2;</code>
       * @return Whether the banner field is set.
       */
      @java.lang.Override
      public boolean hasBanner() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <pre>
       * A Banner object (Section 3.2.3); required if this impression is
       * offered as a banner ad opportunity.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner banner = 2;</code>
       * @return The banner.
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner getBanner() {
        return banner_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.getDefaultInstance() : banner_;
      }
      /**
       * <pre>
       * A Banner object (Section 3.2.3); required if this impression is
       * offered as a banner ad opportunity.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner banner = 2;</code>
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.BannerOrBuilder getBannerOrBuilder() {
        return banner_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.getDefaultInstance() : banner_;
      }

      public static final int VIDEO_FIELD_NUMBER = 3;
      private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video video_;
      /**
       * <pre>
       * A Video object (Section 3.2.4); required if this impression is
       * offered as a video ad opportunity.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Video video = 3;</code>
       * @return Whether the video field is set.
       */
      @java.lang.Override
      public boolean hasVideo() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <pre>
       * A Video object (Section 3.2.4); required if this impression is
       * offered as a video ad opportunity.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Video video = 3;</code>
       * @return The video.
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video getVideo() {
        return video_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.getDefaultInstance() : video_;
      }
      /**
       * <pre>
       * A Video object (Section 3.2.4); required if this impression is
       * offered as a video ad opportunity.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Video video = 3;</code>
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.VideoOrBuilder getVideoOrBuilder() {
        return video_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.getDefaultInstance() : video_;
      }

      public static final int AUDIO_FIELD_NUMBER = 15;
      private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio audio_;
      /**
       * <pre>
       * An Audio object; required if this impression is offered
       * as an audio ad opportunity.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Audio audio = 15;</code>
       * @return Whether the audio field is set.
       */
      @java.lang.Override
      public boolean hasAudio() {
        return ((bitField0_ & 0x00000008) != 0);
      }
      /**
       * <pre>
       * An Audio object; required if this impression is offered
       * as an audio ad opportunity.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Audio audio = 15;</code>
       * @return The audio.
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio getAudio() {
        return audio_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio.getDefaultInstance() : audio_;
      }
      /**
       * <pre>
       * An Audio object; required if this impression is offered
       * as an audio ad opportunity.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Audio audio = 15;</code>
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.AudioOrBuilder getAudioOrBuilder() {
        return audio_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio.getDefaultInstance() : audio_;
      }

      public static final int DISPLAYMANAGER_FIELD_NUMBER = 4;
      private volatile java.lang.Object displaymanager_;
      /**
       * <pre>
       * Name of ad mediation partner, SDK technology, or player responsible
       * for rendering ad (typically video or mobile). Used by some ad servers
       * to customize ad code by partner. Recommended for video and/or apps.
       * </pre>
       *
       * <code>optional string displaymanager = 4;</code>
       * @return Whether the displaymanager field is set.
       */
      @java.lang.Override
      public boolean hasDisplaymanager() {
        return ((bitField0_ & 0x00000010) != 0);
      }
      /**
       * <pre>
       * Name of ad mediation partner, SDK technology, or player responsible
       * for rendering ad (typically video or mobile). Used by some ad servers
       * to customize ad code by partner. Recommended for video and/or apps.
       * </pre>
       *
       * <code>optional string displaymanager = 4;</code>
       * @return The displaymanager.
       */
      @java.lang.Override
      public java.lang.String getDisplaymanager() {
        java.lang.Object ref = displaymanager_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            displaymanager_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Name of ad mediation partner, SDK technology, or player responsible
       * for rendering ad (typically video or mobile). Used by some ad servers
       * to customize ad code by partner. Recommended for video and/or apps.
       * </pre>
       *
       * <code>optional string displaymanager = 4;</code>
       * @return The bytes for displaymanager.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getDisplaymanagerBytes() {
        java.lang.Object ref = displaymanager_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          displaymanager_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int DISPLAYMANAGERVER_FIELD_NUMBER = 5;
      private volatile java.lang.Object displaymanagerver_;
      /**
       * <pre>
       * Version of ad mediation partner, SDK technology, or player responsible
       * for rendering ad (typically video or mobile). Used by some ad servers
       * to customize ad code by partner. Recommended for video and/or apps.
       * </pre>
       *
       * <code>optional string displaymanagerver = 5;</code>
       * @return Whether the displaymanagerver field is set.
       */
      @java.lang.Override
      public boolean hasDisplaymanagerver() {
        return ((bitField0_ & 0x00000020) != 0);
      }
      /**
       * <pre>
       * Version of ad mediation partner, SDK technology, or player responsible
       * for rendering ad (typically video or mobile). Used by some ad servers
       * to customize ad code by partner. Recommended for video and/or apps.
       * </pre>
       *
       * <code>optional string displaymanagerver = 5;</code>
       * @return The displaymanagerver.
       */
      @java.lang.Override
      public java.lang.String getDisplaymanagerver() {
        java.lang.Object ref = displaymanagerver_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            displaymanagerver_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Version of ad mediation partner, SDK technology, or player responsible
       * for rendering ad (typically video or mobile). Used by some ad servers
       * to customize ad code by partner. Recommended for video and/or apps.
       * </pre>
       *
       * <code>optional string displaymanagerver = 5;</code>
       * @return The bytes for displaymanagerver.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getDisplaymanagerverBytes() {
        java.lang.Object ref = displaymanagerver_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          displaymanagerver_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int INSTL_FIELD_NUMBER = 6;
      private boolean instl_;
      /**
       * <pre>
       * 1 = the ad is interstitial or full screen, 0 = not interstitial.
       * </pre>
       *
       * <code>optional bool instl = 6;</code>
       * @return Whether the instl field is set.
       */
      @java.lang.Override
      public boolean hasInstl() {
        return ((bitField0_ & 0x00000040) != 0);
      }
      /**
       * <pre>
       * 1 = the ad is interstitial or full screen, 0 = not interstitial.
       * </pre>
       *
       * <code>optional bool instl = 6;</code>
       * @return The instl.
       */
      @java.lang.Override
      public boolean getInstl() {
        return instl_;
      }

      public static final int TAGID_FIELD_NUMBER = 7;
      private volatile java.lang.Object tagid_;
      /**
       * <pre>
       * Identifier for specific ad placement or ad tag that was used to
       * initiate the auction. This can be useful for debugging of any issues,
       * or for optimization by the buyer.
       * </pre>
       *
       * <code>optional string tagid = 7;</code>
       * @return Whether the tagid field is set.
       */
      @java.lang.Override
      public boolean hasTagid() {
        return ((bitField0_ & 0x00000080) != 0);
      }
      /**
       * <pre>
       * Identifier for specific ad placement or ad tag that was used to
       * initiate the auction. This can be useful for debugging of any issues,
       * or for optimization by the buyer.
       * </pre>
       *
       * <code>optional string tagid = 7;</code>
       * @return The tagid.
       */
      @java.lang.Override
      public java.lang.String getTagid() {
        java.lang.Object ref = tagid_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            tagid_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Identifier for specific ad placement or ad tag that was used to
       * initiate the auction. This can be useful for debugging of any issues,
       * or for optimization by the buyer.
       * </pre>
       *
       * <code>optional string tagid = 7;</code>
       * @return The bytes for tagid.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getTagidBytes() {
        java.lang.Object ref = tagid_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          tagid_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int BIDFLOOR_FIELD_NUMBER = 8;
      private double bidfloor_;
      /**
       * <pre>
       * Minimum bid for this impression expressed in CPM.
       * </pre>
       *
       * <code>optional double bidfloor = 8 [default = 0];</code>
       * @return Whether the bidfloor field is set.
       */
      @java.lang.Override
      public boolean hasBidfloor() {
        return ((bitField0_ & 0x00000100) != 0);
      }
      /**
       * <pre>
       * Minimum bid for this impression expressed in CPM.
       * </pre>
       *
       * <code>optional double bidfloor = 8 [default = 0];</code>
       * @return The bidfloor.
       */
      @java.lang.Override
      public double getBidfloor() {
        return bidfloor_;
      }

      public static final int BIDFLOORCUR_FIELD_NUMBER = 9;
      private volatile java.lang.Object bidfloorcur_;
      /**
       * <pre>
       * Currency specified using ISO-4217 alpha codes. This may be different
       * from bid currency returned by bidder if this is allowed by the exchange.
       * </pre>
       *
       * <code>optional string bidfloorcur = 9 [default = "USD"];</code>
       * @return Whether the bidfloorcur field is set.
       */
      @java.lang.Override
      public boolean hasBidfloorcur() {
        return ((bitField0_ & 0x00000200) != 0);
      }
      /**
       * <pre>
       * Currency specified using ISO-4217 alpha codes. This may be different
       * from bid currency returned by bidder if this is allowed by the exchange.
       * </pre>
       *
       * <code>optional string bidfloorcur = 9 [default = "USD"];</code>
       * @return The bidfloorcur.
       */
      @java.lang.Override
      public java.lang.String getBidfloorcur() {
        java.lang.Object ref = bidfloorcur_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            bidfloorcur_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Currency specified using ISO-4217 alpha codes. This may be different
       * from bid currency returned by bidder if this is allowed by the exchange.
       * </pre>
       *
       * <code>optional string bidfloorcur = 9 [default = "USD"];</code>
       * @return The bytes for bidfloorcur.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getBidfloorcurBytes() {
        java.lang.Object ref = bidfloorcur_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          bidfloorcur_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int CLICKBROWSER_FIELD_NUMBER = 16;
      private boolean clickbrowser_;
      /**
       * <pre>
       * Indicates the type of browser opened upon clicking the
       * creative in an app, where 0 = embedded, 1 = native.
       * Note that the Safari View Controller in iOS 9.x devices is considered
       * a native browser for purposes of this attribute.
       * </pre>
       *
       * <code>optional bool clickbrowser = 16;</code>
       * @return Whether the clickbrowser field is set.
       */
      @java.lang.Override
      public boolean hasClickbrowser() {
        return ((bitField0_ & 0x00000400) != 0);
      }
      /**
       * <pre>
       * Indicates the type of browser opened upon clicking the
       * creative in an app, where 0 = embedded, 1 = native.
       * Note that the Safari View Controller in iOS 9.x devices is considered
       * a native browser for purposes of this attribute.
       * </pre>
       *
       * <code>optional bool clickbrowser = 16;</code>
       * @return The clickbrowser.
       */
      @java.lang.Override
      public boolean getClickbrowser() {
        return clickbrowser_;
      }

      public static final int SECURE_FIELD_NUMBER = 12;
      private boolean secure_;
      /**
       * <pre>
       * Flag to indicate if the impression requires secure HTTPS URL creative
       * assets and markup, where 0 = non-secure, 1 = secure.  If omitted,
       * the secure state is unknown, but non-secure HTTP support can be assumed.
       * </pre>
       *
       * <code>optional bool secure = 12;</code>
       * @return Whether the secure field is set.
       */
      @java.lang.Override
      public boolean hasSecure() {
        return ((bitField0_ & 0x00000800) != 0);
      }
      /**
       * <pre>
       * Flag to indicate if the impression requires secure HTTPS URL creative
       * assets and markup, where 0 = non-secure, 1 = secure.  If omitted,
       * the secure state is unknown, but non-secure HTTP support can be assumed.
       * </pre>
       *
       * <code>optional bool secure = 12;</code>
       * @return The secure.
       */
      @java.lang.Override
      public boolean getSecure() {
        return secure_;
      }

      public static final int IFRAMEBUSTER_FIELD_NUMBER = 10;
      private com.google.protobuf.LazyStringList iframebuster_;
      /**
       * <pre>
       * Array of exchange-specific names of supported iframe busters.
       * </pre>
       *
       * <code>repeated string iframebuster = 10;</code>
       * @return A list containing the iframebuster.
       */
      public com.google.protobuf.ProtocolStringList
          getIframebusterList() {
        return iframebuster_;
      }
      /**
       * <pre>
       * Array of exchange-specific names of supported iframe busters.
       * </pre>
       *
       * <code>repeated string iframebuster = 10;</code>
       * @return The count of iframebuster.
       */
      public int getIframebusterCount() {
        return iframebuster_.size();
      }
      /**
       * <pre>
       * Array of exchange-specific names of supported iframe busters.
       * </pre>
       *
       * <code>repeated string iframebuster = 10;</code>
       * @param index The index of the element to return.
       * @return The iframebuster at the given index.
       */
      public java.lang.String getIframebuster(int index) {
        return iframebuster_.get(index);
      }
      /**
       * <pre>
       * Array of exchange-specific names of supported iframe busters.
       * </pre>
       *
       * <code>repeated string iframebuster = 10;</code>
       * @param index The index of the value to return.
       * @return The bytes of the iframebuster at the given index.
       */
      public com.google.protobuf.ByteString
          getIframebusterBytes(int index) {
        return iframebuster_.getByteString(index);
      }

      public static final int RWDD_FIELD_NUMBER = 18;
      private boolean rwdd_;
      /**
       * <pre>
       * Indicates whether the user receives a reward for viewing the ad, where 0
       * = no, 1 = yes. Typically video ad implementations allow users to read an
       * additional news article for free, receive an extra life in a game, or get
       * a sponsored ad-free music session. The reward is typically distributed
       * after the video ad is completed.
       * </pre>
       *
       * <code>optional bool rwdd = 18 [default = false];</code>
       * @return Whether the rwdd field is set.
       */
      @java.lang.Override
      public boolean hasRwdd() {
        return ((bitField0_ & 0x00001000) != 0);
      }
      /**
       * <pre>
       * Indicates whether the user receives a reward for viewing the ad, where 0
       * = no, 1 = yes. Typically video ad implementations allow users to read an
       * additional news article for free, receive an extra life in a game, or get
       * a sponsored ad-free music session. The reward is typically distributed
       * after the video ad is completed.
       * </pre>
       *
       * <code>optional bool rwdd = 18 [default = false];</code>
       * @return The rwdd.
       */
      @java.lang.Override
      public boolean getRwdd() {
        return rwdd_;
      }

      public static final int SSAI_FIELD_NUMBER = 19;
      private int ssai_;
      /**
       * <pre>
       * Indicates if server-side ad insertion (e.g., stitching an ad into an
       * audio or video stream) is in use and the impact of this on asset and
       * tracker retrieval, where 0 = status unknown, 1 = all client-side (i.e.,
       * not server-side), 2 = assets stitched server-side but tracking pixels
       * fired client-side, 3 = all server-side.
       * </pre>
       *
       * <code>optional int32 ssai = 19 [default = 0];</code>
       * @return Whether the ssai field is set.
       */
      @java.lang.Override
      public boolean hasSsai() {
        return ((bitField0_ & 0x00002000) != 0);
      }
      /**
       * <pre>
       * Indicates if server-side ad insertion (e.g., stitching an ad into an
       * audio or video stream) is in use and the impact of this on asset and
       * tracker retrieval, where 0 = status unknown, 1 = all client-side (i.e.,
       * not server-side), 2 = assets stitched server-side but tracking pixels
       * fired client-side, 3 = all server-side.
       * </pre>
       *
       * <code>optional int32 ssai = 19 [default = 0];</code>
       * @return The ssai.
       */
      @java.lang.Override
      public int getSsai() {
        return ssai_;
      }

      public static final int PMP_FIELD_NUMBER = 11;
      private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp pmp_;
      /**
       * <pre>
       * A Pmp object (Section 3.2.17) containing any private marketplace deals
       * in effect for this impression.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp pmp = 11;</code>
       * @return Whether the pmp field is set.
       */
      @java.lang.Override
      public boolean hasPmp() {
        return ((bitField0_ & 0x00004000) != 0);
      }
      /**
       * <pre>
       * A Pmp object (Section 3.2.17) containing any private marketplace deals
       * in effect for this impression.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp pmp = 11;</code>
       * @return The pmp.
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp getPmp() {
        return pmp_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.getDefaultInstance() : pmp_;
      }
      /**
       * <pre>
       * A Pmp object (Section 3.2.17) containing any private marketplace deals
       * in effect for this impression.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp pmp = 11;</code>
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.PmpOrBuilder getPmpOrBuilder() {
        return pmp_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.getDefaultInstance() : pmp_;
      }

      public static final int NATIVE_FIELD_NUMBER = 13;
      private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native native_;
      /**
       * <pre>
       * A Native object (Section 3.2.5); required if this impression is
       * offered as a native ad opportunity.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Native native = 13;</code>
       * @return Whether the native field is set.
       */
      @java.lang.Override
      public boolean hasNative() {
        return ((bitField0_ & 0x00008000) != 0);
      }
      /**
       * <pre>
       * A Native object (Section 3.2.5); required if this impression is
       * offered as a native ad opportunity.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Native native = 13;</code>
       * @return The native.
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native getNative() {
        return native_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native.getDefaultInstance() : native_;
      }
      /**
       * <pre>
       * A Native object (Section 3.2.5); required if this impression is
       * offered as a native ad opportunity.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Native native = 13;</code>
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.NativeOrBuilder getNativeOrBuilder() {
        return native_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native.getDefaultInstance() : native_;
      }

      public static final int EXP_FIELD_NUMBER = 14;
      private int exp_;
      /**
       * <pre>
       * Advisory as to the number of seconds that may elapse
       * between the auction and the actual impression.
       * </pre>
       *
       * <code>optional int32 exp = 14;</code>
       * @return Whether the exp field is set.
       */
      @java.lang.Override
      public boolean hasExp() {
        return ((bitField0_ & 0x00010000) != 0);
      }
      /**
       * <pre>
       * Advisory as to the number of seconds that may elapse
       * between the auction and the actual impression.
       * </pre>
       *
       * <code>optional int32 exp = 14;</code>
       * @return The exp.
       */
      @java.lang.Override
      public int getExp() {
        return exp_;
      }

      public static final int METRIC_FIELD_NUMBER = 17;
      private java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric> metric_;
      /**
       * <pre>
       * An array of Metric object (Section 3.2.5).
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Metric metric = 17;</code>
       */
      @java.lang.Override
      public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric> getMetricList() {
        return metric_;
      }
      /**
       * <pre>
       * An array of Metric object (Section 3.2.5).
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Metric metric = 17;</code>
       */
      @java.lang.Override
      public java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.MetricOrBuilder> 
          getMetricOrBuilderList() {
        return metric_;
      }
      /**
       * <pre>
       * An array of Metric object (Section 3.2.5).
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Metric metric = 17;</code>
       */
      @java.lang.Override
      public int getMetricCount() {
        return metric_.size();
      }
      /**
       * <pre>
       * An array of Metric object (Section 3.2.5).
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Metric metric = 17;</code>
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric getMetric(int index) {
        return metric_.get(index);
      }
      /**
       * <pre>
       * An array of Metric object (Section 3.2.5).
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Metric metric = 17;</code>
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.MetricOrBuilder getMetricOrBuilder(
          int index) {
        return metric_.get(index);
      }

      public static final int QTY_FIELD_NUMBER = 20;
      private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty qty_;
      /**
       * <pre>
       * A means of passing a multiplier in the bid request, representing the
       * total quantity of impressions for adverts that display to more than one
       * person.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Qty qty = 20;</code>
       * @return Whether the qty field is set.
       */
      @java.lang.Override
      public boolean hasQty() {
        return ((bitField0_ & 0x00020000) != 0);
      }
      /**
       * <pre>
       * A means of passing a multiplier in the bid request, representing the
       * total quantity of impressions for adverts that display to more than one
       * person.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Qty qty = 20;</code>
       * @return The qty.
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty getQty() {
        return qty_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty.getDefaultInstance() : qty_;
      }
      /**
       * <pre>
       * A means of passing a multiplier in the bid request, representing the
       * total quantity of impressions for adverts that display to more than one
       * person.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Qty qty = 20;</code>
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.QtyOrBuilder getQtyOrBuilder() {
        return qty_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty.getDefaultInstance() : qty_;
      }

      public static final int DT_FIELD_NUMBER = 21;
      private double dt_;
      /**
       * <pre>
       * Timestamp when the item is estimated to be fulfilled (e.g. when a DOOH
       * impression will be displayed) in Unix format (i.e., milliseconds since
       * the epoch).
       * </pre>
       *
       * <code>optional double dt = 21;</code>
       * @return Whether the dt field is set.
       */
      @java.lang.Override
      public boolean hasDt() {
        return ((bitField0_ & 0x00040000) != 0);
      }
      /**
       * <pre>
       * Timestamp when the item is estimated to be fulfilled (e.g. when a DOOH
       * impression will be displayed) in Unix format (i.e., milliseconds since
       * the epoch).
       * </pre>
       *
       * <code>optional double dt = 21;</code>
       * @return The dt.
       */
      @java.lang.Override
      public double getDt() {
        return dt_;
      }

      public static final int REFRESH_FIELD_NUMBER = 22;
      private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh refresh_;
      /**
       * <pre>
       * Details about ad slots being refreshed automatically.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh refresh = 22;</code>
       * @return Whether the refresh field is set.
       */
      @java.lang.Override
      public boolean hasRefresh() {
        return ((bitField0_ & 0x00080000) != 0);
      }
      /**
       * <pre>
       * Details about ad slots being refreshed automatically.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh refresh = 22;</code>
       * @return The refresh.
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh getRefresh() {
        return refresh_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.getDefaultInstance() : refresh_;
      }
      /**
       * <pre>
       * Details about ad slots being refreshed automatically.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh refresh = 22;</code>
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.RefreshOrBuilder getRefreshOrBuilder() {
        return refresh_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.getDefaultInstance() : refresh_;
      }

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

        if (!hasId()) {
          memoizedIsInitialized = 0;
          return false;
        }
        if (hasBanner()) {
          if (!getBanner().isInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
        }
        if (hasVideo()) {
          if (!getVideo().isInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
        }
        if (hasAudio()) {
          if (!getAudio().isInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
        }
        if (hasPmp()) {
          if (!getPmp().isInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
        }
        if (hasNative()) {
          if (!getNative().isInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
        }
        for (int i = 0; i < getMetricCount(); i++) {
          if (!getMetric(i).isInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
        }
        if (hasQty()) {
          if (!getQty().isInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
        }
        if (hasRefresh()) {
          if (!getRefresh().isInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
        }
        if (!extensionsAreInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
        memoizedIsInitialized = 1;
        return true;
      }

      @java.lang.Override
      public void writeTo(com.google.protobuf.CodedOutputStream output)
                          throws java.io.IOException {
        com.google.protobuf.GeneratedMessageV3
          .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp>.ExtensionWriter
            extensionWriter = newExtensionWriter();
        if (((bitField0_ & 0x00000001) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 1, id_);
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          output.writeMessage(2, getBanner());
        }
        if (((bitField0_ & 0x00000004) != 0)) {
          output.writeMessage(3, getVideo());
        }
        if (((bitField0_ & 0x00000010) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 4, displaymanager_);
        }
        if (((bitField0_ & 0x00000020) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 5, displaymanagerver_);
        }
        if (((bitField0_ & 0x00000040) != 0)) {
          output.writeBool(6, instl_);
        }
        if (((bitField0_ & 0x00000080) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 7, tagid_);
        }
        if (((bitField0_ & 0x00000100) != 0)) {
          output.writeDouble(8, bidfloor_);
        }
        if (((bitField0_ & 0x00000200) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 9, bidfloorcur_);
        }
        for (int i = 0; i < iframebuster_.size(); i++) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 10, iframebuster_.getRaw(i));
        }
        if (((bitField0_ & 0x00004000) != 0)) {
          output.writeMessage(11, getPmp());
        }
        if (((bitField0_ & 0x00000800) != 0)) {
          output.writeBool(12, secure_);
        }
        if (((bitField0_ & 0x00008000) != 0)) {
          output.writeMessage(13, getNative());
        }
        if (((bitField0_ & 0x00010000) != 0)) {
          output.writeInt32(14, exp_);
        }
        if (((bitField0_ & 0x00000008) != 0)) {
          output.writeMessage(15, getAudio());
        }
        if (((bitField0_ & 0x00000400) != 0)) {
          output.writeBool(16, clickbrowser_);
        }
        for (int i = 0; i < metric_.size(); i++) {
          output.writeMessage(17, metric_.get(i));
        }
        if (((bitField0_ & 0x00001000) != 0)) {
          output.writeBool(18, rwdd_);
        }
        if (((bitField0_ & 0x00002000) != 0)) {
          output.writeInt32(19, ssai_);
        }
        if (((bitField0_ & 0x00020000) != 0)) {
          output.writeMessage(20, getQty());
        }
        if (((bitField0_ & 0x00040000) != 0)) {
          output.writeDouble(21, dt_);
        }
        if (((bitField0_ & 0x00080000) != 0)) {
          output.writeMessage(22, getRefresh());
        }
        extensionWriter.writeUntil(10000, output);
        unknownFields.writeTo(output);
      }

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

        size = 0;
        if (((bitField0_ & 0x00000001) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, id_);
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeMessageSize(2, getBanner());
        }
        if (((bitField0_ & 0x00000004) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeMessageSize(3, getVideo());
        }
        if (((bitField0_ & 0x00000010) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, displaymanager_);
        }
        if (((bitField0_ & 0x00000020) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(5, displaymanagerver_);
        }
        if (((bitField0_ & 0x00000040) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeBoolSize(6, instl_);
        }
        if (((bitField0_ & 0x00000080) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(7, tagid_);
        }
        if (((bitField0_ & 0x00000100) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeDoubleSize(8, bidfloor_);
        }
        if (((bitField0_ & 0x00000200) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(9, bidfloorcur_);
        }
        {
          int dataSize = 0;
          for (int i = 0; i < iframebuster_.size(); i++) {
            dataSize += computeStringSizeNoTag(iframebuster_.getRaw(i));
          }
          size += dataSize;
          size += 1 * getIframebusterList().size();
        }
        if (((bitField0_ & 0x00004000) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeMessageSize(11, getPmp());
        }
        if (((bitField0_ & 0x00000800) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeBoolSize(12, secure_);
        }
        if (((bitField0_ & 0x00008000) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeMessageSize(13, getNative());
        }
        if (((bitField0_ & 0x00010000) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeInt32Size(14, exp_);
        }
        if (((bitField0_ & 0x00000008) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeMessageSize(15, getAudio());
        }
        if (((bitField0_ & 0x00000400) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeBoolSize(16, clickbrowser_);
        }
        for (int i = 0; i < metric_.size(); i++) {
          size += com.google.protobuf.CodedOutputStream
            .computeMessageSize(17, metric_.get(i));
        }
        if (((bitField0_ & 0x00001000) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeBoolSize(18, rwdd_);
        }
        if (((bitField0_ & 0x00002000) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeInt32Size(19, ssai_);
        }
        if (((bitField0_ & 0x00020000) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeMessageSize(20, getQty());
        }
        if (((bitField0_ & 0x00040000) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeDoubleSize(21, dt_);
        }
        if (((bitField0_ & 0x00080000) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeMessageSize(22, getRefresh());
        }
        size += extensionsSerializedSize();
        size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp)) {
          return super.equals(obj);
        }
        com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp other = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp) obj;

        if (hasId() != other.hasId()) return false;
        if (hasId()) {
          if (!getId()
              .equals(other.getId())) return false;
        }
        if (hasBanner() != other.hasBanner()) return false;
        if (hasBanner()) {
          if (!getBanner()
              .equals(other.getBanner())) return false;
        }
        if (hasVideo() != other.hasVideo()) return false;
        if (hasVideo()) {
          if (!getVideo()
              .equals(other.getVideo())) return false;
        }
        if (hasAudio() != other.hasAudio()) return false;
        if (hasAudio()) {
          if (!getAudio()
              .equals(other.getAudio())) return false;
        }
        if (hasDisplaymanager() != other.hasDisplaymanager()) return false;
        if (hasDisplaymanager()) {
          if (!getDisplaymanager()
              .equals(other.getDisplaymanager())) return false;
        }
        if (hasDisplaymanagerver() != other.hasDisplaymanagerver()) return false;
        if (hasDisplaymanagerver()) {
          if (!getDisplaymanagerver()
              .equals(other.getDisplaymanagerver())) return false;
        }
        if (hasInstl() != other.hasInstl()) return false;
        if (hasInstl()) {
          if (getInstl()
              != other.getInstl()) return false;
        }
        if (hasTagid() != other.hasTagid()) return false;
        if (hasTagid()) {
          if (!getTagid()
              .equals(other.getTagid())) return false;
        }
        if (hasBidfloor() != other.hasBidfloor()) return false;
        if (hasBidfloor()) {
          if (java.lang.Double.doubleToLongBits(getBidfloor())
              != java.lang.Double.doubleToLongBits(
                  other.getBidfloor())) return false;
        }
        if (hasBidfloorcur() != other.hasBidfloorcur()) return false;
        if (hasBidfloorcur()) {
          if (!getBidfloorcur()
              .equals(other.getBidfloorcur())) return false;
        }
        if (hasClickbrowser() != other.hasClickbrowser()) return false;
        if (hasClickbrowser()) {
          if (getClickbrowser()
              != other.getClickbrowser()) return false;
        }
        if (hasSecure() != other.hasSecure()) return false;
        if (hasSecure()) {
          if (getSecure()
              != other.getSecure()) return false;
        }
        if (!getIframebusterList()
            .equals(other.getIframebusterList())) return false;
        if (hasRwdd() != other.hasRwdd()) return false;
        if (hasRwdd()) {
          if (getRwdd()
              != other.getRwdd()) return false;
        }
        if (hasSsai() != other.hasSsai()) return false;
        if (hasSsai()) {
          if (getSsai()
              != other.getSsai()) return false;
        }
        if (hasPmp() != other.hasPmp()) return false;
        if (hasPmp()) {
          if (!getPmp()
              .equals(other.getPmp())) return false;
        }
        if (hasNative() != other.hasNative()) return false;
        if (hasNative()) {
          if (!getNative()
              .equals(other.getNative())) return false;
        }
        if (hasExp() != other.hasExp()) return false;
        if (hasExp()) {
          if (getExp()
              != other.getExp()) return false;
        }
        if (!getMetricList()
            .equals(other.getMetricList())) return false;
        if (hasQty() != other.hasQty()) return false;
        if (hasQty()) {
          if (!getQty()
              .equals(other.getQty())) return false;
        }
        if (hasDt() != other.hasDt()) return false;
        if (hasDt()) {
          if (java.lang.Double.doubleToLongBits(getDt())
              != java.lang.Double.doubleToLongBits(
                  other.getDt())) return false;
        }
        if (hasRefresh() != other.hasRefresh()) return false;
        if (hasRefresh()) {
          if (!getRefresh()
              .equals(other.getRefresh())) return false;
        }
        if (!unknownFields.equals(other.unknownFields)) return false;
        if (!getExtensionFields().equals(other.getExtensionFields()))
          return false;
        return true;
      }

      @java.lang.Override
      public int hashCode() {
        if (memoizedHashCode != 0) {
          return memoizedHashCode;
        }
        int hash = 41;
        hash = (19 * hash) + getDescriptor().hashCode();
        if (hasId()) {
          hash = (37 * hash) + ID_FIELD_NUMBER;
          hash = (53 * hash) + getId().hashCode();
        }
        if (hasBanner()) {
          hash = (37 * hash) + BANNER_FIELD_NUMBER;
          hash = (53 * hash) + getBanner().hashCode();
        }
        if (hasVideo()) {
          hash = (37 * hash) + VIDEO_FIELD_NUMBER;
          hash = (53 * hash) + getVideo().hashCode();
        }
        if (hasAudio()) {
          hash = (37 * hash) + AUDIO_FIELD_NUMBER;
          hash = (53 * hash) + getAudio().hashCode();
        }
        if (hasDisplaymanager()) {
          hash = (37 * hash) + DISPLAYMANAGER_FIELD_NUMBER;
          hash = (53 * hash) + getDisplaymanager().hashCode();
        }
        if (hasDisplaymanagerver()) {
          hash = (37 * hash) + DISPLAYMANAGERVER_FIELD_NUMBER;
          hash = (53 * hash) + getDisplaymanagerver().hashCode();
        }
        if (hasInstl()) {
          hash = (37 * hash) + INSTL_FIELD_NUMBER;
          hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
              getInstl());
        }
        if (hasTagid()) {
          hash = (37 * hash) + TAGID_FIELD_NUMBER;
          hash = (53 * hash) + getTagid().hashCode();
        }
        if (hasBidfloor()) {
          hash = (37 * hash) + BIDFLOOR_FIELD_NUMBER;
          hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
              java.lang.Double.doubleToLongBits(getBidfloor()));
        }
        if (hasBidfloorcur()) {
          hash = (37 * hash) + BIDFLOORCUR_FIELD_NUMBER;
          hash = (53 * hash) + getBidfloorcur().hashCode();
        }
        if (hasClickbrowser()) {
          hash = (37 * hash) + CLICKBROWSER_FIELD_NUMBER;
          hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
              getClickbrowser());
        }
        if (hasSecure()) {
          hash = (37 * hash) + SECURE_FIELD_NUMBER;
          hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
              getSecure());
        }
        if (getIframebusterCount() > 0) {
          hash = (37 * hash) + IFRAMEBUSTER_FIELD_NUMBER;
          hash = (53 * hash) + getIframebusterList().hashCode();
        }
        if (hasRwdd()) {
          hash = (37 * hash) + RWDD_FIELD_NUMBER;
          hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
              getRwdd());
        }
        if (hasSsai()) {
          hash = (37 * hash) + SSAI_FIELD_NUMBER;
          hash = (53 * hash) + getSsai();
        }
        if (hasPmp()) {
          hash = (37 * hash) + PMP_FIELD_NUMBER;
          hash = (53 * hash) + getPmp().hashCode();
        }
        if (hasNative()) {
          hash = (37 * hash) + NATIVE_FIELD_NUMBER;
          hash = (53 * hash) + getNative().hashCode();
        }
        if (hasExp()) {
          hash = (37 * hash) + EXP_FIELD_NUMBER;
          hash = (53 * hash) + getExp();
        }
        if (getMetricCount() > 0) {
          hash = (37 * hash) + METRIC_FIELD_NUMBER;
          hash = (53 * hash) + getMetricList().hashCode();
        }
        if (hasQty()) {
          hash = (37 * hash) + QTY_FIELD_NUMBER;
          hash = (53 * hash) + getQty().hashCode();
        }
        if (hasDt()) {
          hash = (37 * hash) + DT_FIELD_NUMBER;
          hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
              java.lang.Double.doubleToLongBits(getDt()));
        }
        if (hasRefresh()) {
          hash = (37 * hash) + REFRESH_FIELD_NUMBER;
          hash = (53 * hash) + getRefresh().hashCode();
        }
        hash = hashFields(hash, getExtensionFields());
        hash = (29 * hash) + unknownFields.hashCode();
        memoizedHashCode = hash;
        return hash;
      }

      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp parseFrom(
          java.nio.ByteBuffer data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp parseFrom(
          java.nio.ByteBuffer data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp parseFrom(
          com.google.protobuf.ByteString data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp parseFrom(
          com.google.protobuf.ByteString data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp parseFrom(byte[] data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp parseFrom(
          byte[] data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp parseFrom(java.io.InputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp parseDelimitedFrom(java.io.InputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseDelimitedWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp parseFrom(
          com.google.protobuf.CodedInputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp 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>
       * OpenRTB 2.0: This object describes an ad placement or impression
       * being auctioned.  A single bid request can include multiple Imp objects,
       * a use case for which might be an exchange that supports selling all
       * ad positions on a given page.  Each Imp object has a required ID so that
       * bids can reference them individually.
       * The presence of Banner (Section 3.2.3), Video (Section 3.2.4),
       * and/or Native (Section 3.2.5) objects subordinate to the Imp object
       * indicates the type of impression being offered. The publisher can choose
       * one such type which is the typical case or mix them at their discretion.
       * Any given bid for the impression must conform to one of the offered types.
       * </pre>
       *
       * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Imp}
       */
      public static final class Builder extends
          com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp, Builder> implements
          // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.BidRequest.Imp)
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.ImpOrBuilder {
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_descriptor;
        }

        @java.lang.Override
        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Builder.class);
        }

        // Construct using com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.newBuilder()
        private Builder() {
          maybeForceBuilderInitialization();
        }

        private Builder(
            com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
          super(parent);
          maybeForceBuilderInitialization();
        }
        private void maybeForceBuilderInitialization() {
          if (com.google.protobuf.GeneratedMessageV3
                  .alwaysUseFieldBuilders) {
            getBannerFieldBuilder();
            getVideoFieldBuilder();
            getAudioFieldBuilder();
            getPmpFieldBuilder();
            getNativeFieldBuilder();
            getMetricFieldBuilder();
            getQtyFieldBuilder();
            getRefreshFieldBuilder();
          }
        }
        @java.lang.Override
        public Builder clear() {
          super.clear();
          id_ = "";
          bitField0_ = (bitField0_ & ~0x00000001);
          if (bannerBuilder_ == null) {
            banner_ = null;
          } else {
            bannerBuilder_.clear();
          }
          bitField0_ = (bitField0_ & ~0x00000002);
          if (videoBuilder_ == null) {
            video_ = null;
          } else {
            videoBuilder_.clear();
          }
          bitField0_ = (bitField0_ & ~0x00000004);
          if (audioBuilder_ == null) {
            audio_ = null;
          } else {
            audioBuilder_.clear();
          }
          bitField0_ = (bitField0_ & ~0x00000008);
          displaymanager_ = "";
          bitField0_ = (bitField0_ & ~0x00000010);
          displaymanagerver_ = "";
          bitField0_ = (bitField0_ & ~0x00000020);
          instl_ = false;
          bitField0_ = (bitField0_ & ~0x00000040);
          tagid_ = "";
          bitField0_ = (bitField0_ & ~0x00000080);
          bidfloor_ = 0D;
          bitField0_ = (bitField0_ & ~0x00000100);
          bidfloorcur_ = "USD";
          bitField0_ = (bitField0_ & ~0x00000200);
          clickbrowser_ = false;
          bitField0_ = (bitField0_ & ~0x00000400);
          secure_ = false;
          bitField0_ = (bitField0_ & ~0x00000800);
          iframebuster_ = com.google.protobuf.LazyStringArrayList.EMPTY;
          bitField0_ = (bitField0_ & ~0x00001000);
          rwdd_ = false;
          bitField0_ = (bitField0_ & ~0x00002000);
          ssai_ = 0;
          bitField0_ = (bitField0_ & ~0x00004000);
          if (pmpBuilder_ == null) {
            pmp_ = null;
          } else {
            pmpBuilder_.clear();
          }
          bitField0_ = (bitField0_ & ~0x00008000);
          if (nativeBuilder_ == null) {
            native_ = null;
          } else {
            nativeBuilder_.clear();
          }
          bitField0_ = (bitField0_ & ~0x00010000);
          exp_ = 0;
          bitField0_ = (bitField0_ & ~0x00020000);
          if (metricBuilder_ == null) {
            metric_ = java.util.Collections.emptyList();
            bitField0_ = (bitField0_ & ~0x00040000);
          } else {
            metricBuilder_.clear();
          }
          if (qtyBuilder_ == null) {
            qty_ = null;
          } else {
            qtyBuilder_.clear();
          }
          bitField0_ = (bitField0_ & ~0x00080000);
          dt_ = 0D;
          bitField0_ = (bitField0_ & ~0x00100000);
          if (refreshBuilder_ == null) {
            refresh_ = null;
          } else {
            refreshBuilder_.clear();
          }
          bitField0_ = (bitField0_ & ~0x00200000);
          return this;
        }

        @java.lang.Override
        public com.google.protobuf.Descriptors.Descriptor
            getDescriptorForType() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_descriptor;
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp getDefaultInstanceForType() {
          return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.getDefaultInstance();
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp build() {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp result = buildPartial();
          if (!result.isInitialized()) {
            throw newUninitializedMessageException(result);
          }
          return result;
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp buildPartial() {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp result = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp(this);
          int from_bitField0_ = bitField0_;
          int to_bitField0_ = 0;
          if (((from_bitField0_ & 0x00000001) != 0)) {
            to_bitField0_ |= 0x00000001;
          }
          result.id_ = id_;
          if (((from_bitField0_ & 0x00000002) != 0)) {
            if (bannerBuilder_ == null) {
              result.banner_ = banner_;
            } else {
              result.banner_ = bannerBuilder_.build();
            }
            to_bitField0_ |= 0x00000002;
          }
          if (((from_bitField0_ & 0x00000004) != 0)) {
            if (videoBuilder_ == null) {
              result.video_ = video_;
            } else {
              result.video_ = videoBuilder_.build();
            }
            to_bitField0_ |= 0x00000004;
          }
          if (((from_bitField0_ & 0x00000008) != 0)) {
            if (audioBuilder_ == null) {
              result.audio_ = audio_;
            } else {
              result.audio_ = audioBuilder_.build();
            }
            to_bitField0_ |= 0x00000008;
          }
          if (((from_bitField0_ & 0x00000010) != 0)) {
            to_bitField0_ |= 0x00000010;
          }
          result.displaymanager_ = displaymanager_;
          if (((from_bitField0_ & 0x00000020) != 0)) {
            to_bitField0_ |= 0x00000020;
          }
          result.displaymanagerver_ = displaymanagerver_;
          if (((from_bitField0_ & 0x00000040) != 0)) {
            result.instl_ = instl_;
            to_bitField0_ |= 0x00000040;
          }
          if (((from_bitField0_ & 0x00000080) != 0)) {
            to_bitField0_ |= 0x00000080;
          }
          result.tagid_ = tagid_;
          if (((from_bitField0_ & 0x00000100) != 0)) {
            result.bidfloor_ = bidfloor_;
            to_bitField0_ |= 0x00000100;
          }
          if (((from_bitField0_ & 0x00000200) != 0)) {
            to_bitField0_ |= 0x00000200;
          }
          result.bidfloorcur_ = bidfloorcur_;
          if (((from_bitField0_ & 0x00000400) != 0)) {
            result.clickbrowser_ = clickbrowser_;
            to_bitField0_ |= 0x00000400;
          }
          if (((from_bitField0_ & 0x00000800) != 0)) {
            result.secure_ = secure_;
            to_bitField0_ |= 0x00000800;
          }
          if (((bitField0_ & 0x00001000) != 0)) {
            iframebuster_ = iframebuster_.getUnmodifiableView();
            bitField0_ = (bitField0_ & ~0x00001000);
          }
          result.iframebuster_ = iframebuster_;
          if (((from_bitField0_ & 0x00002000) != 0)) {
            result.rwdd_ = rwdd_;
            to_bitField0_ |= 0x00001000;
          }
          if (((from_bitField0_ & 0x00004000) != 0)) {
            result.ssai_ = ssai_;
            to_bitField0_ |= 0x00002000;
          }
          if (((from_bitField0_ & 0x00008000) != 0)) {
            if (pmpBuilder_ == null) {
              result.pmp_ = pmp_;
            } else {
              result.pmp_ = pmpBuilder_.build();
            }
            to_bitField0_ |= 0x00004000;
          }
          if (((from_bitField0_ & 0x00010000) != 0)) {
            if (nativeBuilder_ == null) {
              result.native_ = native_;
            } else {
              result.native_ = nativeBuilder_.build();
            }
            to_bitField0_ |= 0x00008000;
          }
          if (((from_bitField0_ & 0x00020000) != 0)) {
            result.exp_ = exp_;
            to_bitField0_ |= 0x00010000;
          }
          if (metricBuilder_ == null) {
            if (((bitField0_ & 0x00040000) != 0)) {
              metric_ = java.util.Collections.unmodifiableList(metric_);
              bitField0_ = (bitField0_ & ~0x00040000);
            }
            result.metric_ = metric_;
          } else {
            result.metric_ = metricBuilder_.build();
          }
          if (((from_bitField0_ & 0x00080000) != 0)) {
            if (qtyBuilder_ == null) {
              result.qty_ = qty_;
            } else {
              result.qty_ = qtyBuilder_.build();
            }
            to_bitField0_ |= 0x00020000;
          }
          if (((from_bitField0_ & 0x00100000) != 0)) {
            result.dt_ = dt_;
            to_bitField0_ |= 0x00040000;
          }
          if (((from_bitField0_ & 0x00200000) != 0)) {
            if (refreshBuilder_ == null) {
              result.refresh_ = refresh_;
            } else {
              result.refresh_ = refreshBuilder_.build();
            }
            to_bitField0_ |= 0x00080000;
          }
          result.bitField0_ = to_bitField0_;
          onBuilt();
          return result;
        }

        @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 <Type> Builder setExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp, Type> extension,
            Type value) {
          return super.setExtension(extension, value);
        }
        @java.lang.Override
        public <Type> Builder setExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp, java.util.List<Type>> extension,
            int index, Type value) {
          return super.setExtension(extension, index, value);
        }
        @java.lang.Override
        public <Type> Builder addExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp, java.util.List<Type>> extension,
            Type value) {
          return super.addExtension(extension, value);
        }
        @java.lang.Override
        public <Type> Builder clearExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp, ?> extension) {
          return super.clearExtension(extension);
        }
        @java.lang.Override
        public Builder mergeFrom(com.google.protobuf.Message other) {
          if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp) {
            return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp)other);
          } else {
            super.mergeFrom(other);
            return this;
          }
        }

        public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp other) {
          if (other == com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.getDefaultInstance()) return this;
          if (other.hasId()) {
            bitField0_ |= 0x00000001;
            id_ = other.id_;
            onChanged();
          }
          if (other.hasBanner()) {
            mergeBanner(other.getBanner());
          }
          if (other.hasVideo()) {
            mergeVideo(other.getVideo());
          }
          if (other.hasAudio()) {
            mergeAudio(other.getAudio());
          }
          if (other.hasDisplaymanager()) {
            bitField0_ |= 0x00000010;
            displaymanager_ = other.displaymanager_;
            onChanged();
          }
          if (other.hasDisplaymanagerver()) {
            bitField0_ |= 0x00000020;
            displaymanagerver_ = other.displaymanagerver_;
            onChanged();
          }
          if (other.hasInstl()) {
            setInstl(other.getInstl());
          }
          if (other.hasTagid()) {
            bitField0_ |= 0x00000080;
            tagid_ = other.tagid_;
            onChanged();
          }
          if (other.hasBidfloor()) {
            setBidfloor(other.getBidfloor());
          }
          if (other.hasBidfloorcur()) {
            bitField0_ |= 0x00000200;
            bidfloorcur_ = other.bidfloorcur_;
            onChanged();
          }
          if (other.hasClickbrowser()) {
            setClickbrowser(other.getClickbrowser());
          }
          if (other.hasSecure()) {
            setSecure(other.getSecure());
          }
          if (!other.iframebuster_.isEmpty()) {
            if (iframebuster_.isEmpty()) {
              iframebuster_ = other.iframebuster_;
              bitField0_ = (bitField0_ & ~0x00001000);
            } else {
              ensureIframebusterIsMutable();
              iframebuster_.addAll(other.iframebuster_);
            }
            onChanged();
          }
          if (other.hasRwdd()) {
            setRwdd(other.getRwdd());
          }
          if (other.hasSsai()) {
            setSsai(other.getSsai());
          }
          if (other.hasPmp()) {
            mergePmp(other.getPmp());
          }
          if (other.hasNative()) {
            mergeNative(other.getNative());
          }
          if (other.hasExp()) {
            setExp(other.getExp());
          }
          if (metricBuilder_ == null) {
            if (!other.metric_.isEmpty()) {
              if (metric_.isEmpty()) {
                metric_ = other.metric_;
                bitField0_ = (bitField0_ & ~0x00040000);
              } else {
                ensureMetricIsMutable();
                metric_.addAll(other.metric_);
              }
              onChanged();
            }
          } else {
            if (!other.metric_.isEmpty()) {
              if (metricBuilder_.isEmpty()) {
                metricBuilder_.dispose();
                metricBuilder_ = null;
                metric_ = other.metric_;
                bitField0_ = (bitField0_ & ~0x00040000);
                metricBuilder_ = 
                  com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
                     getMetricFieldBuilder() : null;
              } else {
                metricBuilder_.addAllMessages(other.metric_);
              }
            }
          }
          if (other.hasQty()) {
            mergeQty(other.getQty());
          }
          if (other.hasDt()) {
            setDt(other.getDt());
          }
          if (other.hasRefresh()) {
            mergeRefresh(other.getRefresh());
          }
          this.mergeExtensionFields(other);
          this.mergeUnknownFields(other.unknownFields);
          onChanged();
          return this;
        }

        @java.lang.Override
        public final boolean isInitialized() {
          if (!hasId()) {
            return false;
          }
          if (hasBanner()) {
            if (!getBanner().isInitialized()) {
              return false;
            }
          }
          if (hasVideo()) {
            if (!getVideo().isInitialized()) {
              return false;
            }
          }
          if (hasAudio()) {
            if (!getAudio().isInitialized()) {
              return false;
            }
          }
          if (hasPmp()) {
            if (!getPmp().isInitialized()) {
              return false;
            }
          }
          if (hasNative()) {
            if (!getNative().isInitialized()) {
              return false;
            }
          }
          for (int i = 0; i < getMetricCount(); i++) {
            if (!getMetric(i).isInitialized()) {
              return false;
            }
          }
          if (hasQty()) {
            if (!getQty().isInitialized()) {
              return false;
            }
          }
          if (hasRefresh()) {
            if (!getRefresh().isInitialized()) {
              return false;
            }
          }
          if (!extensionsAreInitialized()) {
            return false;
          }
          return true;
        }

        @java.lang.Override
        public Builder mergeFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws java.io.IOException {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp parsedMessage = null;
          try {
            parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp) e.getUnfinishedMessage();
            throw e.unwrapIOException();
          } finally {
            if (parsedMessage != null) {
              mergeFrom(parsedMessage);
            }
          }
          return this;
        }
        private int bitField0_;

        private java.lang.Object id_ = "";
        /**
         * <pre>
         * A unique identifier for this impression within the context of the bid
         * request (typically, value starts with 1, and increments up to n
         * for n impressions).
         * </pre>
         *
         * <code>required string id = 1;</code>
         * @return Whether the id field is set.
         */
        public boolean hasId() {
          return ((bitField0_ & 0x00000001) != 0);
        }
        /**
         * <pre>
         * A unique identifier for this impression within the context of the bid
         * request (typically, value starts with 1, and increments up to n
         * for n impressions).
         * </pre>
         *
         * <code>required string id = 1;</code>
         * @return The id.
         */
        public java.lang.String getId() {
          java.lang.Object ref = id_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              id_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * A unique identifier for this impression within the context of the bid
         * request (typically, value starts with 1, and increments up to n
         * for n impressions).
         * </pre>
         *
         * <code>required string id = 1;</code>
         * @return The bytes for id.
         */
        public com.google.protobuf.ByteString
            getIdBytes() {
          java.lang.Object ref = id_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            id_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * A unique identifier for this impression within the context of the bid
         * request (typically, value starts with 1, and increments up to n
         * for n impressions).
         * </pre>
         *
         * <code>required string id = 1;</code>
         * @param value The id to set.
         * @return This builder for chaining.
         */
        public Builder setId(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
          id_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * A unique identifier for this impression within the context of the bid
         * request (typically, value starts with 1, and increments up to n
         * for n impressions).
         * </pre>
         *
         * <code>required string id = 1;</code>
         * @return This builder for chaining.
         */
        public Builder clearId() {
          bitField0_ = (bitField0_ & ~0x00000001);
          id_ = getDefaultInstance().getId();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * A unique identifier for this impression within the context of the bid
         * request (typically, value starts with 1, and increments up to n
         * for n impressions).
         * </pre>
         *
         * <code>required string id = 1;</code>
         * @param value The bytes for id to set.
         * @return This builder for chaining.
         */
        public Builder setIdBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
          id_ = value;
          onChanged();
          return this;
        }

        private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner banner_;
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.BannerOrBuilder> bannerBuilder_;
        /**
         * <pre>
         * A Banner object (Section 3.2.3); required if this impression is
         * offered as a banner ad opportunity.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner banner = 2;</code>
         * @return Whether the banner field is set.
         */
        public boolean hasBanner() {
          return ((bitField0_ & 0x00000002) != 0);
        }
        /**
         * <pre>
         * A Banner object (Section 3.2.3); required if this impression is
         * offered as a banner ad opportunity.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner banner = 2;</code>
         * @return The banner.
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner getBanner() {
          if (bannerBuilder_ == null) {
            return banner_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.getDefaultInstance() : banner_;
          } else {
            return bannerBuilder_.getMessage();
          }
        }
        /**
         * <pre>
         * A Banner object (Section 3.2.3); required if this impression is
         * offered as a banner ad opportunity.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner banner = 2;</code>
         */
        public Builder setBanner(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner value) {
          if (bannerBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            banner_ = value;
            onChanged();
          } else {
            bannerBuilder_.setMessage(value);
          }
          bitField0_ |= 0x00000002;
          return this;
        }
        /**
         * <pre>
         * A Banner object (Section 3.2.3); required if this impression is
         * offered as a banner ad opportunity.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner banner = 2;</code>
         */
        public Builder setBanner(
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Builder builderForValue) {
          if (bannerBuilder_ == null) {
            banner_ = builderForValue.build();
            onChanged();
          } else {
            bannerBuilder_.setMessage(builderForValue.build());
          }
          bitField0_ |= 0x00000002;
          return this;
        }
        /**
         * <pre>
         * A Banner object (Section 3.2.3); required if this impression is
         * offered as a banner ad opportunity.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner banner = 2;</code>
         */
        public Builder mergeBanner(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner value) {
          if (bannerBuilder_ == null) {
            if (((bitField0_ & 0x00000002) != 0) &&
                banner_ != null &&
                banner_ != com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.getDefaultInstance()) {
              banner_ =
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.newBuilder(banner_).mergeFrom(value).buildPartial();
            } else {
              banner_ = value;
            }
            onChanged();
          } else {
            bannerBuilder_.mergeFrom(value);
          }
          bitField0_ |= 0x00000002;
          return this;
        }
        /**
         * <pre>
         * A Banner object (Section 3.2.3); required if this impression is
         * offered as a banner ad opportunity.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner banner = 2;</code>
         */
        public Builder clearBanner() {
          if (bannerBuilder_ == null) {
            banner_ = null;
            onChanged();
          } else {
            bannerBuilder_.clear();
          }
          bitField0_ = (bitField0_ & ~0x00000002);
          return this;
        }
        /**
         * <pre>
         * A Banner object (Section 3.2.3); required if this impression is
         * offered as a banner ad opportunity.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner banner = 2;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Builder getBannerBuilder() {
          bitField0_ |= 0x00000002;
          onChanged();
          return getBannerFieldBuilder().getBuilder();
        }
        /**
         * <pre>
         * A Banner object (Section 3.2.3); required if this impression is
         * offered as a banner ad opportunity.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner banner = 2;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.BannerOrBuilder getBannerOrBuilder() {
          if (bannerBuilder_ != null) {
            return bannerBuilder_.getMessageOrBuilder();
          } else {
            return banner_ == null ?
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.getDefaultInstance() : banner_;
          }
        }
        /**
         * <pre>
         * A Banner object (Section 3.2.3); required if this impression is
         * offered as a banner ad opportunity.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Banner banner = 2;</code>
         */
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.BannerOrBuilder> 
            getBannerFieldBuilder() {
          if (bannerBuilder_ == null) {
            bannerBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Banner.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.BannerOrBuilder>(
                    getBanner(),
                    getParentForChildren(),
                    isClean());
            banner_ = null;
          }
          return bannerBuilder_;
        }

        private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video video_;
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.VideoOrBuilder> videoBuilder_;
        /**
         * <pre>
         * A Video object (Section 3.2.4); required if this impression is
         * offered as a video ad opportunity.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Video video = 3;</code>
         * @return Whether the video field is set.
         */
        public boolean hasVideo() {
          return ((bitField0_ & 0x00000004) != 0);
        }
        /**
         * <pre>
         * A Video object (Section 3.2.4); required if this impression is
         * offered as a video ad opportunity.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Video video = 3;</code>
         * @return The video.
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video getVideo() {
          if (videoBuilder_ == null) {
            return video_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.getDefaultInstance() : video_;
          } else {
            return videoBuilder_.getMessage();
          }
        }
        /**
         * <pre>
         * A Video object (Section 3.2.4); required if this impression is
         * offered as a video ad opportunity.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Video video = 3;</code>
         */
        public Builder setVideo(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video value) {
          if (videoBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            video_ = value;
            onChanged();
          } else {
            videoBuilder_.setMessage(value);
          }
          bitField0_ |= 0x00000004;
          return this;
        }
        /**
         * <pre>
         * A Video object (Section 3.2.4); required if this impression is
         * offered as a video ad opportunity.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Video video = 3;</code>
         */
        public Builder setVideo(
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.Builder builderForValue) {
          if (videoBuilder_ == null) {
            video_ = builderForValue.build();
            onChanged();
          } else {
            videoBuilder_.setMessage(builderForValue.build());
          }
          bitField0_ |= 0x00000004;
          return this;
        }
        /**
         * <pre>
         * A Video object (Section 3.2.4); required if this impression is
         * offered as a video ad opportunity.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Video video = 3;</code>
         */
        public Builder mergeVideo(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video value) {
          if (videoBuilder_ == null) {
            if (((bitField0_ & 0x00000004) != 0) &&
                video_ != null &&
                video_ != com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.getDefaultInstance()) {
              video_ =
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.newBuilder(video_).mergeFrom(value).buildPartial();
            } else {
              video_ = value;
            }
            onChanged();
          } else {
            videoBuilder_.mergeFrom(value);
          }
          bitField0_ |= 0x00000004;
          return this;
        }
        /**
         * <pre>
         * A Video object (Section 3.2.4); required if this impression is
         * offered as a video ad opportunity.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Video video = 3;</code>
         */
        public Builder clearVideo() {
          if (videoBuilder_ == null) {
            video_ = null;
            onChanged();
          } else {
            videoBuilder_.clear();
          }
          bitField0_ = (bitField0_ & ~0x00000004);
          return this;
        }
        /**
         * <pre>
         * A Video object (Section 3.2.4); required if this impression is
         * offered as a video ad opportunity.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Video video = 3;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.Builder getVideoBuilder() {
          bitField0_ |= 0x00000004;
          onChanged();
          return getVideoFieldBuilder().getBuilder();
        }
        /**
         * <pre>
         * A Video object (Section 3.2.4); required if this impression is
         * offered as a video ad opportunity.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Video video = 3;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.VideoOrBuilder getVideoOrBuilder() {
          if (videoBuilder_ != null) {
            return videoBuilder_.getMessageOrBuilder();
          } else {
            return video_ == null ?
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.getDefaultInstance() : video_;
          }
        }
        /**
         * <pre>
         * A Video object (Section 3.2.4); required if this impression is
         * offered as a video ad opportunity.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Video video = 3;</code>
         */
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.VideoOrBuilder> 
            getVideoFieldBuilder() {
          if (videoBuilder_ == null) {
            videoBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.VideoOrBuilder>(
                    getVideo(),
                    getParentForChildren(),
                    isClean());
            video_ = null;
          }
          return videoBuilder_;
        }

        private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio audio_;
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.AudioOrBuilder> audioBuilder_;
        /**
         * <pre>
         * An Audio object; required if this impression is offered
         * as an audio ad opportunity.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Audio audio = 15;</code>
         * @return Whether the audio field is set.
         */
        public boolean hasAudio() {
          return ((bitField0_ & 0x00000008) != 0);
        }
        /**
         * <pre>
         * An Audio object; required if this impression is offered
         * as an audio ad opportunity.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Audio audio = 15;</code>
         * @return The audio.
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio getAudio() {
          if (audioBuilder_ == null) {
            return audio_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio.getDefaultInstance() : audio_;
          } else {
            return audioBuilder_.getMessage();
          }
        }
        /**
         * <pre>
         * An Audio object; required if this impression is offered
         * as an audio ad opportunity.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Audio audio = 15;</code>
         */
        public Builder setAudio(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio value) {
          if (audioBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            audio_ = value;
            onChanged();
          } else {
            audioBuilder_.setMessage(value);
          }
          bitField0_ |= 0x00000008;
          return this;
        }
        /**
         * <pre>
         * An Audio object; required if this impression is offered
         * as an audio ad opportunity.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Audio audio = 15;</code>
         */
        public Builder setAudio(
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio.Builder builderForValue) {
          if (audioBuilder_ == null) {
            audio_ = builderForValue.build();
            onChanged();
          } else {
            audioBuilder_.setMessage(builderForValue.build());
          }
          bitField0_ |= 0x00000008;
          return this;
        }
        /**
         * <pre>
         * An Audio object; required if this impression is offered
         * as an audio ad opportunity.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Audio audio = 15;</code>
         */
        public Builder mergeAudio(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio value) {
          if (audioBuilder_ == null) {
            if (((bitField0_ & 0x00000008) != 0) &&
                audio_ != null &&
                audio_ != com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio.getDefaultInstance()) {
              audio_ =
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio.newBuilder(audio_).mergeFrom(value).buildPartial();
            } else {
              audio_ = value;
            }
            onChanged();
          } else {
            audioBuilder_.mergeFrom(value);
          }
          bitField0_ |= 0x00000008;
          return this;
        }
        /**
         * <pre>
         * An Audio object; required if this impression is offered
         * as an audio ad opportunity.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Audio audio = 15;</code>
         */
        public Builder clearAudio() {
          if (audioBuilder_ == null) {
            audio_ = null;
            onChanged();
          } else {
            audioBuilder_.clear();
          }
          bitField0_ = (bitField0_ & ~0x00000008);
          return this;
        }
        /**
         * <pre>
         * An Audio object; required if this impression is offered
         * as an audio ad opportunity.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Audio audio = 15;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio.Builder getAudioBuilder() {
          bitField0_ |= 0x00000008;
          onChanged();
          return getAudioFieldBuilder().getBuilder();
        }
        /**
         * <pre>
         * An Audio object; required if this impression is offered
         * as an audio ad opportunity.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Audio audio = 15;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.AudioOrBuilder getAudioOrBuilder() {
          if (audioBuilder_ != null) {
            return audioBuilder_.getMessageOrBuilder();
          } else {
            return audio_ == null ?
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio.getDefaultInstance() : audio_;
          }
        }
        /**
         * <pre>
         * An Audio object; required if this impression is offered
         * as an audio ad opportunity.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Audio audio = 15;</code>
         */
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.AudioOrBuilder> 
            getAudioFieldBuilder() {
          if (audioBuilder_ == null) {
            audioBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Audio.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.AudioOrBuilder>(
                    getAudio(),
                    getParentForChildren(),
                    isClean());
            audio_ = null;
          }
          return audioBuilder_;
        }

        private java.lang.Object displaymanager_ = "";
        /**
         * <pre>
         * Name of ad mediation partner, SDK technology, or player responsible
         * for rendering ad (typically video or mobile). Used by some ad servers
         * to customize ad code by partner. Recommended for video and/or apps.
         * </pre>
         *
         * <code>optional string displaymanager = 4;</code>
         * @return Whether the displaymanager field is set.
         */
        public boolean hasDisplaymanager() {
          return ((bitField0_ & 0x00000010) != 0);
        }
        /**
         * <pre>
         * Name of ad mediation partner, SDK technology, or player responsible
         * for rendering ad (typically video or mobile). Used by some ad servers
         * to customize ad code by partner. Recommended for video and/or apps.
         * </pre>
         *
         * <code>optional string displaymanager = 4;</code>
         * @return The displaymanager.
         */
        public java.lang.String getDisplaymanager() {
          java.lang.Object ref = displaymanager_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              displaymanager_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Name of ad mediation partner, SDK technology, or player responsible
         * for rendering ad (typically video or mobile). Used by some ad servers
         * to customize ad code by partner. Recommended for video and/or apps.
         * </pre>
         *
         * <code>optional string displaymanager = 4;</code>
         * @return The bytes for displaymanager.
         */
        public com.google.protobuf.ByteString
            getDisplaymanagerBytes() {
          java.lang.Object ref = displaymanager_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            displaymanager_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Name of ad mediation partner, SDK technology, or player responsible
         * for rendering ad (typically video or mobile). Used by some ad servers
         * to customize ad code by partner. Recommended for video and/or apps.
         * </pre>
         *
         * <code>optional string displaymanager = 4;</code>
         * @param value The displaymanager to set.
         * @return This builder for chaining.
         */
        public Builder setDisplaymanager(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
          displaymanager_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Name of ad mediation partner, SDK technology, or player responsible
         * for rendering ad (typically video or mobile). Used by some ad servers
         * to customize ad code by partner. Recommended for video and/or apps.
         * </pre>
         *
         * <code>optional string displaymanager = 4;</code>
         * @return This builder for chaining.
         */
        public Builder clearDisplaymanager() {
          bitField0_ = (bitField0_ & ~0x00000010);
          displaymanager_ = getDefaultInstance().getDisplaymanager();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Name of ad mediation partner, SDK technology, or player responsible
         * for rendering ad (typically video or mobile). Used by some ad servers
         * to customize ad code by partner. Recommended for video and/or apps.
         * </pre>
         *
         * <code>optional string displaymanager = 4;</code>
         * @param value The bytes for displaymanager to set.
         * @return This builder for chaining.
         */
        public Builder setDisplaymanagerBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
          displaymanager_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object displaymanagerver_ = "";
        /**
         * <pre>
         * Version of ad mediation partner, SDK technology, or player responsible
         * for rendering ad (typically video or mobile). Used by some ad servers
         * to customize ad code by partner. Recommended for video and/or apps.
         * </pre>
         *
         * <code>optional string displaymanagerver = 5;</code>
         * @return Whether the displaymanagerver field is set.
         */
        public boolean hasDisplaymanagerver() {
          return ((bitField0_ & 0x00000020) != 0);
        }
        /**
         * <pre>
         * Version of ad mediation partner, SDK technology, or player responsible
         * for rendering ad (typically video or mobile). Used by some ad servers
         * to customize ad code by partner. Recommended for video and/or apps.
         * </pre>
         *
         * <code>optional string displaymanagerver = 5;</code>
         * @return The displaymanagerver.
         */
        public java.lang.String getDisplaymanagerver() {
          java.lang.Object ref = displaymanagerver_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              displaymanagerver_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Version of ad mediation partner, SDK technology, or player responsible
         * for rendering ad (typically video or mobile). Used by some ad servers
         * to customize ad code by partner. Recommended for video and/or apps.
         * </pre>
         *
         * <code>optional string displaymanagerver = 5;</code>
         * @return The bytes for displaymanagerver.
         */
        public com.google.protobuf.ByteString
            getDisplaymanagerverBytes() {
          java.lang.Object ref = displaymanagerver_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            displaymanagerver_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Version of ad mediation partner, SDK technology, or player responsible
         * for rendering ad (typically video or mobile). Used by some ad servers
         * to customize ad code by partner. Recommended for video and/or apps.
         * </pre>
         *
         * <code>optional string displaymanagerver = 5;</code>
         * @param value The displaymanagerver to set.
         * @return This builder for chaining.
         */
        public Builder setDisplaymanagerver(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000020;
          displaymanagerver_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Version of ad mediation partner, SDK technology, or player responsible
         * for rendering ad (typically video or mobile). Used by some ad servers
         * to customize ad code by partner. Recommended for video and/or apps.
         * </pre>
         *
         * <code>optional string displaymanagerver = 5;</code>
         * @return This builder for chaining.
         */
        public Builder clearDisplaymanagerver() {
          bitField0_ = (bitField0_ & ~0x00000020);
          displaymanagerver_ = getDefaultInstance().getDisplaymanagerver();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Version of ad mediation partner, SDK technology, or player responsible
         * for rendering ad (typically video or mobile). Used by some ad servers
         * to customize ad code by partner. Recommended for video and/or apps.
         * </pre>
         *
         * <code>optional string displaymanagerver = 5;</code>
         * @param value The bytes for displaymanagerver to set.
         * @return This builder for chaining.
         */
        public Builder setDisplaymanagerverBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000020;
          displaymanagerver_ = value;
          onChanged();
          return this;
        }

        private boolean instl_ ;
        /**
         * <pre>
         * 1 = the ad is interstitial or full screen, 0 = not interstitial.
         * </pre>
         *
         * <code>optional bool instl = 6;</code>
         * @return Whether the instl field is set.
         */
        @java.lang.Override
        public boolean hasInstl() {
          return ((bitField0_ & 0x00000040) != 0);
        }
        /**
         * <pre>
         * 1 = the ad is interstitial or full screen, 0 = not interstitial.
         * </pre>
         *
         * <code>optional bool instl = 6;</code>
         * @return The instl.
         */
        @java.lang.Override
        public boolean getInstl() {
          return instl_;
        }
        /**
         * <pre>
         * 1 = the ad is interstitial or full screen, 0 = not interstitial.
         * </pre>
         *
         * <code>optional bool instl = 6;</code>
         * @param value The instl to set.
         * @return This builder for chaining.
         */
        public Builder setInstl(boolean value) {
          bitField0_ |= 0x00000040;
          instl_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * 1 = the ad is interstitial or full screen, 0 = not interstitial.
         * </pre>
         *
         * <code>optional bool instl = 6;</code>
         * @return This builder for chaining.
         */
        public Builder clearInstl() {
          bitField0_ = (bitField0_ & ~0x00000040);
          instl_ = false;
          onChanged();
          return this;
        }

        private java.lang.Object tagid_ = "";
        /**
         * <pre>
         * Identifier for specific ad placement or ad tag that was used to
         * initiate the auction. This can be useful for debugging of any issues,
         * or for optimization by the buyer.
         * </pre>
         *
         * <code>optional string tagid = 7;</code>
         * @return Whether the tagid field is set.
         */
        public boolean hasTagid() {
          return ((bitField0_ & 0x00000080) != 0);
        }
        /**
         * <pre>
         * Identifier for specific ad placement or ad tag that was used to
         * initiate the auction. This can be useful for debugging of any issues,
         * or for optimization by the buyer.
         * </pre>
         *
         * <code>optional string tagid = 7;</code>
         * @return The tagid.
         */
        public java.lang.String getTagid() {
          java.lang.Object ref = tagid_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              tagid_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Identifier for specific ad placement or ad tag that was used to
         * initiate the auction. This can be useful for debugging of any issues,
         * or for optimization by the buyer.
         * </pre>
         *
         * <code>optional string tagid = 7;</code>
         * @return The bytes for tagid.
         */
        public com.google.protobuf.ByteString
            getTagidBytes() {
          java.lang.Object ref = tagid_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            tagid_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Identifier for specific ad placement or ad tag that was used to
         * initiate the auction. This can be useful for debugging of any issues,
         * or for optimization by the buyer.
         * </pre>
         *
         * <code>optional string tagid = 7;</code>
         * @param value The tagid to set.
         * @return This builder for chaining.
         */
        public Builder setTagid(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000080;
          tagid_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Identifier for specific ad placement or ad tag that was used to
         * initiate the auction. This can be useful for debugging of any issues,
         * or for optimization by the buyer.
         * </pre>
         *
         * <code>optional string tagid = 7;</code>
         * @return This builder for chaining.
         */
        public Builder clearTagid() {
          bitField0_ = (bitField0_ & ~0x00000080);
          tagid_ = getDefaultInstance().getTagid();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Identifier for specific ad placement or ad tag that was used to
         * initiate the auction. This can be useful for debugging of any issues,
         * or for optimization by the buyer.
         * </pre>
         *
         * <code>optional string tagid = 7;</code>
         * @param value The bytes for tagid to set.
         * @return This builder for chaining.
         */
        public Builder setTagidBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000080;
          tagid_ = value;
          onChanged();
          return this;
        }

        private double bidfloor_ ;
        /**
         * <pre>
         * Minimum bid for this impression expressed in CPM.
         * </pre>
         *
         * <code>optional double bidfloor = 8 [default = 0];</code>
         * @return Whether the bidfloor field is set.
         */
        @java.lang.Override
        public boolean hasBidfloor() {
          return ((bitField0_ & 0x00000100) != 0);
        }
        /**
         * <pre>
         * Minimum bid for this impression expressed in CPM.
         * </pre>
         *
         * <code>optional double bidfloor = 8 [default = 0];</code>
         * @return The bidfloor.
         */
        @java.lang.Override
        public double getBidfloor() {
          return bidfloor_;
        }
        /**
         * <pre>
         * Minimum bid for this impression expressed in CPM.
         * </pre>
         *
         * <code>optional double bidfloor = 8 [default = 0];</code>
         * @param value The bidfloor to set.
         * @return This builder for chaining.
         */
        public Builder setBidfloor(double value) {
          bitField0_ |= 0x00000100;
          bidfloor_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Minimum bid for this impression expressed in CPM.
         * </pre>
         *
         * <code>optional double bidfloor = 8 [default = 0];</code>
         * @return This builder for chaining.
         */
        public Builder clearBidfloor() {
          bitField0_ = (bitField0_ & ~0x00000100);
          bidfloor_ = 0D;
          onChanged();
          return this;
        }

        private java.lang.Object bidfloorcur_ = "USD";
        /**
         * <pre>
         * Currency specified using ISO-4217 alpha codes. This may be different
         * from bid currency returned by bidder if this is allowed by the exchange.
         * </pre>
         *
         * <code>optional string bidfloorcur = 9 [default = "USD"];</code>
         * @return Whether the bidfloorcur field is set.
         */
        public boolean hasBidfloorcur() {
          return ((bitField0_ & 0x00000200) != 0);
        }
        /**
         * <pre>
         * Currency specified using ISO-4217 alpha codes. This may be different
         * from bid currency returned by bidder if this is allowed by the exchange.
         * </pre>
         *
         * <code>optional string bidfloorcur = 9 [default = "USD"];</code>
         * @return The bidfloorcur.
         */
        public java.lang.String getBidfloorcur() {
          java.lang.Object ref = bidfloorcur_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              bidfloorcur_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Currency specified using ISO-4217 alpha codes. This may be different
         * from bid currency returned by bidder if this is allowed by the exchange.
         * </pre>
         *
         * <code>optional string bidfloorcur = 9 [default = "USD"];</code>
         * @return The bytes for bidfloorcur.
         */
        public com.google.protobuf.ByteString
            getBidfloorcurBytes() {
          java.lang.Object ref = bidfloorcur_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            bidfloorcur_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Currency specified using ISO-4217 alpha codes. This may be different
         * from bid currency returned by bidder if this is allowed by the exchange.
         * </pre>
         *
         * <code>optional string bidfloorcur = 9 [default = "USD"];</code>
         * @param value The bidfloorcur to set.
         * @return This builder for chaining.
         */
        public Builder setBidfloorcur(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000200;
          bidfloorcur_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Currency specified using ISO-4217 alpha codes. This may be different
         * from bid currency returned by bidder if this is allowed by the exchange.
         * </pre>
         *
         * <code>optional string bidfloorcur = 9 [default = "USD"];</code>
         * @return This builder for chaining.
         */
        public Builder clearBidfloorcur() {
          bitField0_ = (bitField0_ & ~0x00000200);
          bidfloorcur_ = getDefaultInstance().getBidfloorcur();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Currency specified using ISO-4217 alpha codes. This may be different
         * from bid currency returned by bidder if this is allowed by the exchange.
         * </pre>
         *
         * <code>optional string bidfloorcur = 9 [default = "USD"];</code>
         * @param value The bytes for bidfloorcur to set.
         * @return This builder for chaining.
         */
        public Builder setBidfloorcurBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000200;
          bidfloorcur_ = value;
          onChanged();
          return this;
        }

        private boolean clickbrowser_ ;
        /**
         * <pre>
         * Indicates the type of browser opened upon clicking the
         * creative in an app, where 0 = embedded, 1 = native.
         * Note that the Safari View Controller in iOS 9.x devices is considered
         * a native browser for purposes of this attribute.
         * </pre>
         *
         * <code>optional bool clickbrowser = 16;</code>
         * @return Whether the clickbrowser field is set.
         */
        @java.lang.Override
        public boolean hasClickbrowser() {
          return ((bitField0_ & 0x00000400) != 0);
        }
        /**
         * <pre>
         * Indicates the type of browser opened upon clicking the
         * creative in an app, where 0 = embedded, 1 = native.
         * Note that the Safari View Controller in iOS 9.x devices is considered
         * a native browser for purposes of this attribute.
         * </pre>
         *
         * <code>optional bool clickbrowser = 16;</code>
         * @return The clickbrowser.
         */
        @java.lang.Override
        public boolean getClickbrowser() {
          return clickbrowser_;
        }
        /**
         * <pre>
         * Indicates the type of browser opened upon clicking the
         * creative in an app, where 0 = embedded, 1 = native.
         * Note that the Safari View Controller in iOS 9.x devices is considered
         * a native browser for purposes of this attribute.
         * </pre>
         *
         * <code>optional bool clickbrowser = 16;</code>
         * @param value The clickbrowser to set.
         * @return This builder for chaining.
         */
        public Builder setClickbrowser(boolean value) {
          bitField0_ |= 0x00000400;
          clickbrowser_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Indicates the type of browser opened upon clicking the
         * creative in an app, where 0 = embedded, 1 = native.
         * Note that the Safari View Controller in iOS 9.x devices is considered
         * a native browser for purposes of this attribute.
         * </pre>
         *
         * <code>optional bool clickbrowser = 16;</code>
         * @return This builder for chaining.
         */
        public Builder clearClickbrowser() {
          bitField0_ = (bitField0_ & ~0x00000400);
          clickbrowser_ = false;
          onChanged();
          return this;
        }

        private boolean secure_ ;
        /**
         * <pre>
         * Flag to indicate if the impression requires secure HTTPS URL creative
         * assets and markup, where 0 = non-secure, 1 = secure.  If omitted,
         * the secure state is unknown, but non-secure HTTP support can be assumed.
         * </pre>
         *
         * <code>optional bool secure = 12;</code>
         * @return Whether the secure field is set.
         */
        @java.lang.Override
        public boolean hasSecure() {
          return ((bitField0_ & 0x00000800) != 0);
        }
        /**
         * <pre>
         * Flag to indicate if the impression requires secure HTTPS URL creative
         * assets and markup, where 0 = non-secure, 1 = secure.  If omitted,
         * the secure state is unknown, but non-secure HTTP support can be assumed.
         * </pre>
         *
         * <code>optional bool secure = 12;</code>
         * @return The secure.
         */
        @java.lang.Override
        public boolean getSecure() {
          return secure_;
        }
        /**
         * <pre>
         * Flag to indicate if the impression requires secure HTTPS URL creative
         * assets and markup, where 0 = non-secure, 1 = secure.  If omitted,
         * the secure state is unknown, but non-secure HTTP support can be assumed.
         * </pre>
         *
         * <code>optional bool secure = 12;</code>
         * @param value The secure to set.
         * @return This builder for chaining.
         */
        public Builder setSecure(boolean value) {
          bitField0_ |= 0x00000800;
          secure_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Flag to indicate if the impression requires secure HTTPS URL creative
         * assets and markup, where 0 = non-secure, 1 = secure.  If omitted,
         * the secure state is unknown, but non-secure HTTP support can be assumed.
         * </pre>
         *
         * <code>optional bool secure = 12;</code>
         * @return This builder for chaining.
         */
        public Builder clearSecure() {
          bitField0_ = (bitField0_ & ~0x00000800);
          secure_ = false;
          onChanged();
          return this;
        }

        private com.google.protobuf.LazyStringList iframebuster_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        private void ensureIframebusterIsMutable() {
          if (!((bitField0_ & 0x00001000) != 0)) {
            iframebuster_ = new com.google.protobuf.LazyStringArrayList(iframebuster_);
            bitField0_ |= 0x00001000;
           }
        }
        /**
         * <pre>
         * Array of exchange-specific names of supported iframe busters.
         * </pre>
         *
         * <code>repeated string iframebuster = 10;</code>
         * @return A list containing the iframebuster.
         */
        public com.google.protobuf.ProtocolStringList
            getIframebusterList() {
          return iframebuster_.getUnmodifiableView();
        }
        /**
         * <pre>
         * Array of exchange-specific names of supported iframe busters.
         * </pre>
         *
         * <code>repeated string iframebuster = 10;</code>
         * @return The count of iframebuster.
         */
        public int getIframebusterCount() {
          return iframebuster_.size();
        }
        /**
         * <pre>
         * Array of exchange-specific names of supported iframe busters.
         * </pre>
         *
         * <code>repeated string iframebuster = 10;</code>
         * @param index The index of the element to return.
         * @return The iframebuster at the given index.
         */
        public java.lang.String getIframebuster(int index) {
          return iframebuster_.get(index);
        }
        /**
         * <pre>
         * Array of exchange-specific names of supported iframe busters.
         * </pre>
         *
         * <code>repeated string iframebuster = 10;</code>
         * @param index The index of the value to return.
         * @return The bytes of the iframebuster at the given index.
         */
        public com.google.protobuf.ByteString
            getIframebusterBytes(int index) {
          return iframebuster_.getByteString(index);
        }
        /**
         * <pre>
         * Array of exchange-specific names of supported iframe busters.
         * </pre>
         *
         * <code>repeated string iframebuster = 10;</code>
         * @param index The index to set the value at.
         * @param value The iframebuster to set.
         * @return This builder for chaining.
         */
        public Builder setIframebuster(
            int index, java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  ensureIframebusterIsMutable();
          iframebuster_.set(index, value);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Array of exchange-specific names of supported iframe busters.
         * </pre>
         *
         * <code>repeated string iframebuster = 10;</code>
         * @param value The iframebuster to add.
         * @return This builder for chaining.
         */
        public Builder addIframebuster(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  ensureIframebusterIsMutable();
          iframebuster_.add(value);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Array of exchange-specific names of supported iframe busters.
         * </pre>
         *
         * <code>repeated string iframebuster = 10;</code>
         * @param values The iframebuster to add.
         * @return This builder for chaining.
         */
        public Builder addAllIframebuster(
            java.lang.Iterable<java.lang.String> values) {
          ensureIframebusterIsMutable();
          com.google.protobuf.AbstractMessageLite.Builder.addAll(
              values, iframebuster_);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Array of exchange-specific names of supported iframe busters.
         * </pre>
         *
         * <code>repeated string iframebuster = 10;</code>
         * @return This builder for chaining.
         */
        public Builder clearIframebuster() {
          iframebuster_ = com.google.protobuf.LazyStringArrayList.EMPTY;
          bitField0_ = (bitField0_ & ~0x00001000);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Array of exchange-specific names of supported iframe busters.
         * </pre>
         *
         * <code>repeated string iframebuster = 10;</code>
         * @param value The bytes of the iframebuster to add.
         * @return This builder for chaining.
         */
        public Builder addIframebusterBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  ensureIframebusterIsMutable();
          iframebuster_.add(value);
          onChanged();
          return this;
        }

        private boolean rwdd_ ;
        /**
         * <pre>
         * Indicates whether the user receives a reward for viewing the ad, where 0
         * = no, 1 = yes. Typically video ad implementations allow users to read an
         * additional news article for free, receive an extra life in a game, or get
         * a sponsored ad-free music session. The reward is typically distributed
         * after the video ad is completed.
         * </pre>
         *
         * <code>optional bool rwdd = 18 [default = false];</code>
         * @return Whether the rwdd field is set.
         */
        @java.lang.Override
        public boolean hasRwdd() {
          return ((bitField0_ & 0x00002000) != 0);
        }
        /**
         * <pre>
         * Indicates whether the user receives a reward for viewing the ad, where 0
         * = no, 1 = yes. Typically video ad implementations allow users to read an
         * additional news article for free, receive an extra life in a game, or get
         * a sponsored ad-free music session. The reward is typically distributed
         * after the video ad is completed.
         * </pre>
         *
         * <code>optional bool rwdd = 18 [default = false];</code>
         * @return The rwdd.
         */
        @java.lang.Override
        public boolean getRwdd() {
          return rwdd_;
        }
        /**
         * <pre>
         * Indicates whether the user receives a reward for viewing the ad, where 0
         * = no, 1 = yes. Typically video ad implementations allow users to read an
         * additional news article for free, receive an extra life in a game, or get
         * a sponsored ad-free music session. The reward is typically distributed
         * after the video ad is completed.
         * </pre>
         *
         * <code>optional bool rwdd = 18 [default = false];</code>
         * @param value The rwdd to set.
         * @return This builder for chaining.
         */
        public Builder setRwdd(boolean value) {
          bitField0_ |= 0x00002000;
          rwdd_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Indicates whether the user receives a reward for viewing the ad, where 0
         * = no, 1 = yes. Typically video ad implementations allow users to read an
         * additional news article for free, receive an extra life in a game, or get
         * a sponsored ad-free music session. The reward is typically distributed
         * after the video ad is completed.
         * </pre>
         *
         * <code>optional bool rwdd = 18 [default = false];</code>
         * @return This builder for chaining.
         */
        public Builder clearRwdd() {
          bitField0_ = (bitField0_ & ~0x00002000);
          rwdd_ = false;
          onChanged();
          return this;
        }

        private int ssai_ ;
        /**
         * <pre>
         * Indicates if server-side ad insertion (e.g., stitching an ad into an
         * audio or video stream) is in use and the impact of this on asset and
         * tracker retrieval, where 0 = status unknown, 1 = all client-side (i.e.,
         * not server-side), 2 = assets stitched server-side but tracking pixels
         * fired client-side, 3 = all server-side.
         * </pre>
         *
         * <code>optional int32 ssai = 19 [default = 0];</code>
         * @return Whether the ssai field is set.
         */
        @java.lang.Override
        public boolean hasSsai() {
          return ((bitField0_ & 0x00004000) != 0);
        }
        /**
         * <pre>
         * Indicates if server-side ad insertion (e.g., stitching an ad into an
         * audio or video stream) is in use and the impact of this on asset and
         * tracker retrieval, where 0 = status unknown, 1 = all client-side (i.e.,
         * not server-side), 2 = assets stitched server-side but tracking pixels
         * fired client-side, 3 = all server-side.
         * </pre>
         *
         * <code>optional int32 ssai = 19 [default = 0];</code>
         * @return The ssai.
         */
        @java.lang.Override
        public int getSsai() {
          return ssai_;
        }
        /**
         * <pre>
         * Indicates if server-side ad insertion (e.g., stitching an ad into an
         * audio or video stream) is in use and the impact of this on asset and
         * tracker retrieval, where 0 = status unknown, 1 = all client-side (i.e.,
         * not server-side), 2 = assets stitched server-side but tracking pixels
         * fired client-side, 3 = all server-side.
         * </pre>
         *
         * <code>optional int32 ssai = 19 [default = 0];</code>
         * @param value The ssai to set.
         * @return This builder for chaining.
         */
        public Builder setSsai(int value) {
          bitField0_ |= 0x00004000;
          ssai_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Indicates if server-side ad insertion (e.g., stitching an ad into an
         * audio or video stream) is in use and the impact of this on asset and
         * tracker retrieval, where 0 = status unknown, 1 = all client-side (i.e.,
         * not server-side), 2 = assets stitched server-side but tracking pixels
         * fired client-side, 3 = all server-side.
         * </pre>
         *
         * <code>optional int32 ssai = 19 [default = 0];</code>
         * @return This builder for chaining.
         */
        public Builder clearSsai() {
          bitField0_ = (bitField0_ & ~0x00004000);
          ssai_ = 0;
          onChanged();
          return this;
        }

        private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp pmp_;
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.PmpOrBuilder> pmpBuilder_;
        /**
         * <pre>
         * A Pmp object (Section 3.2.17) containing any private marketplace deals
         * in effect for this impression.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp pmp = 11;</code>
         * @return Whether the pmp field is set.
         */
        public boolean hasPmp() {
          return ((bitField0_ & 0x00008000) != 0);
        }
        /**
         * <pre>
         * A Pmp object (Section 3.2.17) containing any private marketplace deals
         * in effect for this impression.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp pmp = 11;</code>
         * @return The pmp.
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp getPmp() {
          if (pmpBuilder_ == null) {
            return pmp_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.getDefaultInstance() : pmp_;
          } else {
            return pmpBuilder_.getMessage();
          }
        }
        /**
         * <pre>
         * A Pmp object (Section 3.2.17) containing any private marketplace deals
         * in effect for this impression.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp pmp = 11;</code>
         */
        public Builder setPmp(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp value) {
          if (pmpBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            pmp_ = value;
            onChanged();
          } else {
            pmpBuilder_.setMessage(value);
          }
          bitField0_ |= 0x00008000;
          return this;
        }
        /**
         * <pre>
         * A Pmp object (Section 3.2.17) containing any private marketplace deals
         * in effect for this impression.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp pmp = 11;</code>
         */
        public Builder setPmp(
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Builder builderForValue) {
          if (pmpBuilder_ == null) {
            pmp_ = builderForValue.build();
            onChanged();
          } else {
            pmpBuilder_.setMessage(builderForValue.build());
          }
          bitField0_ |= 0x00008000;
          return this;
        }
        /**
         * <pre>
         * A Pmp object (Section 3.2.17) containing any private marketplace deals
         * in effect for this impression.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp pmp = 11;</code>
         */
        public Builder mergePmp(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp value) {
          if (pmpBuilder_ == null) {
            if (((bitField0_ & 0x00008000) != 0) &&
                pmp_ != null &&
                pmp_ != com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.getDefaultInstance()) {
              pmp_ =
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.newBuilder(pmp_).mergeFrom(value).buildPartial();
            } else {
              pmp_ = value;
            }
            onChanged();
          } else {
            pmpBuilder_.mergeFrom(value);
          }
          bitField0_ |= 0x00008000;
          return this;
        }
        /**
         * <pre>
         * A Pmp object (Section 3.2.17) containing any private marketplace deals
         * in effect for this impression.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp pmp = 11;</code>
         */
        public Builder clearPmp() {
          if (pmpBuilder_ == null) {
            pmp_ = null;
            onChanged();
          } else {
            pmpBuilder_.clear();
          }
          bitField0_ = (bitField0_ & ~0x00008000);
          return this;
        }
        /**
         * <pre>
         * A Pmp object (Section 3.2.17) containing any private marketplace deals
         * in effect for this impression.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp pmp = 11;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Builder getPmpBuilder() {
          bitField0_ |= 0x00008000;
          onChanged();
          return getPmpFieldBuilder().getBuilder();
        }
        /**
         * <pre>
         * A Pmp object (Section 3.2.17) containing any private marketplace deals
         * in effect for this impression.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp pmp = 11;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.PmpOrBuilder getPmpOrBuilder() {
          if (pmpBuilder_ != null) {
            return pmpBuilder_.getMessageOrBuilder();
          } else {
            return pmp_ == null ?
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.getDefaultInstance() : pmp_;
          }
        }
        /**
         * <pre>
         * A Pmp object (Section 3.2.17) containing any private marketplace deals
         * in effect for this impression.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Pmp pmp = 11;</code>
         */
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.PmpOrBuilder> 
            getPmpFieldBuilder() {
          if (pmpBuilder_ == null) {
            pmpBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Pmp.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.PmpOrBuilder>(
                    getPmp(),
                    getParentForChildren(),
                    isClean());
            pmp_ = null;
          }
          return pmpBuilder_;
        }

        private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native native_;
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.NativeOrBuilder> nativeBuilder_;
        /**
         * <pre>
         * A Native object (Section 3.2.5); required if this impression is
         * offered as a native ad opportunity.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Native native = 13;</code>
         * @return Whether the native field is set.
         */
        public boolean hasNative() {
          return ((bitField0_ & 0x00010000) != 0);
        }
        /**
         * <pre>
         * A Native object (Section 3.2.5); required if this impression is
         * offered as a native ad opportunity.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Native native = 13;</code>
         * @return The native.
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native getNative() {
          if (nativeBuilder_ == null) {
            return native_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native.getDefaultInstance() : native_;
          } else {
            return nativeBuilder_.getMessage();
          }
        }
        /**
         * <pre>
         * A Native object (Section 3.2.5); required if this impression is
         * offered as a native ad opportunity.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Native native = 13;</code>
         */
        public Builder setNative(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native value) {
          if (nativeBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            native_ = value;
            onChanged();
          } else {
            nativeBuilder_.setMessage(value);
          }
          bitField0_ |= 0x00010000;
          return this;
        }
        /**
         * <pre>
         * A Native object (Section 3.2.5); required if this impression is
         * offered as a native ad opportunity.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Native native = 13;</code>
         */
        public Builder setNative(
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native.Builder builderForValue) {
          if (nativeBuilder_ == null) {
            native_ = builderForValue.build();
            onChanged();
          } else {
            nativeBuilder_.setMessage(builderForValue.build());
          }
          bitField0_ |= 0x00010000;
          return this;
        }
        /**
         * <pre>
         * A Native object (Section 3.2.5); required if this impression is
         * offered as a native ad opportunity.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Native native = 13;</code>
         */
        public Builder mergeNative(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native value) {
          if (nativeBuilder_ == null) {
            if (((bitField0_ & 0x00010000) != 0) &&
                native_ != null &&
                native_ != com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native.getDefaultInstance()) {
              native_ =
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native.newBuilder(native_).mergeFrom(value).buildPartial();
            } else {
              native_ = value;
            }
            onChanged();
          } else {
            nativeBuilder_.mergeFrom(value);
          }
          bitField0_ |= 0x00010000;
          return this;
        }
        /**
         * <pre>
         * A Native object (Section 3.2.5); required if this impression is
         * offered as a native ad opportunity.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Native native = 13;</code>
         */
        public Builder clearNative() {
          if (nativeBuilder_ == null) {
            native_ = null;
            onChanged();
          } else {
            nativeBuilder_.clear();
          }
          bitField0_ = (bitField0_ & ~0x00010000);
          return this;
        }
        /**
         * <pre>
         * A Native object (Section 3.2.5); required if this impression is
         * offered as a native ad opportunity.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Native native = 13;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native.Builder getNativeBuilder() {
          bitField0_ |= 0x00010000;
          onChanged();
          return getNativeFieldBuilder().getBuilder();
        }
        /**
         * <pre>
         * A Native object (Section 3.2.5); required if this impression is
         * offered as a native ad opportunity.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Native native = 13;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.NativeOrBuilder getNativeOrBuilder() {
          if (nativeBuilder_ != null) {
            return nativeBuilder_.getMessageOrBuilder();
          } else {
            return native_ == null ?
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native.getDefaultInstance() : native_;
          }
        }
        /**
         * <pre>
         * A Native object (Section 3.2.5); required if this impression is
         * offered as a native ad opportunity.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Native native = 13;</code>
         */
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.NativeOrBuilder> 
            getNativeFieldBuilder() {
          if (nativeBuilder_ == null) {
            nativeBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Native.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.NativeOrBuilder>(
                    getNative(),
                    getParentForChildren(),
                    isClean());
            native_ = null;
          }
          return nativeBuilder_;
        }

        private int exp_ ;
        /**
         * <pre>
         * Advisory as to the number of seconds that may elapse
         * between the auction and the actual impression.
         * </pre>
         *
         * <code>optional int32 exp = 14;</code>
         * @return Whether the exp field is set.
         */
        @java.lang.Override
        public boolean hasExp() {
          return ((bitField0_ & 0x00020000) != 0);
        }
        /**
         * <pre>
         * Advisory as to the number of seconds that may elapse
         * between the auction and the actual impression.
         * </pre>
         *
         * <code>optional int32 exp = 14;</code>
         * @return The exp.
         */
        @java.lang.Override
        public int getExp() {
          return exp_;
        }
        /**
         * <pre>
         * Advisory as to the number of seconds that may elapse
         * between the auction and the actual impression.
         * </pre>
         *
         * <code>optional int32 exp = 14;</code>
         * @param value The exp to set.
         * @return This builder for chaining.
         */
        public Builder setExp(int value) {
          bitField0_ |= 0x00020000;
          exp_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Advisory as to the number of seconds that may elapse
         * between the auction and the actual impression.
         * </pre>
         *
         * <code>optional int32 exp = 14;</code>
         * @return This builder for chaining.
         */
        public Builder clearExp() {
          bitField0_ = (bitField0_ & ~0x00020000);
          exp_ = 0;
          onChanged();
          return this;
        }

        private java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric> metric_ =
          java.util.Collections.emptyList();
        private void ensureMetricIsMutable() {
          if (!((bitField0_ & 0x00040000) != 0)) {
            metric_ = new java.util.ArrayList<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric>(metric_);
            bitField0_ |= 0x00040000;
           }
        }

        private com.google.protobuf.RepeatedFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.MetricOrBuilder> metricBuilder_;

        /**
         * <pre>
         * An array of Metric object (Section 3.2.5).
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Metric metric = 17;</code>
         */
        public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric> getMetricList() {
          if (metricBuilder_ == null) {
            return java.util.Collections.unmodifiableList(metric_);
          } else {
            return metricBuilder_.getMessageList();
          }
        }
        /**
         * <pre>
         * An array of Metric object (Section 3.2.5).
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Metric metric = 17;</code>
         */
        public int getMetricCount() {
          if (metricBuilder_ == null) {
            return metric_.size();
          } else {
            return metricBuilder_.getCount();
          }
        }
        /**
         * <pre>
         * An array of Metric object (Section 3.2.5).
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Metric metric = 17;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric getMetric(int index) {
          if (metricBuilder_ == null) {
            return metric_.get(index);
          } else {
            return metricBuilder_.getMessage(index);
          }
        }
        /**
         * <pre>
         * An array of Metric object (Section 3.2.5).
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Metric metric = 17;</code>
         */
        public Builder setMetric(
            int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric value) {
          if (metricBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            ensureMetricIsMutable();
            metric_.set(index, value);
            onChanged();
          } else {
            metricBuilder_.setMessage(index, value);
          }
          return this;
        }
        /**
         * <pre>
         * An array of Metric object (Section 3.2.5).
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Metric metric = 17;</code>
         */
        public Builder setMetric(
            int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric.Builder builderForValue) {
          if (metricBuilder_ == null) {
            ensureMetricIsMutable();
            metric_.set(index, builderForValue.build());
            onChanged();
          } else {
            metricBuilder_.setMessage(index, builderForValue.build());
          }
          return this;
        }
        /**
         * <pre>
         * An array of Metric object (Section 3.2.5).
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Metric metric = 17;</code>
         */
        public Builder addMetric(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric value) {
          if (metricBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            ensureMetricIsMutable();
            metric_.add(value);
            onChanged();
          } else {
            metricBuilder_.addMessage(value);
          }
          return this;
        }
        /**
         * <pre>
         * An array of Metric object (Section 3.2.5).
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Metric metric = 17;</code>
         */
        public Builder addMetric(
            int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric value) {
          if (metricBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            ensureMetricIsMutable();
            metric_.add(index, value);
            onChanged();
          } else {
            metricBuilder_.addMessage(index, value);
          }
          return this;
        }
        /**
         * <pre>
         * An array of Metric object (Section 3.2.5).
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Metric metric = 17;</code>
         */
        public Builder addMetric(
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric.Builder builderForValue) {
          if (metricBuilder_ == null) {
            ensureMetricIsMutable();
            metric_.add(builderForValue.build());
            onChanged();
          } else {
            metricBuilder_.addMessage(builderForValue.build());
          }
          return this;
        }
        /**
         * <pre>
         * An array of Metric object (Section 3.2.5).
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Metric metric = 17;</code>
         */
        public Builder addMetric(
            int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric.Builder builderForValue) {
          if (metricBuilder_ == null) {
            ensureMetricIsMutable();
            metric_.add(index, builderForValue.build());
            onChanged();
          } else {
            metricBuilder_.addMessage(index, builderForValue.build());
          }
          return this;
        }
        /**
         * <pre>
         * An array of Metric object (Section 3.2.5).
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Metric metric = 17;</code>
         */
        public Builder addAllMetric(
            java.lang.Iterable<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric> values) {
          if (metricBuilder_ == null) {
            ensureMetricIsMutable();
            com.google.protobuf.AbstractMessageLite.Builder.addAll(
                values, metric_);
            onChanged();
          } else {
            metricBuilder_.addAllMessages(values);
          }
          return this;
        }
        /**
         * <pre>
         * An array of Metric object (Section 3.2.5).
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Metric metric = 17;</code>
         */
        public Builder clearMetric() {
          if (metricBuilder_ == null) {
            metric_ = java.util.Collections.emptyList();
            bitField0_ = (bitField0_ & ~0x00040000);
            onChanged();
          } else {
            metricBuilder_.clear();
          }
          return this;
        }
        /**
         * <pre>
         * An array of Metric object (Section 3.2.5).
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Metric metric = 17;</code>
         */
        public Builder removeMetric(int index) {
          if (metricBuilder_ == null) {
            ensureMetricIsMutable();
            metric_.remove(index);
            onChanged();
          } else {
            metricBuilder_.remove(index);
          }
          return this;
        }
        /**
         * <pre>
         * An array of Metric object (Section 3.2.5).
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Metric metric = 17;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric.Builder getMetricBuilder(
            int index) {
          return getMetricFieldBuilder().getBuilder(index);
        }
        /**
         * <pre>
         * An array of Metric object (Section 3.2.5).
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Metric metric = 17;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.MetricOrBuilder getMetricOrBuilder(
            int index) {
          if (metricBuilder_ == null) {
            return metric_.get(index);  } else {
            return metricBuilder_.getMessageOrBuilder(index);
          }
        }
        /**
         * <pre>
         * An array of Metric object (Section 3.2.5).
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Metric metric = 17;</code>
         */
        public java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.MetricOrBuilder> 
             getMetricOrBuilderList() {
          if (metricBuilder_ != null) {
            return metricBuilder_.getMessageOrBuilderList();
          } else {
            return java.util.Collections.unmodifiableList(metric_);
          }
        }
        /**
         * <pre>
         * An array of Metric object (Section 3.2.5).
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Metric metric = 17;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric.Builder addMetricBuilder() {
          return getMetricFieldBuilder().addBuilder(
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric.getDefaultInstance());
        }
        /**
         * <pre>
         * An array of Metric object (Section 3.2.5).
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Metric metric = 17;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric.Builder addMetricBuilder(
            int index) {
          return getMetricFieldBuilder().addBuilder(
              index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric.getDefaultInstance());
        }
        /**
         * <pre>
         * An array of Metric object (Section 3.2.5).
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp.Metric metric = 17;</code>
         */
        public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric.Builder> 
             getMetricBuilderList() {
          return getMetricFieldBuilder().getBuilderList();
        }
        private com.google.protobuf.RepeatedFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.MetricOrBuilder> 
            getMetricFieldBuilder() {
          if (metricBuilder_ == null) {
            metricBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Metric.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.MetricOrBuilder>(
                    metric_,
                    ((bitField0_ & 0x00040000) != 0),
                    getParentForChildren(),
                    isClean());
            metric_ = null;
          }
          return metricBuilder_;
        }

        private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty qty_;
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.QtyOrBuilder> qtyBuilder_;
        /**
         * <pre>
         * A means of passing a multiplier in the bid request, representing the
         * total quantity of impressions for adverts that display to more than one
         * person.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Qty qty = 20;</code>
         * @return Whether the qty field is set.
         */
        public boolean hasQty() {
          return ((bitField0_ & 0x00080000) != 0);
        }
        /**
         * <pre>
         * A means of passing a multiplier in the bid request, representing the
         * total quantity of impressions for adverts that display to more than one
         * person.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Qty qty = 20;</code>
         * @return The qty.
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty getQty() {
          if (qtyBuilder_ == null) {
            return qty_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty.getDefaultInstance() : qty_;
          } else {
            return qtyBuilder_.getMessage();
          }
        }
        /**
         * <pre>
         * A means of passing a multiplier in the bid request, representing the
         * total quantity of impressions for adverts that display to more than one
         * person.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Qty qty = 20;</code>
         */
        public Builder setQty(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty value) {
          if (qtyBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            qty_ = value;
            onChanged();
          } else {
            qtyBuilder_.setMessage(value);
          }
          bitField0_ |= 0x00080000;
          return this;
        }
        /**
         * <pre>
         * A means of passing a multiplier in the bid request, representing the
         * total quantity of impressions for adverts that display to more than one
         * person.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Qty qty = 20;</code>
         */
        public Builder setQty(
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty.Builder builderForValue) {
          if (qtyBuilder_ == null) {
            qty_ = builderForValue.build();
            onChanged();
          } else {
            qtyBuilder_.setMessage(builderForValue.build());
          }
          bitField0_ |= 0x00080000;
          return this;
        }
        /**
         * <pre>
         * A means of passing a multiplier in the bid request, representing the
         * total quantity of impressions for adverts that display to more than one
         * person.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Qty qty = 20;</code>
         */
        public Builder mergeQty(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty value) {
          if (qtyBuilder_ == null) {
            if (((bitField0_ & 0x00080000) != 0) &&
                qty_ != null &&
                qty_ != com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty.getDefaultInstance()) {
              qty_ =
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty.newBuilder(qty_).mergeFrom(value).buildPartial();
            } else {
              qty_ = value;
            }
            onChanged();
          } else {
            qtyBuilder_.mergeFrom(value);
          }
          bitField0_ |= 0x00080000;
          return this;
        }
        /**
         * <pre>
         * A means of passing a multiplier in the bid request, representing the
         * total quantity of impressions for adverts that display to more than one
         * person.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Qty qty = 20;</code>
         */
        public Builder clearQty() {
          if (qtyBuilder_ == null) {
            qty_ = null;
            onChanged();
          } else {
            qtyBuilder_.clear();
          }
          bitField0_ = (bitField0_ & ~0x00080000);
          return this;
        }
        /**
         * <pre>
         * A means of passing a multiplier in the bid request, representing the
         * total quantity of impressions for adverts that display to more than one
         * person.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Qty qty = 20;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty.Builder getQtyBuilder() {
          bitField0_ |= 0x00080000;
          onChanged();
          return getQtyFieldBuilder().getBuilder();
        }
        /**
         * <pre>
         * A means of passing a multiplier in the bid request, representing the
         * total quantity of impressions for adverts that display to more than one
         * person.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Qty qty = 20;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.QtyOrBuilder getQtyOrBuilder() {
          if (qtyBuilder_ != null) {
            return qtyBuilder_.getMessageOrBuilder();
          } else {
            return qty_ == null ?
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty.getDefaultInstance() : qty_;
          }
        }
        /**
         * <pre>
         * A means of passing a multiplier in the bid request, representing the
         * total quantity of impressions for adverts that display to more than one
         * person.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Qty qty = 20;</code>
         */
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.QtyOrBuilder> 
            getQtyFieldBuilder() {
          if (qtyBuilder_ == null) {
            qtyBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Qty.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.QtyOrBuilder>(
                    getQty(),
                    getParentForChildren(),
                    isClean());
            qty_ = null;
          }
          return qtyBuilder_;
        }

        private double dt_ ;
        /**
         * <pre>
         * Timestamp when the item is estimated to be fulfilled (e.g. when a DOOH
         * impression will be displayed) in Unix format (i.e., milliseconds since
         * the epoch).
         * </pre>
         *
         * <code>optional double dt = 21;</code>
         * @return Whether the dt field is set.
         */
        @java.lang.Override
        public boolean hasDt() {
          return ((bitField0_ & 0x00100000) != 0);
        }
        /**
         * <pre>
         * Timestamp when the item is estimated to be fulfilled (e.g. when a DOOH
         * impression will be displayed) in Unix format (i.e., milliseconds since
         * the epoch).
         * </pre>
         *
         * <code>optional double dt = 21;</code>
         * @return The dt.
         */
        @java.lang.Override
        public double getDt() {
          return dt_;
        }
        /**
         * <pre>
         * Timestamp when the item is estimated to be fulfilled (e.g. when a DOOH
         * impression will be displayed) in Unix format (i.e., milliseconds since
         * the epoch).
         * </pre>
         *
         * <code>optional double dt = 21;</code>
         * @param value The dt to set.
         * @return This builder for chaining.
         */
        public Builder setDt(double value) {
          bitField0_ |= 0x00100000;
          dt_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Timestamp when the item is estimated to be fulfilled (e.g. when a DOOH
         * impression will be displayed) in Unix format (i.e., milliseconds since
         * the epoch).
         * </pre>
         *
         * <code>optional double dt = 21;</code>
         * @return This builder for chaining.
         */
        public Builder clearDt() {
          bitField0_ = (bitField0_ & ~0x00100000);
          dt_ = 0D;
          onChanged();
          return this;
        }

        private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh refresh_;
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.RefreshOrBuilder> refreshBuilder_;
        /**
         * <pre>
         * Details about ad slots being refreshed automatically.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh refresh = 22;</code>
         * @return Whether the refresh field is set.
         */
        public boolean hasRefresh() {
          return ((bitField0_ & 0x00200000) != 0);
        }
        /**
         * <pre>
         * Details about ad slots being refreshed automatically.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh refresh = 22;</code>
         * @return The refresh.
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh getRefresh() {
          if (refreshBuilder_ == null) {
            return refresh_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.getDefaultInstance() : refresh_;
          } else {
            return refreshBuilder_.getMessage();
          }
        }
        /**
         * <pre>
         * Details about ad slots being refreshed automatically.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh refresh = 22;</code>
         */
        public Builder setRefresh(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh value) {
          if (refreshBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            refresh_ = value;
            onChanged();
          } else {
            refreshBuilder_.setMessage(value);
          }
          bitField0_ |= 0x00200000;
          return this;
        }
        /**
         * <pre>
         * Details about ad slots being refreshed automatically.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh refresh = 22;</code>
         */
        public Builder setRefresh(
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.Builder builderForValue) {
          if (refreshBuilder_ == null) {
            refresh_ = builderForValue.build();
            onChanged();
          } else {
            refreshBuilder_.setMessage(builderForValue.build());
          }
          bitField0_ |= 0x00200000;
          return this;
        }
        /**
         * <pre>
         * Details about ad slots being refreshed automatically.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh refresh = 22;</code>
         */
        public Builder mergeRefresh(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh value) {
          if (refreshBuilder_ == null) {
            if (((bitField0_ & 0x00200000) != 0) &&
                refresh_ != null &&
                refresh_ != com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.getDefaultInstance()) {
              refresh_ =
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.newBuilder(refresh_).mergeFrom(value).buildPartial();
            } else {
              refresh_ = value;
            }
            onChanged();
          } else {
            refreshBuilder_.mergeFrom(value);
          }
          bitField0_ |= 0x00200000;
          return this;
        }
        /**
         * <pre>
         * Details about ad slots being refreshed automatically.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh refresh = 22;</code>
         */
        public Builder clearRefresh() {
          if (refreshBuilder_ == null) {
            refresh_ = null;
            onChanged();
          } else {
            refreshBuilder_.clear();
          }
          bitField0_ = (bitField0_ & ~0x00200000);
          return this;
        }
        /**
         * <pre>
         * Details about ad slots being refreshed automatically.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh refresh = 22;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.Builder getRefreshBuilder() {
          bitField0_ |= 0x00200000;
          onChanged();
          return getRefreshFieldBuilder().getBuilder();
        }
        /**
         * <pre>
         * Details about ad slots being refreshed automatically.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh refresh = 22;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.RefreshOrBuilder getRefreshOrBuilder() {
          if (refreshBuilder_ != null) {
            return refreshBuilder_.getMessageOrBuilder();
          } else {
            return refresh_ == null ?
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.getDefaultInstance() : refresh_;
          }
        }
        /**
         * <pre>
         * Details about ad slots being refreshed automatically.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Imp.Refresh refresh = 22;</code>
         */
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.RefreshOrBuilder> 
            getRefreshFieldBuilder() {
          if (refreshBuilder_ == null) {
            refreshBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Refresh.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.RefreshOrBuilder>(
                    getRefresh(),
                    getParentForChildren(),
                    isClean());
            refresh_ = null;
          }
          return refreshBuilder_;
        }
        @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:com.iabtechlab.openrtb.v2.BidRequest.Imp)
      }

      // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.BidRequest.Imp)
      private static final com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp DEFAULT_INSTANCE;
      static {
        DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp();
      }

      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp getDefaultInstance() {
        return DEFAULT_INSTANCE;
      }

      @java.lang.Deprecated public static final com.google.protobuf.Parser<Imp>
          PARSER = new com.google.protobuf.AbstractParser<Imp>() {
        @java.lang.Override
        public Imp parsePartialFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return new Imp(input, extensionRegistry);
        }
      };

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

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

      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp getDefaultInstanceForType() {
        return DEFAULT_INSTANCE;
      }

    }

    public interface SiteOrBuilder extends
        // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.BidRequest.Site)
        com.google.protobuf.GeneratedMessageV3.
            ExtendableMessageOrBuilder<Site> {

      /**
       * <pre>
       * Site ID on the exchange.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return Whether the id field is set.
       */
      boolean hasId();
      /**
       * <pre>
       * Site ID on the exchange.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return The id.
       */
      java.lang.String getId();
      /**
       * <pre>
       * Site ID on the exchange.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return The bytes for id.
       */
      com.google.protobuf.ByteString
          getIdBytes();

      /**
       * <pre>
       * Site name (may be masked at publisher's request).
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return Whether the name field is set.
       */
      boolean hasName();
      /**
       * <pre>
       * Site name (may be masked at publisher's request).
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return The name.
       */
      java.lang.String getName();
      /**
       * <pre>
       * Site name (may be masked at publisher's request).
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return The bytes for name.
       */
      com.google.protobuf.ByteString
          getNameBytes();

      /**
       * <pre>
       * Domain of the site, used for advertiser side blocking.
       * For example, "foo.com".
       * </pre>
       *
       * <code>optional string domain = 3;</code>
       * @return Whether the domain field is set.
       */
      boolean hasDomain();
      /**
       * <pre>
       * Domain of the site, used for advertiser side blocking.
       * For example, "foo.com".
       * </pre>
       *
       * <code>optional string domain = 3;</code>
       * @return The domain.
       */
      java.lang.String getDomain();
      /**
       * <pre>
       * Domain of the site, used for advertiser side blocking.
       * For example, "foo.com".
       * </pre>
       *
       * <code>optional string domain = 3;</code>
       * @return The bytes for domain.
       */
      com.google.protobuf.ByteString
          getDomainBytes();

      /**
       * <pre>
       * The taxonomy in use.
       * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
       * </pre>
       *
       * <code>optional int32 cattax = 16 [default = 1];</code>
       * @return Whether the cattax field is set.
       */
      boolean hasCattax();
      /**
       * <pre>
       * The taxonomy in use.
       * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
       * </pre>
       *
       * <code>optional int32 cattax = 16 [default = 1];</code>
       * @return The cattax.
       */
      int getCattax();

      /**
       * <pre>
       * Array of IAB content categories of the site.
       * </pre>
       *
       * <code>repeated string cat = 4;</code>
       * @return A list containing the cat.
       */
      java.util.List<java.lang.String>
          getCatList();
      /**
       * <pre>
       * Array of IAB content categories of the site.
       * </pre>
       *
       * <code>repeated string cat = 4;</code>
       * @return The count of cat.
       */
      int getCatCount();
      /**
       * <pre>
       * Array of IAB content categories of the site.
       * </pre>
       *
       * <code>repeated string cat = 4;</code>
       * @param index The index of the element to return.
       * @return The cat at the given index.
       */
      java.lang.String getCat(int index);
      /**
       * <pre>
       * Array of IAB content categories of the site.
       * </pre>
       *
       * <code>repeated string cat = 4;</code>
       * @param index The index of the value to return.
       * @return The bytes of the cat at the given index.
       */
      com.google.protobuf.ByteString
          getCatBytes(int index);

      /**
       * <pre>
       * Array of IAB content categories that describe the current section
       * of the site.
       * </pre>
       *
       * <code>repeated string sectioncat = 5;</code>
       * @return A list containing the sectioncat.
       */
      java.util.List<java.lang.String>
          getSectioncatList();
      /**
       * <pre>
       * Array of IAB content categories that describe the current section
       * of the site.
       * </pre>
       *
       * <code>repeated string sectioncat = 5;</code>
       * @return The count of sectioncat.
       */
      int getSectioncatCount();
      /**
       * <pre>
       * Array of IAB content categories that describe the current section
       * of the site.
       * </pre>
       *
       * <code>repeated string sectioncat = 5;</code>
       * @param index The index of the element to return.
       * @return The sectioncat at the given index.
       */
      java.lang.String getSectioncat(int index);
      /**
       * <pre>
       * Array of IAB content categories that describe the current section
       * of the site.
       * </pre>
       *
       * <code>repeated string sectioncat = 5;</code>
       * @param index The index of the value to return.
       * @return The bytes of the sectioncat at the given index.
       */
      com.google.protobuf.ByteString
          getSectioncatBytes(int index);

      /**
       * <pre>
       * Array of IAB content categories that describe the current page or view
       * of the site.
       * </pre>
       *
       * <code>repeated string pagecat = 6;</code>
       * @return A list containing the pagecat.
       */
      java.util.List<java.lang.String>
          getPagecatList();
      /**
       * <pre>
       * Array of IAB content categories that describe the current page or view
       * of the site.
       * </pre>
       *
       * <code>repeated string pagecat = 6;</code>
       * @return The count of pagecat.
       */
      int getPagecatCount();
      /**
       * <pre>
       * Array of IAB content categories that describe the current page or view
       * of the site.
       * </pre>
       *
       * <code>repeated string pagecat = 6;</code>
       * @param index The index of the element to return.
       * @return The pagecat at the given index.
       */
      java.lang.String getPagecat(int index);
      /**
       * <pre>
       * Array of IAB content categories that describe the current page or view
       * of the site.
       * </pre>
       *
       * <code>repeated string pagecat = 6;</code>
       * @param index The index of the value to return.
       * @return The bytes of the pagecat at the given index.
       */
      com.google.protobuf.ByteString
          getPagecatBytes(int index);

      /**
       * <pre>
       * URL of the page where the impression will be shown.
       * </pre>
       *
       * <code>optional string page = 7;</code>
       * @return Whether the page field is set.
       */
      boolean hasPage();
      /**
       * <pre>
       * URL of the page where the impression will be shown.
       * </pre>
       *
       * <code>optional string page = 7;</code>
       * @return The page.
       */
      java.lang.String getPage();
      /**
       * <pre>
       * URL of the page where the impression will be shown.
       * </pre>
       *
       * <code>optional string page = 7;</code>
       * @return The bytes for page.
       */
      com.google.protobuf.ByteString
          getPageBytes();

      /**
       * <pre>
       * Indicates if the site has a privacy policy, where 0 = no, 1 = yes.
       * </pre>
       *
       * <code>optional bool privacypolicy = 8;</code>
       * @return Whether the privacypolicy field is set.
       */
      boolean hasPrivacypolicy();
      /**
       * <pre>
       * Indicates if the site has a privacy policy, where 0 = no, 1 = yes.
       * </pre>
       *
       * <code>optional bool privacypolicy = 8;</code>
       * @return The privacypolicy.
       */
      boolean getPrivacypolicy();

      /**
       * <pre>
       * Referrer URL that caused navigation to the current page.
       * </pre>
       *
       * <code>optional string ref = 9;</code>
       * @return Whether the ref field is set.
       */
      boolean hasRef();
      /**
       * <pre>
       * Referrer URL that caused navigation to the current page.
       * </pre>
       *
       * <code>optional string ref = 9;</code>
       * @return The ref.
       */
      java.lang.String getRef();
      /**
       * <pre>
       * Referrer URL that caused navigation to the current page.
       * </pre>
       *
       * <code>optional string ref = 9;</code>
       * @return The bytes for ref.
       */
      com.google.protobuf.ByteString
          getRefBytes();

      /**
       * <pre>
       * Search string that caused navigation to the current page.
       * </pre>
       *
       * <code>optional string search = 10;</code>
       * @return Whether the search field is set.
       */
      boolean hasSearch();
      /**
       * <pre>
       * Search string that caused navigation to the current page.
       * </pre>
       *
       * <code>optional string search = 10;</code>
       * @return The search.
       */
      java.lang.String getSearch();
      /**
       * <pre>
       * Search string that caused navigation to the current page.
       * </pre>
       *
       * <code>optional string search = 10;</code>
       * @return The bytes for search.
       */
      com.google.protobuf.ByteString
          getSearchBytes();

      /**
       * <pre>
       * Details about the Publisher (Section 3.2.8) of the site.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Publisher publisher = 11;</code>
       * @return Whether the publisher field is set.
       */
      boolean hasPublisher();
      /**
       * <pre>
       * Details about the Publisher (Section 3.2.8) of the site.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Publisher publisher = 11;</code>
       * @return The publisher.
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher getPublisher();
      /**
       * <pre>
       * Details about the Publisher (Section 3.2.8) of the site.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Publisher publisher = 11;</code>
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.PublisherOrBuilder getPublisherOrBuilder();

      /**
       * <pre>
       * Details about the Content (Section 3.2.9) within the site.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Content content = 12;</code>
       * @return Whether the content field is set.
       */
      boolean hasContent();
      /**
       * <pre>
       * Details about the Content (Section 3.2.9) within the site.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Content content = 12;</code>
       * @return The content.
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content getContent();
      /**
       * <pre>
       * Details about the Content (Section 3.2.9) within the site.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Content content = 12;</code>
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.ContentOrBuilder getContentOrBuilder();

      /**
       * <pre>
       * Comma separated list of keywords about this site.
       * Note: OpenRTB 2.2 allowed an array-of-strings as alternate implementation
       * but this was fixed in 2.3+ where it's definitely a single string with CSV
       * content again. Compatibility with some OpenRTB 2.2 exchanges that adopted
       * the alternate representation may require custom handling of the JSON.
       * </pre>
       *
       * <code>optional string keywords = 13;</code>
       * @return Whether the keywords field is set.
       */
      boolean hasKeywords();
      /**
       * <pre>
       * Comma separated list of keywords about this site.
       * Note: OpenRTB 2.2 allowed an array-of-strings as alternate implementation
       * but this was fixed in 2.3+ where it's definitely a single string with CSV
       * content again. Compatibility with some OpenRTB 2.2 exchanges that adopted
       * the alternate representation may require custom handling of the JSON.
       * </pre>
       *
       * <code>optional string keywords = 13;</code>
       * @return The keywords.
       */
      java.lang.String getKeywords();
      /**
       * <pre>
       * Comma separated list of keywords about this site.
       * Note: OpenRTB 2.2 allowed an array-of-strings as alternate implementation
       * but this was fixed in 2.3+ where it's definitely a single string with CSV
       * content again. Compatibility with some OpenRTB 2.2 exchanges that adopted
       * the alternate representation may require custom handling of the JSON.
       * </pre>
       *
       * <code>optional string keywords = 13;</code>
       * @return The bytes for keywords.
       */
      com.google.protobuf.ByteString
          getKeywordsBytes();

      /**
       * <pre>
       * Indicates if the site has been programmed to optimize layout
       * when viewed on mobile devices, where 0 = no, 1 = yes.
       * </pre>
       *
       * <code>optional bool mobile = 15;</code>
       * @return Whether the mobile field is set.
       */
      boolean hasMobile();
      /**
       * <pre>
       * Indicates if the site has been programmed to optimize layout
       * when viewed on mobile devices, where 0 = no, 1 = yes.
       * </pre>
       *
       * <code>optional bool mobile = 15;</code>
       * @return The mobile.
       */
      boolean getMobile();
    }
    /**
     * <pre>
     * OpenRTB 2.0: This object should be included if the ad supported content
     * is a website as opposed to a non-browser application. A bid request must
     * not contain both a Site and an App object. At a minimum, it is useful to
     * provide a site ID or page URL, but this is not strictly required.
     * </pre>
     *
     * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Site}
     */
    public static final class Site extends
        com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
          Site> implements
        // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.BidRequest.Site)
        SiteOrBuilder {
    private static final long serialVersionUID = 0L;
      // Use Site.newBuilder() to construct.
      private Site(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site, ?> builder) {
        super(builder);
      }
      private Site() {
        id_ = "";
        name_ = "";
        domain_ = "";
        cattax_ = 1;
        cat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        sectioncat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        pagecat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        page_ = "";
        ref_ = "";
        search_ = "";
        keywords_ = "";
      }

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

      @java.lang.Override
      public final com.google.protobuf.UnknownFieldSet
      getUnknownFields() {
        return this.unknownFields;
      }
      private Site(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        this();
        if (extensionRegistry == null) {
          throw new java.lang.NullPointerException();
        }
        int mutable_bitField0_ = 0;
        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
            com.google.protobuf.UnknownFieldSet.newBuilder();
        try {
          boolean done = false;
          while (!done) {
            int tag = input.readTag();
            switch (tag) {
              case 0:
                done = true;
                break;
              case 10: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000001;
                id_ = bs;
                break;
              }
              case 18: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000002;
                name_ = bs;
                break;
              }
              case 26: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000004;
                domain_ = bs;
                break;
              }
              case 34: {
                com.google.protobuf.ByteString bs = input.readBytes();
                if (!((mutable_bitField0_ & 0x00000010) != 0)) {
                  cat_ = new com.google.protobuf.LazyStringArrayList();
                  mutable_bitField0_ |= 0x00000010;
                }
                cat_.add(bs);
                break;
              }
              case 42: {
                com.google.protobuf.ByteString bs = input.readBytes();
                if (!((mutable_bitField0_ & 0x00000020) != 0)) {
                  sectioncat_ = new com.google.protobuf.LazyStringArrayList();
                  mutable_bitField0_ |= 0x00000020;
                }
                sectioncat_.add(bs);
                break;
              }
              case 50: {
                com.google.protobuf.ByteString bs = input.readBytes();
                if (!((mutable_bitField0_ & 0x00000040) != 0)) {
                  pagecat_ = new com.google.protobuf.LazyStringArrayList();
                  mutable_bitField0_ |= 0x00000040;
                }
                pagecat_.add(bs);
                break;
              }
              case 58: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000010;
                page_ = bs;
                break;
              }
              case 64: {
                bitField0_ |= 0x00000020;
                privacypolicy_ = input.readBool();
                break;
              }
              case 74: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000040;
                ref_ = bs;
                break;
              }
              case 82: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000080;
                search_ = bs;
                break;
              }
              case 90: {
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher.Builder subBuilder = null;
                if (((bitField0_ & 0x00000100) != 0)) {
                  subBuilder = publisher_.toBuilder();
                }
                publisher_ = input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher.PARSER, extensionRegistry);
                if (subBuilder != null) {
                  subBuilder.mergeFrom(publisher_);
                  publisher_ = subBuilder.buildPartial();
                }
                bitField0_ |= 0x00000100;
                break;
              }
              case 98: {
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content.Builder subBuilder = null;
                if (((bitField0_ & 0x00000200) != 0)) {
                  subBuilder = content_.toBuilder();
                }
                content_ = input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content.PARSER, extensionRegistry);
                if (subBuilder != null) {
                  subBuilder.mergeFrom(content_);
                  content_ = subBuilder.buildPartial();
                }
                bitField0_ |= 0x00000200;
                break;
              }
              case 106: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000400;
                keywords_ = bs;
                break;
              }
              case 120: {
                bitField0_ |= 0x00000800;
                mobile_ = input.readBool();
                break;
              }
              case 128: {
                bitField0_ |= 0x00000008;
                cattax_ = input.readInt32();
                break;
              }
              default: {
                if (!parseUnknownField(
                    input, unknownFields, extensionRegistry, tag)) {
                  done = true;
                }
                break;
              }
            }
          }
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          throw e.setUnfinishedMessage(this);
        } catch (java.io.IOException e) {
          throw new com.google.protobuf.InvalidProtocolBufferException(
              e).setUnfinishedMessage(this);
        } finally {
          if (((mutable_bitField0_ & 0x00000010) != 0)) {
            cat_ = cat_.getUnmodifiableView();
          }
          if (((mutable_bitField0_ & 0x00000020) != 0)) {
            sectioncat_ = sectioncat_.getUnmodifiableView();
          }
          if (((mutable_bitField0_ & 0x00000040) != 0)) {
            pagecat_ = pagecat_.getUnmodifiableView();
          }
          this.unknownFields = unknownFields.build();
          makeExtensionsImmutable();
        }
      }
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Site_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Site_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site.Builder.class);
      }

      private int bitField0_;
      public static final int ID_FIELD_NUMBER = 1;
      private volatile java.lang.Object id_;
      /**
       * <pre>
       * Site ID on the exchange.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return Whether the id field is set.
       */
      @java.lang.Override
      public boolean hasId() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <pre>
       * Site ID on the exchange.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return The id.
       */
      @java.lang.Override
      public java.lang.String getId() {
        java.lang.Object ref = id_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            id_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Site ID on the exchange.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return The bytes for id.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getIdBytes() {
        java.lang.Object ref = id_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          id_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int NAME_FIELD_NUMBER = 2;
      private volatile java.lang.Object name_;
      /**
       * <pre>
       * Site name (may be masked at publisher's request).
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return Whether the name field is set.
       */
      @java.lang.Override
      public boolean hasName() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <pre>
       * Site name (may be masked at publisher's request).
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return The name.
       */
      @java.lang.Override
      public java.lang.String getName() {
        java.lang.Object ref = name_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            name_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Site name (may be masked at publisher's request).
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return The bytes for name.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getNameBytes() {
        java.lang.Object ref = name_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          name_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int DOMAIN_FIELD_NUMBER = 3;
      private volatile java.lang.Object domain_;
      /**
       * <pre>
       * Domain of the site, used for advertiser side blocking.
       * For example, "foo.com".
       * </pre>
       *
       * <code>optional string domain = 3;</code>
       * @return Whether the domain field is set.
       */
      @java.lang.Override
      public boolean hasDomain() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <pre>
       * Domain of the site, used for advertiser side blocking.
       * For example, "foo.com".
       * </pre>
       *
       * <code>optional string domain = 3;</code>
       * @return The domain.
       */
      @java.lang.Override
      public java.lang.String getDomain() {
        java.lang.Object ref = domain_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            domain_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Domain of the site, used for advertiser side blocking.
       * For example, "foo.com".
       * </pre>
       *
       * <code>optional string domain = 3;</code>
       * @return The bytes for domain.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getDomainBytes() {
        java.lang.Object ref = domain_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          domain_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int CATTAX_FIELD_NUMBER = 16;
      private int cattax_;
      /**
       * <pre>
       * The taxonomy in use.
       * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
       * </pre>
       *
       * <code>optional int32 cattax = 16 [default = 1];</code>
       * @return Whether the cattax field is set.
       */
      @java.lang.Override
      public boolean hasCattax() {
        return ((bitField0_ & 0x00000008) != 0);
      }
      /**
       * <pre>
       * The taxonomy in use.
       * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
       * </pre>
       *
       * <code>optional int32 cattax = 16 [default = 1];</code>
       * @return The cattax.
       */
      @java.lang.Override
      public int getCattax() {
        return cattax_;
      }

      public static final int CAT_FIELD_NUMBER = 4;
      private com.google.protobuf.LazyStringList cat_;
      /**
       * <pre>
       * Array of IAB content categories of the site.
       * </pre>
       *
       * <code>repeated string cat = 4;</code>
       * @return A list containing the cat.
       */
      public com.google.protobuf.ProtocolStringList
          getCatList() {
        return cat_;
      }
      /**
       * <pre>
       * Array of IAB content categories of the site.
       * </pre>
       *
       * <code>repeated string cat = 4;</code>
       * @return The count of cat.
       */
      public int getCatCount() {
        return cat_.size();
      }
      /**
       * <pre>
       * Array of IAB content categories of the site.
       * </pre>
       *
       * <code>repeated string cat = 4;</code>
       * @param index The index of the element to return.
       * @return The cat at the given index.
       */
      public java.lang.String getCat(int index) {
        return cat_.get(index);
      }
      /**
       * <pre>
       * Array of IAB content categories of the site.
       * </pre>
       *
       * <code>repeated string cat = 4;</code>
       * @param index The index of the value to return.
       * @return The bytes of the cat at the given index.
       */
      public com.google.protobuf.ByteString
          getCatBytes(int index) {
        return cat_.getByteString(index);
      }

      public static final int SECTIONCAT_FIELD_NUMBER = 5;
      private com.google.protobuf.LazyStringList sectioncat_;
      /**
       * <pre>
       * Array of IAB content categories that describe the current section
       * of the site.
       * </pre>
       *
       * <code>repeated string sectioncat = 5;</code>
       * @return A list containing the sectioncat.
       */
      public com.google.protobuf.ProtocolStringList
          getSectioncatList() {
        return sectioncat_;
      }
      /**
       * <pre>
       * Array of IAB content categories that describe the current section
       * of the site.
       * </pre>
       *
       * <code>repeated string sectioncat = 5;</code>
       * @return The count of sectioncat.
       */
      public int getSectioncatCount() {
        return sectioncat_.size();
      }
      /**
       * <pre>
       * Array of IAB content categories that describe the current section
       * of the site.
       * </pre>
       *
       * <code>repeated string sectioncat = 5;</code>
       * @param index The index of the element to return.
       * @return The sectioncat at the given index.
       */
      public java.lang.String getSectioncat(int index) {
        return sectioncat_.get(index);
      }
      /**
       * <pre>
       * Array of IAB content categories that describe the current section
       * of the site.
       * </pre>
       *
       * <code>repeated string sectioncat = 5;</code>
       * @param index The index of the value to return.
       * @return The bytes of the sectioncat at the given index.
       */
      public com.google.protobuf.ByteString
          getSectioncatBytes(int index) {
        return sectioncat_.getByteString(index);
      }

      public static final int PAGECAT_FIELD_NUMBER = 6;
      private com.google.protobuf.LazyStringList pagecat_;
      /**
       * <pre>
       * Array of IAB content categories that describe the current page or view
       * of the site.
       * </pre>
       *
       * <code>repeated string pagecat = 6;</code>
       * @return A list containing the pagecat.
       */
      public com.google.protobuf.ProtocolStringList
          getPagecatList() {
        return pagecat_;
      }
      /**
       * <pre>
       * Array of IAB content categories that describe the current page or view
       * of the site.
       * </pre>
       *
       * <code>repeated string pagecat = 6;</code>
       * @return The count of pagecat.
       */
      public int getPagecatCount() {
        return pagecat_.size();
      }
      /**
       * <pre>
       * Array of IAB content categories that describe the current page or view
       * of the site.
       * </pre>
       *
       * <code>repeated string pagecat = 6;</code>
       * @param index The index of the element to return.
       * @return The pagecat at the given index.
       */
      public java.lang.String getPagecat(int index) {
        return pagecat_.get(index);
      }
      /**
       * <pre>
       * Array of IAB content categories that describe the current page or view
       * of the site.
       * </pre>
       *
       * <code>repeated string pagecat = 6;</code>
       * @param index The index of the value to return.
       * @return The bytes of the pagecat at the given index.
       */
      public com.google.protobuf.ByteString
          getPagecatBytes(int index) {
        return pagecat_.getByteString(index);
      }

      public static final int PAGE_FIELD_NUMBER = 7;
      private volatile java.lang.Object page_;
      /**
       * <pre>
       * URL of the page where the impression will be shown.
       * </pre>
       *
       * <code>optional string page = 7;</code>
       * @return Whether the page field is set.
       */
      @java.lang.Override
      public boolean hasPage() {
        return ((bitField0_ & 0x00000010) != 0);
      }
      /**
       * <pre>
       * URL of the page where the impression will be shown.
       * </pre>
       *
       * <code>optional string page = 7;</code>
       * @return The page.
       */
      @java.lang.Override
      public java.lang.String getPage() {
        java.lang.Object ref = page_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            page_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * URL of the page where the impression will be shown.
       * </pre>
       *
       * <code>optional string page = 7;</code>
       * @return The bytes for page.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getPageBytes() {
        java.lang.Object ref = page_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          page_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int PRIVACYPOLICY_FIELD_NUMBER = 8;
      private boolean privacypolicy_;
      /**
       * <pre>
       * Indicates if the site has a privacy policy, where 0 = no, 1 = yes.
       * </pre>
       *
       * <code>optional bool privacypolicy = 8;</code>
       * @return Whether the privacypolicy field is set.
       */
      @java.lang.Override
      public boolean hasPrivacypolicy() {
        return ((bitField0_ & 0x00000020) != 0);
      }
      /**
       * <pre>
       * Indicates if the site has a privacy policy, where 0 = no, 1 = yes.
       * </pre>
       *
       * <code>optional bool privacypolicy = 8;</code>
       * @return The privacypolicy.
       */
      @java.lang.Override
      public boolean getPrivacypolicy() {
        return privacypolicy_;
      }

      public static final int REF_FIELD_NUMBER = 9;
      private volatile java.lang.Object ref_;
      /**
       * <pre>
       * Referrer URL that caused navigation to the current page.
       * </pre>
       *
       * <code>optional string ref = 9;</code>
       * @return Whether the ref field is set.
       */
      @java.lang.Override
      public boolean hasRef() {
        return ((bitField0_ & 0x00000040) != 0);
      }
      /**
       * <pre>
       * Referrer URL that caused navigation to the current page.
       * </pre>
       *
       * <code>optional string ref = 9;</code>
       * @return The ref.
       */
      @java.lang.Override
      public java.lang.String getRef() {
        java.lang.Object ref = ref_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            ref_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Referrer URL that caused navigation to the current page.
       * </pre>
       *
       * <code>optional string ref = 9;</code>
       * @return The bytes for ref.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getRefBytes() {
        java.lang.Object ref = ref_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          ref_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int SEARCH_FIELD_NUMBER = 10;
      private volatile java.lang.Object search_;
      /**
       * <pre>
       * Search string that caused navigation to the current page.
       * </pre>
       *
       * <code>optional string search = 10;</code>
       * @return Whether the search field is set.
       */
      @java.lang.Override
      public boolean hasSearch() {
        return ((bitField0_ & 0x00000080) != 0);
      }
      /**
       * <pre>
       * Search string that caused navigation to the current page.
       * </pre>
       *
       * <code>optional string search = 10;</code>
       * @return The search.
       */
      @java.lang.Override
      public java.lang.String getSearch() {
        java.lang.Object ref = search_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            search_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Search string that caused navigation to the current page.
       * </pre>
       *
       * <code>optional string search = 10;</code>
       * @return The bytes for search.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getSearchBytes() {
        java.lang.Object ref = search_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          search_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int PUBLISHER_FIELD_NUMBER = 11;
      private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher publisher_;
      /**
       * <pre>
       * Details about the Publisher (Section 3.2.8) of the site.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Publisher publisher = 11;</code>
       * @return Whether the publisher field is set.
       */
      @java.lang.Override
      public boolean hasPublisher() {
        return ((bitField0_ & 0x00000100) != 0);
      }
      /**
       * <pre>
       * Details about the Publisher (Section 3.2.8) of the site.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Publisher publisher = 11;</code>
       * @return The publisher.
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher getPublisher() {
        return publisher_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher.getDefaultInstance() : publisher_;
      }
      /**
       * <pre>
       * Details about the Publisher (Section 3.2.8) of the site.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Publisher publisher = 11;</code>
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.PublisherOrBuilder getPublisherOrBuilder() {
        return publisher_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher.getDefaultInstance() : publisher_;
      }

      public static final int CONTENT_FIELD_NUMBER = 12;
      private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content content_;
      /**
       * <pre>
       * Details about the Content (Section 3.2.9) within the site.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Content content = 12;</code>
       * @return Whether the content field is set.
       */
      @java.lang.Override
      public boolean hasContent() {
        return ((bitField0_ & 0x00000200) != 0);
      }
      /**
       * <pre>
       * Details about the Content (Section 3.2.9) within the site.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Content content = 12;</code>
       * @return The content.
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content getContent() {
        return content_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content.getDefaultInstance() : content_;
      }
      /**
       * <pre>
       * Details about the Content (Section 3.2.9) within the site.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Content content = 12;</code>
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.ContentOrBuilder getContentOrBuilder() {
        return content_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content.getDefaultInstance() : content_;
      }

      public static final int KEYWORDS_FIELD_NUMBER = 13;
      private volatile java.lang.Object keywords_;
      /**
       * <pre>
       * Comma separated list of keywords about this site.
       * Note: OpenRTB 2.2 allowed an array-of-strings as alternate implementation
       * but this was fixed in 2.3+ where it's definitely a single string with CSV
       * content again. Compatibility with some OpenRTB 2.2 exchanges that adopted
       * the alternate representation may require custom handling of the JSON.
       * </pre>
       *
       * <code>optional string keywords = 13;</code>
       * @return Whether the keywords field is set.
       */
      @java.lang.Override
      public boolean hasKeywords() {
        return ((bitField0_ & 0x00000400) != 0);
      }
      /**
       * <pre>
       * Comma separated list of keywords about this site.
       * Note: OpenRTB 2.2 allowed an array-of-strings as alternate implementation
       * but this was fixed in 2.3+ where it's definitely a single string with CSV
       * content again. Compatibility with some OpenRTB 2.2 exchanges that adopted
       * the alternate representation may require custom handling of the JSON.
       * </pre>
       *
       * <code>optional string keywords = 13;</code>
       * @return The keywords.
       */
      @java.lang.Override
      public java.lang.String getKeywords() {
        java.lang.Object ref = keywords_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            keywords_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Comma separated list of keywords about this site.
       * Note: OpenRTB 2.2 allowed an array-of-strings as alternate implementation
       * but this was fixed in 2.3+ where it's definitely a single string with CSV
       * content again. Compatibility with some OpenRTB 2.2 exchanges that adopted
       * the alternate representation may require custom handling of the JSON.
       * </pre>
       *
       * <code>optional string keywords = 13;</code>
       * @return The bytes for keywords.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getKeywordsBytes() {
        java.lang.Object ref = keywords_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          keywords_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int MOBILE_FIELD_NUMBER = 15;
      private boolean mobile_;
      /**
       * <pre>
       * Indicates if the site has been programmed to optimize layout
       * when viewed on mobile devices, where 0 = no, 1 = yes.
       * </pre>
       *
       * <code>optional bool mobile = 15;</code>
       * @return Whether the mobile field is set.
       */
      @java.lang.Override
      public boolean hasMobile() {
        return ((bitField0_ & 0x00000800) != 0);
      }
      /**
       * <pre>
       * Indicates if the site has been programmed to optimize layout
       * when viewed on mobile devices, where 0 = no, 1 = yes.
       * </pre>
       *
       * <code>optional bool mobile = 15;</code>
       * @return The mobile.
       */
      @java.lang.Override
      public boolean getMobile() {
        return mobile_;
      }

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

        if (hasPublisher()) {
          if (!getPublisher().isInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
        }
        if (hasContent()) {
          if (!getContent().isInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
        }
        if (!extensionsAreInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
        memoizedIsInitialized = 1;
        return true;
      }

      @java.lang.Override
      public void writeTo(com.google.protobuf.CodedOutputStream output)
                          throws java.io.IOException {
        com.google.protobuf.GeneratedMessageV3
          .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site>.ExtensionWriter
            extensionWriter = newExtensionWriter();
        if (((bitField0_ & 0x00000001) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 1, id_);
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 2, name_);
        }
        if (((bitField0_ & 0x00000004) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 3, domain_);
        }
        for (int i = 0; i < cat_.size(); i++) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 4, cat_.getRaw(i));
        }
        for (int i = 0; i < sectioncat_.size(); i++) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 5, sectioncat_.getRaw(i));
        }
        for (int i = 0; i < pagecat_.size(); i++) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 6, pagecat_.getRaw(i));
        }
        if (((bitField0_ & 0x00000010) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 7, page_);
        }
        if (((bitField0_ & 0x00000020) != 0)) {
          output.writeBool(8, privacypolicy_);
        }
        if (((bitField0_ & 0x00000040) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 9, ref_);
        }
        if (((bitField0_ & 0x00000080) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 10, search_);
        }
        if (((bitField0_ & 0x00000100) != 0)) {
          output.writeMessage(11, getPublisher());
        }
        if (((bitField0_ & 0x00000200) != 0)) {
          output.writeMessage(12, getContent());
        }
        if (((bitField0_ & 0x00000400) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 13, keywords_);
        }
        if (((bitField0_ & 0x00000800) != 0)) {
          output.writeBool(15, mobile_);
        }
        if (((bitField0_ & 0x00000008) != 0)) {
          output.writeInt32(16, cattax_);
        }
        extensionWriter.writeUntil(10000, output);
        unknownFields.writeTo(output);
      }

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

        size = 0;
        if (((bitField0_ & 0x00000001) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, id_);
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, name_);
        }
        if (((bitField0_ & 0x00000004) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, domain_);
        }
        {
          int dataSize = 0;
          for (int i = 0; i < cat_.size(); i++) {
            dataSize += computeStringSizeNoTag(cat_.getRaw(i));
          }
          size += dataSize;
          size += 1 * getCatList().size();
        }
        {
          int dataSize = 0;
          for (int i = 0; i < sectioncat_.size(); i++) {
            dataSize += computeStringSizeNoTag(sectioncat_.getRaw(i));
          }
          size += dataSize;
          size += 1 * getSectioncatList().size();
        }
        {
          int dataSize = 0;
          for (int i = 0; i < pagecat_.size(); i++) {
            dataSize += computeStringSizeNoTag(pagecat_.getRaw(i));
          }
          size += dataSize;
          size += 1 * getPagecatList().size();
        }
        if (((bitField0_ & 0x00000010) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(7, page_);
        }
        if (((bitField0_ & 0x00000020) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeBoolSize(8, privacypolicy_);
        }
        if (((bitField0_ & 0x00000040) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(9, ref_);
        }
        if (((bitField0_ & 0x00000080) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(10, search_);
        }
        if (((bitField0_ & 0x00000100) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeMessageSize(11, getPublisher());
        }
        if (((bitField0_ & 0x00000200) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeMessageSize(12, getContent());
        }
        if (((bitField0_ & 0x00000400) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(13, keywords_);
        }
        if (((bitField0_ & 0x00000800) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeBoolSize(15, mobile_);
        }
        if (((bitField0_ & 0x00000008) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeInt32Size(16, cattax_);
        }
        size += extensionsSerializedSize();
        size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site)) {
          return super.equals(obj);
        }
        com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site other = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site) obj;

        if (hasId() != other.hasId()) return false;
        if (hasId()) {
          if (!getId()
              .equals(other.getId())) return false;
        }
        if (hasName() != other.hasName()) return false;
        if (hasName()) {
          if (!getName()
              .equals(other.getName())) return false;
        }
        if (hasDomain() != other.hasDomain()) return false;
        if (hasDomain()) {
          if (!getDomain()
              .equals(other.getDomain())) return false;
        }
        if (hasCattax() != other.hasCattax()) return false;
        if (hasCattax()) {
          if (getCattax()
              != other.getCattax()) return false;
        }
        if (!getCatList()
            .equals(other.getCatList())) return false;
        if (!getSectioncatList()
            .equals(other.getSectioncatList())) return false;
        if (!getPagecatList()
            .equals(other.getPagecatList())) return false;
        if (hasPage() != other.hasPage()) return false;
        if (hasPage()) {
          if (!getPage()
              .equals(other.getPage())) return false;
        }
        if (hasPrivacypolicy() != other.hasPrivacypolicy()) return false;
        if (hasPrivacypolicy()) {
          if (getPrivacypolicy()
              != other.getPrivacypolicy()) return false;
        }
        if (hasRef() != other.hasRef()) return false;
        if (hasRef()) {
          if (!getRef()
              .equals(other.getRef())) return false;
        }
        if (hasSearch() != other.hasSearch()) return false;
        if (hasSearch()) {
          if (!getSearch()
              .equals(other.getSearch())) return false;
        }
        if (hasPublisher() != other.hasPublisher()) return false;
        if (hasPublisher()) {
          if (!getPublisher()
              .equals(other.getPublisher())) return false;
        }
        if (hasContent() != other.hasContent()) return false;
        if (hasContent()) {
          if (!getContent()
              .equals(other.getContent())) return false;
        }
        if (hasKeywords() != other.hasKeywords()) return false;
        if (hasKeywords()) {
          if (!getKeywords()
              .equals(other.getKeywords())) return false;
        }
        if (hasMobile() != other.hasMobile()) return false;
        if (hasMobile()) {
          if (getMobile()
              != other.getMobile()) return false;
        }
        if (!unknownFields.equals(other.unknownFields)) return false;
        if (!getExtensionFields().equals(other.getExtensionFields()))
          return false;
        return true;
      }

      @java.lang.Override
      public int hashCode() {
        if (memoizedHashCode != 0) {
          return memoizedHashCode;
        }
        int hash = 41;
        hash = (19 * hash) + getDescriptor().hashCode();
        if (hasId()) {
          hash = (37 * hash) + ID_FIELD_NUMBER;
          hash = (53 * hash) + getId().hashCode();
        }
        if (hasName()) {
          hash = (37 * hash) + NAME_FIELD_NUMBER;
          hash = (53 * hash) + getName().hashCode();
        }
        if (hasDomain()) {
          hash = (37 * hash) + DOMAIN_FIELD_NUMBER;
          hash = (53 * hash) + getDomain().hashCode();
        }
        if (hasCattax()) {
          hash = (37 * hash) + CATTAX_FIELD_NUMBER;
          hash = (53 * hash) + getCattax();
        }
        if (getCatCount() > 0) {
          hash = (37 * hash) + CAT_FIELD_NUMBER;
          hash = (53 * hash) + getCatList().hashCode();
        }
        if (getSectioncatCount() > 0) {
          hash = (37 * hash) + SECTIONCAT_FIELD_NUMBER;
          hash = (53 * hash) + getSectioncatList().hashCode();
        }
        if (getPagecatCount() > 0) {
          hash = (37 * hash) + PAGECAT_FIELD_NUMBER;
          hash = (53 * hash) + getPagecatList().hashCode();
        }
        if (hasPage()) {
          hash = (37 * hash) + PAGE_FIELD_NUMBER;
          hash = (53 * hash) + getPage().hashCode();
        }
        if (hasPrivacypolicy()) {
          hash = (37 * hash) + PRIVACYPOLICY_FIELD_NUMBER;
          hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
              getPrivacypolicy());
        }
        if (hasRef()) {
          hash = (37 * hash) + REF_FIELD_NUMBER;
          hash = (53 * hash) + getRef().hashCode();
        }
        if (hasSearch()) {
          hash = (37 * hash) + SEARCH_FIELD_NUMBER;
          hash = (53 * hash) + getSearch().hashCode();
        }
        if (hasPublisher()) {
          hash = (37 * hash) + PUBLISHER_FIELD_NUMBER;
          hash = (53 * hash) + getPublisher().hashCode();
        }
        if (hasContent()) {
          hash = (37 * hash) + CONTENT_FIELD_NUMBER;
          hash = (53 * hash) + getContent().hashCode();
        }
        if (hasKeywords()) {
          hash = (37 * hash) + KEYWORDS_FIELD_NUMBER;
          hash = (53 * hash) + getKeywords().hashCode();
        }
        if (hasMobile()) {
          hash = (37 * hash) + MOBILE_FIELD_NUMBER;
          hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
              getMobile());
        }
        hash = hashFields(hash, getExtensionFields());
        hash = (29 * hash) + unknownFields.hashCode();
        memoizedHashCode = hash;
        return hash;
      }

      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site parseFrom(
          java.nio.ByteBuffer data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site parseFrom(
          java.nio.ByteBuffer data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site parseFrom(
          com.google.protobuf.ByteString data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site parseFrom(
          com.google.protobuf.ByteString data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site parseFrom(byte[] data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site parseFrom(
          byte[] data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site parseFrom(java.io.InputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site parseDelimitedFrom(java.io.InputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseDelimitedWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site parseFrom(
          com.google.protobuf.CodedInputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site 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>
       * OpenRTB 2.0: This object should be included if the ad supported content
       * is a website as opposed to a non-browser application. A bid request must
       * not contain both a Site and an App object. At a minimum, it is useful to
       * provide a site ID or page URL, but this is not strictly required.
       * </pre>
       *
       * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Site}
       */
      public static final class Builder extends
          com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site, Builder> implements
          // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.BidRequest.Site)
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.SiteOrBuilder {
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Site_descriptor;
        }

        @java.lang.Override
        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Site_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site.Builder.class);
        }

        // Construct using com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site.newBuilder()
        private Builder() {
          maybeForceBuilderInitialization();
        }

        private Builder(
            com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
          super(parent);
          maybeForceBuilderInitialization();
        }
        private void maybeForceBuilderInitialization() {
          if (com.google.protobuf.GeneratedMessageV3
                  .alwaysUseFieldBuilders) {
            getPublisherFieldBuilder();
            getContentFieldBuilder();
          }
        }
        @java.lang.Override
        public Builder clear() {
          super.clear();
          id_ = "";
          bitField0_ = (bitField0_ & ~0x00000001);
          name_ = "";
          bitField0_ = (bitField0_ & ~0x00000002);
          domain_ = "";
          bitField0_ = (bitField0_ & ~0x00000004);
          cattax_ = 1;
          bitField0_ = (bitField0_ & ~0x00000008);
          cat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
          bitField0_ = (bitField0_ & ~0x00000010);
          sectioncat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
          bitField0_ = (bitField0_ & ~0x00000020);
          pagecat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
          bitField0_ = (bitField0_ & ~0x00000040);
          page_ = "";
          bitField0_ = (bitField0_ & ~0x00000080);
          privacypolicy_ = false;
          bitField0_ = (bitField0_ & ~0x00000100);
          ref_ = "";
          bitField0_ = (bitField0_ & ~0x00000200);
          search_ = "";
          bitField0_ = (bitField0_ & ~0x00000400);
          if (publisherBuilder_ == null) {
            publisher_ = null;
          } else {
            publisherBuilder_.clear();
          }
          bitField0_ = (bitField0_ & ~0x00000800);
          if (contentBuilder_ == null) {
            content_ = null;
          } else {
            contentBuilder_.clear();
          }
          bitField0_ = (bitField0_ & ~0x00001000);
          keywords_ = "";
          bitField0_ = (bitField0_ & ~0x00002000);
          mobile_ = false;
          bitField0_ = (bitField0_ & ~0x00004000);
          return this;
        }

        @java.lang.Override
        public com.google.protobuf.Descriptors.Descriptor
            getDescriptorForType() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Site_descriptor;
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site getDefaultInstanceForType() {
          return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site.getDefaultInstance();
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site build() {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site result = buildPartial();
          if (!result.isInitialized()) {
            throw newUninitializedMessageException(result);
          }
          return result;
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site buildPartial() {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site result = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site(this);
          int from_bitField0_ = bitField0_;
          int to_bitField0_ = 0;
          if (((from_bitField0_ & 0x00000001) != 0)) {
            to_bitField0_ |= 0x00000001;
          }
          result.id_ = id_;
          if (((from_bitField0_ & 0x00000002) != 0)) {
            to_bitField0_ |= 0x00000002;
          }
          result.name_ = name_;
          if (((from_bitField0_ & 0x00000004) != 0)) {
            to_bitField0_ |= 0x00000004;
          }
          result.domain_ = domain_;
          if (((from_bitField0_ & 0x00000008) != 0)) {
            to_bitField0_ |= 0x00000008;
          }
          result.cattax_ = cattax_;
          if (((bitField0_ & 0x00000010) != 0)) {
            cat_ = cat_.getUnmodifiableView();
            bitField0_ = (bitField0_ & ~0x00000010);
          }
          result.cat_ = cat_;
          if (((bitField0_ & 0x00000020) != 0)) {
            sectioncat_ = sectioncat_.getUnmodifiableView();
            bitField0_ = (bitField0_ & ~0x00000020);
          }
          result.sectioncat_ = sectioncat_;
          if (((bitField0_ & 0x00000040) != 0)) {
            pagecat_ = pagecat_.getUnmodifiableView();
            bitField0_ = (bitField0_ & ~0x00000040);
          }
          result.pagecat_ = pagecat_;
          if (((from_bitField0_ & 0x00000080) != 0)) {
            to_bitField0_ |= 0x00000010;
          }
          result.page_ = page_;
          if (((from_bitField0_ & 0x00000100) != 0)) {
            result.privacypolicy_ = privacypolicy_;
            to_bitField0_ |= 0x00000020;
          }
          if (((from_bitField0_ & 0x00000200) != 0)) {
            to_bitField0_ |= 0x00000040;
          }
          result.ref_ = ref_;
          if (((from_bitField0_ & 0x00000400) != 0)) {
            to_bitField0_ |= 0x00000080;
          }
          result.search_ = search_;
          if (((from_bitField0_ & 0x00000800) != 0)) {
            if (publisherBuilder_ == null) {
              result.publisher_ = publisher_;
            } else {
              result.publisher_ = publisherBuilder_.build();
            }
            to_bitField0_ |= 0x00000100;
          }
          if (((from_bitField0_ & 0x00001000) != 0)) {
            if (contentBuilder_ == null) {
              result.content_ = content_;
            } else {
              result.content_ = contentBuilder_.build();
            }
            to_bitField0_ |= 0x00000200;
          }
          if (((from_bitField0_ & 0x00002000) != 0)) {
            to_bitField0_ |= 0x00000400;
          }
          result.keywords_ = keywords_;
          if (((from_bitField0_ & 0x00004000) != 0)) {
            result.mobile_ = mobile_;
            to_bitField0_ |= 0x00000800;
          }
          result.bitField0_ = to_bitField0_;
          onBuilt();
          return result;
        }

        @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 <Type> Builder setExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site, Type> extension,
            Type value) {
          return super.setExtension(extension, value);
        }
        @java.lang.Override
        public <Type> Builder setExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site, java.util.List<Type>> extension,
            int index, Type value) {
          return super.setExtension(extension, index, value);
        }
        @java.lang.Override
        public <Type> Builder addExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site, java.util.List<Type>> extension,
            Type value) {
          return super.addExtension(extension, value);
        }
        @java.lang.Override
        public <Type> Builder clearExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site, ?> extension) {
          return super.clearExtension(extension);
        }
        @java.lang.Override
        public Builder mergeFrom(com.google.protobuf.Message other) {
          if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site) {
            return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site)other);
          } else {
            super.mergeFrom(other);
            return this;
          }
        }

        public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site other) {
          if (other == com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site.getDefaultInstance()) return this;
          if (other.hasId()) {
            bitField0_ |= 0x00000001;
            id_ = other.id_;
            onChanged();
          }
          if (other.hasName()) {
            bitField0_ |= 0x00000002;
            name_ = other.name_;
            onChanged();
          }
          if (other.hasDomain()) {
            bitField0_ |= 0x00000004;
            domain_ = other.domain_;
            onChanged();
          }
          if (other.hasCattax()) {
            setCattax(other.getCattax());
          }
          if (!other.cat_.isEmpty()) {
            if (cat_.isEmpty()) {
              cat_ = other.cat_;
              bitField0_ = (bitField0_ & ~0x00000010);
            } else {
              ensureCatIsMutable();
              cat_.addAll(other.cat_);
            }
            onChanged();
          }
          if (!other.sectioncat_.isEmpty()) {
            if (sectioncat_.isEmpty()) {
              sectioncat_ = other.sectioncat_;
              bitField0_ = (bitField0_ & ~0x00000020);
            } else {
              ensureSectioncatIsMutable();
              sectioncat_.addAll(other.sectioncat_);
            }
            onChanged();
          }
          if (!other.pagecat_.isEmpty()) {
            if (pagecat_.isEmpty()) {
              pagecat_ = other.pagecat_;
              bitField0_ = (bitField0_ & ~0x00000040);
            } else {
              ensurePagecatIsMutable();
              pagecat_.addAll(other.pagecat_);
            }
            onChanged();
          }
          if (other.hasPage()) {
            bitField0_ |= 0x00000080;
            page_ = other.page_;
            onChanged();
          }
          if (other.hasPrivacypolicy()) {
            setPrivacypolicy(other.getPrivacypolicy());
          }
          if (other.hasRef()) {
            bitField0_ |= 0x00000200;
            ref_ = other.ref_;
            onChanged();
          }
          if (other.hasSearch()) {
            bitField0_ |= 0x00000400;
            search_ = other.search_;
            onChanged();
          }
          if (other.hasPublisher()) {
            mergePublisher(other.getPublisher());
          }
          if (other.hasContent()) {
            mergeContent(other.getContent());
          }
          if (other.hasKeywords()) {
            bitField0_ |= 0x00002000;
            keywords_ = other.keywords_;
            onChanged();
          }
          if (other.hasMobile()) {
            setMobile(other.getMobile());
          }
          this.mergeExtensionFields(other);
          this.mergeUnknownFields(other.unknownFields);
          onChanged();
          return this;
        }

        @java.lang.Override
        public final boolean isInitialized() {
          if (hasPublisher()) {
            if (!getPublisher().isInitialized()) {
              return false;
            }
          }
          if (hasContent()) {
            if (!getContent().isInitialized()) {
              return false;
            }
          }
          if (!extensionsAreInitialized()) {
            return false;
          }
          return true;
        }

        @java.lang.Override
        public Builder mergeFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws java.io.IOException {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site parsedMessage = null;
          try {
            parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site) e.getUnfinishedMessage();
            throw e.unwrapIOException();
          } finally {
            if (parsedMessage != null) {
              mergeFrom(parsedMessage);
            }
          }
          return this;
        }
        private int bitField0_;

        private java.lang.Object id_ = "";
        /**
         * <pre>
         * Site ID on the exchange.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @return Whether the id field is set.
         */
        public boolean hasId() {
          return ((bitField0_ & 0x00000001) != 0);
        }
        /**
         * <pre>
         * Site ID on the exchange.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @return The id.
         */
        public java.lang.String getId() {
          java.lang.Object ref = id_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              id_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Site ID on the exchange.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @return The bytes for id.
         */
        public com.google.protobuf.ByteString
            getIdBytes() {
          java.lang.Object ref = id_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            id_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Site ID on the exchange.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @param value The id to set.
         * @return This builder for chaining.
         */
        public Builder setId(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
          id_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Site ID on the exchange.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @return This builder for chaining.
         */
        public Builder clearId() {
          bitField0_ = (bitField0_ & ~0x00000001);
          id_ = getDefaultInstance().getId();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Site ID on the exchange.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @param value The bytes for id to set.
         * @return This builder for chaining.
         */
        public Builder setIdBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
          id_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object name_ = "";
        /**
         * <pre>
         * Site name (may be masked at publisher's request).
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @return Whether the name field is set.
         */
        public boolean hasName() {
          return ((bitField0_ & 0x00000002) != 0);
        }
        /**
         * <pre>
         * Site name (may be masked at publisher's request).
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @return The name.
         */
        public java.lang.String getName() {
          java.lang.Object ref = name_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              name_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Site name (may be masked at publisher's request).
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @return The bytes for name.
         */
        public com.google.protobuf.ByteString
            getNameBytes() {
          java.lang.Object ref = name_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            name_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Site name (may be masked at publisher's request).
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @param value The name to set.
         * @return This builder for chaining.
         */
        public Builder setName(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
          name_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Site name (may be masked at publisher's request).
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @return This builder for chaining.
         */
        public Builder clearName() {
          bitField0_ = (bitField0_ & ~0x00000002);
          name_ = getDefaultInstance().getName();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Site name (may be masked at publisher's request).
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @param value The bytes for name to set.
         * @return This builder for chaining.
         */
        public Builder setNameBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
          name_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object domain_ = "";
        /**
         * <pre>
         * Domain of the site, used for advertiser side blocking.
         * For example, "foo.com".
         * </pre>
         *
         * <code>optional string domain = 3;</code>
         * @return Whether the domain field is set.
         */
        public boolean hasDomain() {
          return ((bitField0_ & 0x00000004) != 0);
        }
        /**
         * <pre>
         * Domain of the site, used for advertiser side blocking.
         * For example, "foo.com".
         * </pre>
         *
         * <code>optional string domain = 3;</code>
         * @return The domain.
         */
        public java.lang.String getDomain() {
          java.lang.Object ref = domain_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              domain_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Domain of the site, used for advertiser side blocking.
         * For example, "foo.com".
         * </pre>
         *
         * <code>optional string domain = 3;</code>
         * @return The bytes for domain.
         */
        public com.google.protobuf.ByteString
            getDomainBytes() {
          java.lang.Object ref = domain_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            domain_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Domain of the site, used for advertiser side blocking.
         * For example, "foo.com".
         * </pre>
         *
         * <code>optional string domain = 3;</code>
         * @param value The domain to set.
         * @return This builder for chaining.
         */
        public Builder setDomain(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
          domain_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Domain of the site, used for advertiser side blocking.
         * For example, "foo.com".
         * </pre>
         *
         * <code>optional string domain = 3;</code>
         * @return This builder for chaining.
         */
        public Builder clearDomain() {
          bitField0_ = (bitField0_ & ~0x00000004);
          domain_ = getDefaultInstance().getDomain();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Domain of the site, used for advertiser side blocking.
         * For example, "foo.com".
         * </pre>
         *
         * <code>optional string domain = 3;</code>
         * @param value The bytes for domain to set.
         * @return This builder for chaining.
         */
        public Builder setDomainBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
          domain_ = value;
          onChanged();
          return this;
        }

        private int cattax_ = 1;
        /**
         * <pre>
         * The taxonomy in use.
         * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
         * </pre>
         *
         * <code>optional int32 cattax = 16 [default = 1];</code>
         * @return Whether the cattax field is set.
         */
        @java.lang.Override
        public boolean hasCattax() {
          return ((bitField0_ & 0x00000008) != 0);
        }
        /**
         * <pre>
         * The taxonomy in use.
         * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
         * </pre>
         *
         * <code>optional int32 cattax = 16 [default = 1];</code>
         * @return The cattax.
         */
        @java.lang.Override
        public int getCattax() {
          return cattax_;
        }
        /**
         * <pre>
         * The taxonomy in use.
         * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
         * </pre>
         *
         * <code>optional int32 cattax = 16 [default = 1];</code>
         * @param value The cattax to set.
         * @return This builder for chaining.
         */
        public Builder setCattax(int value) {
          bitField0_ |= 0x00000008;
          cattax_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * The taxonomy in use.
         * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
         * </pre>
         *
         * <code>optional int32 cattax = 16 [default = 1];</code>
         * @return This builder for chaining.
         */
        public Builder clearCattax() {
          bitField0_ = (bitField0_ & ~0x00000008);
          cattax_ = 1;
          onChanged();
          return this;
        }

        private com.google.protobuf.LazyStringList cat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        private void ensureCatIsMutable() {
          if (!((bitField0_ & 0x00000010) != 0)) {
            cat_ = new com.google.protobuf.LazyStringArrayList(cat_);
            bitField0_ |= 0x00000010;
           }
        }
        /**
         * <pre>
         * Array of IAB content categories of the site.
         * </pre>
         *
         * <code>repeated string cat = 4;</code>
         * @return A list containing the cat.
         */
        public com.google.protobuf.ProtocolStringList
            getCatList() {
          return cat_.getUnmodifiableView();
        }
        /**
         * <pre>
         * Array of IAB content categories of the site.
         * </pre>
         *
         * <code>repeated string cat = 4;</code>
         * @return The count of cat.
         */
        public int getCatCount() {
          return cat_.size();
        }
        /**
         * <pre>
         * Array of IAB content categories of the site.
         * </pre>
         *
         * <code>repeated string cat = 4;</code>
         * @param index The index of the element to return.
         * @return The cat at the given index.
         */
        public java.lang.String getCat(int index) {
          return cat_.get(index);
        }
        /**
         * <pre>
         * Array of IAB content categories of the site.
         * </pre>
         *
         * <code>repeated string cat = 4;</code>
         * @param index The index of the value to return.
         * @return The bytes of the cat at the given index.
         */
        public com.google.protobuf.ByteString
            getCatBytes(int index) {
          return cat_.getByteString(index);
        }
        /**
         * <pre>
         * Array of IAB content categories of the site.
         * </pre>
         *
         * <code>repeated string cat = 4;</code>
         * @param index The index to set the value at.
         * @param value The cat to set.
         * @return This builder for chaining.
         */
        public Builder setCat(
            int index, java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  ensureCatIsMutable();
          cat_.set(index, value);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Array of IAB content categories of the site.
         * </pre>
         *
         * <code>repeated string cat = 4;</code>
         * @param value The cat to add.
         * @return This builder for chaining.
         */
        public Builder addCat(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  ensureCatIsMutable();
          cat_.add(value);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Array of IAB content categories of the site.
         * </pre>
         *
         * <code>repeated string cat = 4;</code>
         * @param values The cat to add.
         * @return This builder for chaining.
         */
        public Builder addAllCat(
            java.lang.Iterable<java.lang.String> values) {
          ensureCatIsMutable();
          com.google.protobuf.AbstractMessageLite.Builder.addAll(
              values, cat_);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Array of IAB content categories of the site.
         * </pre>
         *
         * <code>repeated string cat = 4;</code>
         * @return This builder for chaining.
         */
        public Builder clearCat() {
          cat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
          bitField0_ = (bitField0_ & ~0x00000010);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Array of IAB content categories of the site.
         * </pre>
         *
         * <code>repeated string cat = 4;</code>
         * @param value The bytes of the cat to add.
         * @return This builder for chaining.
         */
        public Builder addCatBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  ensureCatIsMutable();
          cat_.add(value);
          onChanged();
          return this;
        }

        private com.google.protobuf.LazyStringList sectioncat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        private void ensureSectioncatIsMutable() {
          if (!((bitField0_ & 0x00000020) != 0)) {
            sectioncat_ = new com.google.protobuf.LazyStringArrayList(sectioncat_);
            bitField0_ |= 0x00000020;
           }
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the current section
         * of the site.
         * </pre>
         *
         * <code>repeated string sectioncat = 5;</code>
         * @return A list containing the sectioncat.
         */
        public com.google.protobuf.ProtocolStringList
            getSectioncatList() {
          return sectioncat_.getUnmodifiableView();
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the current section
         * of the site.
         * </pre>
         *
         * <code>repeated string sectioncat = 5;</code>
         * @return The count of sectioncat.
         */
        public int getSectioncatCount() {
          return sectioncat_.size();
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the current section
         * of the site.
         * </pre>
         *
         * <code>repeated string sectioncat = 5;</code>
         * @param index The index of the element to return.
         * @return The sectioncat at the given index.
         */
        public java.lang.String getSectioncat(int index) {
          return sectioncat_.get(index);
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the current section
         * of the site.
         * </pre>
         *
         * <code>repeated string sectioncat = 5;</code>
         * @param index The index of the value to return.
         * @return The bytes of the sectioncat at the given index.
         */
        public com.google.protobuf.ByteString
            getSectioncatBytes(int index) {
          return sectioncat_.getByteString(index);
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the current section
         * of the site.
         * </pre>
         *
         * <code>repeated string sectioncat = 5;</code>
         * @param index The index to set the value at.
         * @param value The sectioncat to set.
         * @return This builder for chaining.
         */
        public Builder setSectioncat(
            int index, java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  ensureSectioncatIsMutable();
          sectioncat_.set(index, value);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the current section
         * of the site.
         * </pre>
         *
         * <code>repeated string sectioncat = 5;</code>
         * @param value The sectioncat to add.
         * @return This builder for chaining.
         */
        public Builder addSectioncat(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  ensureSectioncatIsMutable();
          sectioncat_.add(value);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the current section
         * of the site.
         * </pre>
         *
         * <code>repeated string sectioncat = 5;</code>
         * @param values The sectioncat to add.
         * @return This builder for chaining.
         */
        public Builder addAllSectioncat(
            java.lang.Iterable<java.lang.String> values) {
          ensureSectioncatIsMutable();
          com.google.protobuf.AbstractMessageLite.Builder.addAll(
              values, sectioncat_);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the current section
         * of the site.
         * </pre>
         *
         * <code>repeated string sectioncat = 5;</code>
         * @return This builder for chaining.
         */
        public Builder clearSectioncat() {
          sectioncat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
          bitField0_ = (bitField0_ & ~0x00000020);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the current section
         * of the site.
         * </pre>
         *
         * <code>repeated string sectioncat = 5;</code>
         * @param value The bytes of the sectioncat to add.
         * @return This builder for chaining.
         */
        public Builder addSectioncatBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  ensureSectioncatIsMutable();
          sectioncat_.add(value);
          onChanged();
          return this;
        }

        private com.google.protobuf.LazyStringList pagecat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        private void ensurePagecatIsMutable() {
          if (!((bitField0_ & 0x00000040) != 0)) {
            pagecat_ = new com.google.protobuf.LazyStringArrayList(pagecat_);
            bitField0_ |= 0x00000040;
           }
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the current page or view
         * of the site.
         * </pre>
         *
         * <code>repeated string pagecat = 6;</code>
         * @return A list containing the pagecat.
         */
        public com.google.protobuf.ProtocolStringList
            getPagecatList() {
          return pagecat_.getUnmodifiableView();
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the current page or view
         * of the site.
         * </pre>
         *
         * <code>repeated string pagecat = 6;</code>
         * @return The count of pagecat.
         */
        public int getPagecatCount() {
          return pagecat_.size();
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the current page or view
         * of the site.
         * </pre>
         *
         * <code>repeated string pagecat = 6;</code>
         * @param index The index of the element to return.
         * @return The pagecat at the given index.
         */
        public java.lang.String getPagecat(int index) {
          return pagecat_.get(index);
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the current page or view
         * of the site.
         * </pre>
         *
         * <code>repeated string pagecat = 6;</code>
         * @param index The index of the value to return.
         * @return The bytes of the pagecat at the given index.
         */
        public com.google.protobuf.ByteString
            getPagecatBytes(int index) {
          return pagecat_.getByteString(index);
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the current page or view
         * of the site.
         * </pre>
         *
         * <code>repeated string pagecat = 6;</code>
         * @param index The index to set the value at.
         * @param value The pagecat to set.
         * @return This builder for chaining.
         */
        public Builder setPagecat(
            int index, java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  ensurePagecatIsMutable();
          pagecat_.set(index, value);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the current page or view
         * of the site.
         * </pre>
         *
         * <code>repeated string pagecat = 6;</code>
         * @param value The pagecat to add.
         * @return This builder for chaining.
         */
        public Builder addPagecat(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  ensurePagecatIsMutable();
          pagecat_.add(value);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the current page or view
         * of the site.
         * </pre>
         *
         * <code>repeated string pagecat = 6;</code>
         * @param values The pagecat to add.
         * @return This builder for chaining.
         */
        public Builder addAllPagecat(
            java.lang.Iterable<java.lang.String> values) {
          ensurePagecatIsMutable();
          com.google.protobuf.AbstractMessageLite.Builder.addAll(
              values, pagecat_);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the current page or view
         * of the site.
         * </pre>
         *
         * <code>repeated string pagecat = 6;</code>
         * @return This builder for chaining.
         */
        public Builder clearPagecat() {
          pagecat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
          bitField0_ = (bitField0_ & ~0x00000040);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the current page or view
         * of the site.
         * </pre>
         *
         * <code>repeated string pagecat = 6;</code>
         * @param value The bytes of the pagecat to add.
         * @return This builder for chaining.
         */
        public Builder addPagecatBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  ensurePagecatIsMutable();
          pagecat_.add(value);
          onChanged();
          return this;
        }

        private java.lang.Object page_ = "";
        /**
         * <pre>
         * URL of the page where the impression will be shown.
         * </pre>
         *
         * <code>optional string page = 7;</code>
         * @return Whether the page field is set.
         */
        public boolean hasPage() {
          return ((bitField0_ & 0x00000080) != 0);
        }
        /**
         * <pre>
         * URL of the page where the impression will be shown.
         * </pre>
         *
         * <code>optional string page = 7;</code>
         * @return The page.
         */
        public java.lang.String getPage() {
          java.lang.Object ref = page_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              page_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * URL of the page where the impression will be shown.
         * </pre>
         *
         * <code>optional string page = 7;</code>
         * @return The bytes for page.
         */
        public com.google.protobuf.ByteString
            getPageBytes() {
          java.lang.Object ref = page_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            page_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * URL of the page where the impression will be shown.
         * </pre>
         *
         * <code>optional string page = 7;</code>
         * @param value The page to set.
         * @return This builder for chaining.
         */
        public Builder setPage(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000080;
          page_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * URL of the page where the impression will be shown.
         * </pre>
         *
         * <code>optional string page = 7;</code>
         * @return This builder for chaining.
         */
        public Builder clearPage() {
          bitField0_ = (bitField0_ & ~0x00000080);
          page_ = getDefaultInstance().getPage();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * URL of the page where the impression will be shown.
         * </pre>
         *
         * <code>optional string page = 7;</code>
         * @param value The bytes for page to set.
         * @return This builder for chaining.
         */
        public Builder setPageBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000080;
          page_ = value;
          onChanged();
          return this;
        }

        private boolean privacypolicy_ ;
        /**
         * <pre>
         * Indicates if the site has a privacy policy, where 0 = no, 1 = yes.
         * </pre>
         *
         * <code>optional bool privacypolicy = 8;</code>
         * @return Whether the privacypolicy field is set.
         */
        @java.lang.Override
        public boolean hasPrivacypolicy() {
          return ((bitField0_ & 0x00000100) != 0);
        }
        /**
         * <pre>
         * Indicates if the site has a privacy policy, where 0 = no, 1 = yes.
         * </pre>
         *
         * <code>optional bool privacypolicy = 8;</code>
         * @return The privacypolicy.
         */
        @java.lang.Override
        public boolean getPrivacypolicy() {
          return privacypolicy_;
        }
        /**
         * <pre>
         * Indicates if the site has a privacy policy, where 0 = no, 1 = yes.
         * </pre>
         *
         * <code>optional bool privacypolicy = 8;</code>
         * @param value The privacypolicy to set.
         * @return This builder for chaining.
         */
        public Builder setPrivacypolicy(boolean value) {
          bitField0_ |= 0x00000100;
          privacypolicy_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Indicates if the site has a privacy policy, where 0 = no, 1 = yes.
         * </pre>
         *
         * <code>optional bool privacypolicy = 8;</code>
         * @return This builder for chaining.
         */
        public Builder clearPrivacypolicy() {
          bitField0_ = (bitField0_ & ~0x00000100);
          privacypolicy_ = false;
          onChanged();
          return this;
        }

        private java.lang.Object ref_ = "";
        /**
         * <pre>
         * Referrer URL that caused navigation to the current page.
         * </pre>
         *
         * <code>optional string ref = 9;</code>
         * @return Whether the ref field is set.
         */
        public boolean hasRef() {
          return ((bitField0_ & 0x00000200) != 0);
        }
        /**
         * <pre>
         * Referrer URL that caused navigation to the current page.
         * </pre>
         *
         * <code>optional string ref = 9;</code>
         * @return The ref.
         */
        public java.lang.String getRef() {
          java.lang.Object ref = ref_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              ref_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Referrer URL that caused navigation to the current page.
         * </pre>
         *
         * <code>optional string ref = 9;</code>
         * @return The bytes for ref.
         */
        public com.google.protobuf.ByteString
            getRefBytes() {
          java.lang.Object ref = ref_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            ref_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Referrer URL that caused navigation to the current page.
         * </pre>
         *
         * <code>optional string ref = 9;</code>
         * @param value The ref to set.
         * @return This builder for chaining.
         */
        public Builder setRef(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000200;
          ref_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Referrer URL that caused navigation to the current page.
         * </pre>
         *
         * <code>optional string ref = 9;</code>
         * @return This builder for chaining.
         */
        public Builder clearRef() {
          bitField0_ = (bitField0_ & ~0x00000200);
          ref_ = getDefaultInstance().getRef();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Referrer URL that caused navigation to the current page.
         * </pre>
         *
         * <code>optional string ref = 9;</code>
         * @param value The bytes for ref to set.
         * @return This builder for chaining.
         */
        public Builder setRefBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000200;
          ref_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object search_ = "";
        /**
         * <pre>
         * Search string that caused navigation to the current page.
         * </pre>
         *
         * <code>optional string search = 10;</code>
         * @return Whether the search field is set.
         */
        public boolean hasSearch() {
          return ((bitField0_ & 0x00000400) != 0);
        }
        /**
         * <pre>
         * Search string that caused navigation to the current page.
         * </pre>
         *
         * <code>optional string search = 10;</code>
         * @return The search.
         */
        public java.lang.String getSearch() {
          java.lang.Object ref = search_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              search_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Search string that caused navigation to the current page.
         * </pre>
         *
         * <code>optional string search = 10;</code>
         * @return The bytes for search.
         */
        public com.google.protobuf.ByteString
            getSearchBytes() {
          java.lang.Object ref = search_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            search_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Search string that caused navigation to the current page.
         * </pre>
         *
         * <code>optional string search = 10;</code>
         * @param value The search to set.
         * @return This builder for chaining.
         */
        public Builder setSearch(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000400;
          search_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Search string that caused navigation to the current page.
         * </pre>
         *
         * <code>optional string search = 10;</code>
         * @return This builder for chaining.
         */
        public Builder clearSearch() {
          bitField0_ = (bitField0_ & ~0x00000400);
          search_ = getDefaultInstance().getSearch();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Search string that caused navigation to the current page.
         * </pre>
         *
         * <code>optional string search = 10;</code>
         * @param value The bytes for search to set.
         * @return This builder for chaining.
         */
        public Builder setSearchBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000400;
          search_ = value;
          onChanged();
          return this;
        }

        private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher publisher_;
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.PublisherOrBuilder> publisherBuilder_;
        /**
         * <pre>
         * Details about the Publisher (Section 3.2.8) of the site.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Publisher publisher = 11;</code>
         * @return Whether the publisher field is set.
         */
        public boolean hasPublisher() {
          return ((bitField0_ & 0x00000800) != 0);
        }
        /**
         * <pre>
         * Details about the Publisher (Section 3.2.8) of the site.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Publisher publisher = 11;</code>
         * @return The publisher.
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher getPublisher() {
          if (publisherBuilder_ == null) {
            return publisher_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher.getDefaultInstance() : publisher_;
          } else {
            return publisherBuilder_.getMessage();
          }
        }
        /**
         * <pre>
         * Details about the Publisher (Section 3.2.8) of the site.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Publisher publisher = 11;</code>
         */
        public Builder setPublisher(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher value) {
          if (publisherBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            publisher_ = value;
            onChanged();
          } else {
            publisherBuilder_.setMessage(value);
          }
          bitField0_ |= 0x00000800;
          return this;
        }
        /**
         * <pre>
         * Details about the Publisher (Section 3.2.8) of the site.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Publisher publisher = 11;</code>
         */
        public Builder setPublisher(
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher.Builder builderForValue) {
          if (publisherBuilder_ == null) {
            publisher_ = builderForValue.build();
            onChanged();
          } else {
            publisherBuilder_.setMessage(builderForValue.build());
          }
          bitField0_ |= 0x00000800;
          return this;
        }
        /**
         * <pre>
         * Details about the Publisher (Section 3.2.8) of the site.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Publisher publisher = 11;</code>
         */
        public Builder mergePublisher(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher value) {
          if (publisherBuilder_ == null) {
            if (((bitField0_ & 0x00000800) != 0) &&
                publisher_ != null &&
                publisher_ != com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher.getDefaultInstance()) {
              publisher_ =
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher.newBuilder(publisher_).mergeFrom(value).buildPartial();
            } else {
              publisher_ = value;
            }
            onChanged();
          } else {
            publisherBuilder_.mergeFrom(value);
          }
          bitField0_ |= 0x00000800;
          return this;
        }
        /**
         * <pre>
         * Details about the Publisher (Section 3.2.8) of the site.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Publisher publisher = 11;</code>
         */
        public Builder clearPublisher() {
          if (publisherBuilder_ == null) {
            publisher_ = null;
            onChanged();
          } else {
            publisherBuilder_.clear();
          }
          bitField0_ = (bitField0_ & ~0x00000800);
          return this;
        }
        /**
         * <pre>
         * Details about the Publisher (Section 3.2.8) of the site.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Publisher publisher = 11;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher.Builder getPublisherBuilder() {
          bitField0_ |= 0x00000800;
          onChanged();
          return getPublisherFieldBuilder().getBuilder();
        }
        /**
         * <pre>
         * Details about the Publisher (Section 3.2.8) of the site.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Publisher publisher = 11;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.PublisherOrBuilder getPublisherOrBuilder() {
          if (publisherBuilder_ != null) {
            return publisherBuilder_.getMessageOrBuilder();
          } else {
            return publisher_ == null ?
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher.getDefaultInstance() : publisher_;
          }
        }
        /**
         * <pre>
         * Details about the Publisher (Section 3.2.8) of the site.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Publisher publisher = 11;</code>
         */
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.PublisherOrBuilder> 
            getPublisherFieldBuilder() {
          if (publisherBuilder_ == null) {
            publisherBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.PublisherOrBuilder>(
                    getPublisher(),
                    getParentForChildren(),
                    isClean());
            publisher_ = null;
          }
          return publisherBuilder_;
        }

        private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content content_;
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.ContentOrBuilder> contentBuilder_;
        /**
         * <pre>
         * Details about the Content (Section 3.2.9) within the site.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Content content = 12;</code>
         * @return Whether the content field is set.
         */
        public boolean hasContent() {
          return ((bitField0_ & 0x00001000) != 0);
        }
        /**
         * <pre>
         * Details about the Content (Section 3.2.9) within the site.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Content content = 12;</code>
         * @return The content.
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content getContent() {
          if (contentBuilder_ == null) {
            return content_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content.getDefaultInstance() : content_;
          } else {
            return contentBuilder_.getMessage();
          }
        }
        /**
         * <pre>
         * Details about the Content (Section 3.2.9) within the site.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Content content = 12;</code>
         */
        public Builder setContent(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content value) {
          if (contentBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            content_ = value;
            onChanged();
          } else {
            contentBuilder_.setMessage(value);
          }
          bitField0_ |= 0x00001000;
          return this;
        }
        /**
         * <pre>
         * Details about the Content (Section 3.2.9) within the site.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Content content = 12;</code>
         */
        public Builder setContent(
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content.Builder builderForValue) {
          if (contentBuilder_ == null) {
            content_ = builderForValue.build();
            onChanged();
          } else {
            contentBuilder_.setMessage(builderForValue.build());
          }
          bitField0_ |= 0x00001000;
          return this;
        }
        /**
         * <pre>
         * Details about the Content (Section 3.2.9) within the site.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Content content = 12;</code>
         */
        public Builder mergeContent(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content value) {
          if (contentBuilder_ == null) {
            if (((bitField0_ & 0x00001000) != 0) &&
                content_ != null &&
                content_ != com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content.getDefaultInstance()) {
              content_ =
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content.newBuilder(content_).mergeFrom(value).buildPartial();
            } else {
              content_ = value;
            }
            onChanged();
          } else {
            contentBuilder_.mergeFrom(value);
          }
          bitField0_ |= 0x00001000;
          return this;
        }
        /**
         * <pre>
         * Details about the Content (Section 3.2.9) within the site.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Content content = 12;</code>
         */
        public Builder clearContent() {
          if (contentBuilder_ == null) {
            content_ = null;
            onChanged();
          } else {
            contentBuilder_.clear();
          }
          bitField0_ = (bitField0_ & ~0x00001000);
          return this;
        }
        /**
         * <pre>
         * Details about the Content (Section 3.2.9) within the site.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Content content = 12;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content.Builder getContentBuilder() {
          bitField0_ |= 0x00001000;
          onChanged();
          return getContentFieldBuilder().getBuilder();
        }
        /**
         * <pre>
         * Details about the Content (Section 3.2.9) within the site.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Content content = 12;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.ContentOrBuilder getContentOrBuilder() {
          if (contentBuilder_ != null) {
            return contentBuilder_.getMessageOrBuilder();
          } else {
            return content_ == null ?
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content.getDefaultInstance() : content_;
          }
        }
        /**
         * <pre>
         * Details about the Content (Section 3.2.9) within the site.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Content content = 12;</code>
         */
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.ContentOrBuilder> 
            getContentFieldBuilder() {
          if (contentBuilder_ == null) {
            contentBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.ContentOrBuilder>(
                    getContent(),
                    getParentForChildren(),
                    isClean());
            content_ = null;
          }
          return contentBuilder_;
        }

        private java.lang.Object keywords_ = "";
        /**
         * <pre>
         * Comma separated list of keywords about this site.
         * Note: OpenRTB 2.2 allowed an array-of-strings as alternate implementation
         * but this was fixed in 2.3+ where it's definitely a single string with CSV
         * content again. Compatibility with some OpenRTB 2.2 exchanges that adopted
         * the alternate representation may require custom handling of the JSON.
         * </pre>
         *
         * <code>optional string keywords = 13;</code>
         * @return Whether the keywords field is set.
         */
        public boolean hasKeywords() {
          return ((bitField0_ & 0x00002000) != 0);
        }
        /**
         * <pre>
         * Comma separated list of keywords about this site.
         * Note: OpenRTB 2.2 allowed an array-of-strings as alternate implementation
         * but this was fixed in 2.3+ where it's definitely a single string with CSV
         * content again. Compatibility with some OpenRTB 2.2 exchanges that adopted
         * the alternate representation may require custom handling of the JSON.
         * </pre>
         *
         * <code>optional string keywords = 13;</code>
         * @return The keywords.
         */
        public java.lang.String getKeywords() {
          java.lang.Object ref = keywords_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              keywords_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Comma separated list of keywords about this site.
         * Note: OpenRTB 2.2 allowed an array-of-strings as alternate implementation
         * but this was fixed in 2.3+ where it's definitely a single string with CSV
         * content again. Compatibility with some OpenRTB 2.2 exchanges that adopted
         * the alternate representation may require custom handling of the JSON.
         * </pre>
         *
         * <code>optional string keywords = 13;</code>
         * @return The bytes for keywords.
         */
        public com.google.protobuf.ByteString
            getKeywordsBytes() {
          java.lang.Object ref = keywords_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            keywords_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Comma separated list of keywords about this site.
         * Note: OpenRTB 2.2 allowed an array-of-strings as alternate implementation
         * but this was fixed in 2.3+ where it's definitely a single string with CSV
         * content again. Compatibility with some OpenRTB 2.2 exchanges that adopted
         * the alternate representation may require custom handling of the JSON.
         * </pre>
         *
         * <code>optional string keywords = 13;</code>
         * @param value The keywords to set.
         * @return This builder for chaining.
         */
        public Builder setKeywords(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00002000;
          keywords_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Comma separated list of keywords about this site.
         * Note: OpenRTB 2.2 allowed an array-of-strings as alternate implementation
         * but this was fixed in 2.3+ where it's definitely a single string with CSV
         * content again. Compatibility with some OpenRTB 2.2 exchanges that adopted
         * the alternate representation may require custom handling of the JSON.
         * </pre>
         *
         * <code>optional string keywords = 13;</code>
         * @return This builder for chaining.
         */
        public Builder clearKeywords() {
          bitField0_ = (bitField0_ & ~0x00002000);
          keywords_ = getDefaultInstance().getKeywords();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Comma separated list of keywords about this site.
         * Note: OpenRTB 2.2 allowed an array-of-strings as alternate implementation
         * but this was fixed in 2.3+ where it's definitely a single string with CSV
         * content again. Compatibility with some OpenRTB 2.2 exchanges that adopted
         * the alternate representation may require custom handling of the JSON.
         * </pre>
         *
         * <code>optional string keywords = 13;</code>
         * @param value The bytes for keywords to set.
         * @return This builder for chaining.
         */
        public Builder setKeywordsBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00002000;
          keywords_ = value;
          onChanged();
          return this;
        }

        private boolean mobile_ ;
        /**
         * <pre>
         * Indicates if the site has been programmed to optimize layout
         * when viewed on mobile devices, where 0 = no, 1 = yes.
         * </pre>
         *
         * <code>optional bool mobile = 15;</code>
         * @return Whether the mobile field is set.
         */
        @java.lang.Override
        public boolean hasMobile() {
          return ((bitField0_ & 0x00004000) != 0);
        }
        /**
         * <pre>
         * Indicates if the site has been programmed to optimize layout
         * when viewed on mobile devices, where 0 = no, 1 = yes.
         * </pre>
         *
         * <code>optional bool mobile = 15;</code>
         * @return The mobile.
         */
        @java.lang.Override
        public boolean getMobile() {
          return mobile_;
        }
        /**
         * <pre>
         * Indicates if the site has been programmed to optimize layout
         * when viewed on mobile devices, where 0 = no, 1 = yes.
         * </pre>
         *
         * <code>optional bool mobile = 15;</code>
         * @param value The mobile to set.
         * @return This builder for chaining.
         */
        public Builder setMobile(boolean value) {
          bitField0_ |= 0x00004000;
          mobile_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Indicates if the site has been programmed to optimize layout
         * when viewed on mobile devices, where 0 = no, 1 = yes.
         * </pre>
         *
         * <code>optional bool mobile = 15;</code>
         * @return This builder for chaining.
         */
        public Builder clearMobile() {
          bitField0_ = (bitField0_ & ~0x00004000);
          mobile_ = 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:com.iabtechlab.openrtb.v2.BidRequest.Site)
      }

      // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.BidRequest.Site)
      private static final com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site DEFAULT_INSTANCE;
      static {
        DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site();
      }

      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site getDefaultInstance() {
        return DEFAULT_INSTANCE;
      }

      @java.lang.Deprecated public static final com.google.protobuf.Parser<Site>
          PARSER = new com.google.protobuf.AbstractParser<Site>() {
        @java.lang.Override
        public Site parsePartialFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return new Site(input, extensionRegistry);
        }
      };

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

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

      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site getDefaultInstanceForType() {
        return DEFAULT_INSTANCE;
      }

    }

    public interface AppOrBuilder extends
        // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.BidRequest.App)
        com.google.protobuf.GeneratedMessageV3.
            ExtendableMessageOrBuilder<App> {

      /**
       * <pre>
       * Application ID on the exchange.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return Whether the id field is set.
       */
      boolean hasId();
      /**
       * <pre>
       * Application ID on the exchange.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return The id.
       */
      java.lang.String getId();
      /**
       * <pre>
       * Application ID on the exchange.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return The bytes for id.
       */
      com.google.protobuf.ByteString
          getIdBytes();

      /**
       * <pre>
       * Application name (may be aliased at publisher's request). App names for
       * SDK-less requests (mostly from connected TVs) can be provided by the
       * publisher directly in the request.
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return Whether the name field is set.
       */
      boolean hasName();
      /**
       * <pre>
       * Application name (may be aliased at publisher's request). App names for
       * SDK-less requests (mostly from connected TVs) can be provided by the
       * publisher directly in the request.
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return The name.
       */
      java.lang.String getName();
      /**
       * <pre>
       * Application name (may be aliased at publisher's request). App names for
       * SDK-less requests (mostly from connected TVs) can be provided by the
       * publisher directly in the request.
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return The bytes for name.
       */
      com.google.protobuf.ByteString
          getNameBytes();

      /**
       * <pre>
       * Domain of the application. For example, "mygame.foo.com".
       * </pre>
       *
       * <code>optional string domain = 3;</code>
       * @return Whether the domain field is set.
       */
      boolean hasDomain();
      /**
       * <pre>
       * Domain of the application. For example, "mygame.foo.com".
       * </pre>
       *
       * <code>optional string domain = 3;</code>
       * @return The domain.
       */
      java.lang.String getDomain();
      /**
       * <pre>
       * Domain of the application. For example, "mygame.foo.com".
       * </pre>
       *
       * <code>optional string domain = 3;</code>
       * @return The bytes for domain.
       */
      com.google.protobuf.ByteString
          getDomainBytes();

      /**
       * <pre>
       * The taxonomy in use.
       * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
       * </pre>
       *
       * <code>optional int32 cattax = 17 [default = 1];</code>
       * @return Whether the cattax field is set.
       */
      boolean hasCattax();
      /**
       * <pre>
       * The taxonomy in use.
       * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
       * </pre>
       *
       * <code>optional int32 cattax = 17 [default = 1];</code>
       * @return The cattax.
       */
      int getCattax();

      /**
       * <pre>
       * Array of IAB content categories of the app.
       * </pre>
       *
       * <code>repeated string cat = 4;</code>
       * @return A list containing the cat.
       */
      java.util.List<java.lang.String>
          getCatList();
      /**
       * <pre>
       * Array of IAB content categories of the app.
       * </pre>
       *
       * <code>repeated string cat = 4;</code>
       * @return The count of cat.
       */
      int getCatCount();
      /**
       * <pre>
       * Array of IAB content categories of the app.
       * </pre>
       *
       * <code>repeated string cat = 4;</code>
       * @param index The index of the element to return.
       * @return The cat at the given index.
       */
      java.lang.String getCat(int index);
      /**
       * <pre>
       * Array of IAB content categories of the app.
       * </pre>
       *
       * <code>repeated string cat = 4;</code>
       * @param index The index of the value to return.
       * @return The bytes of the cat at the given index.
       */
      com.google.protobuf.ByteString
          getCatBytes(int index);

      /**
       * <pre>
       * Array of IAB content categories that describe the current section
       * of the app.
       * </pre>
       *
       * <code>repeated string sectioncat = 5;</code>
       * @return A list containing the sectioncat.
       */
      java.util.List<java.lang.String>
          getSectioncatList();
      /**
       * <pre>
       * Array of IAB content categories that describe the current section
       * of the app.
       * </pre>
       *
       * <code>repeated string sectioncat = 5;</code>
       * @return The count of sectioncat.
       */
      int getSectioncatCount();
      /**
       * <pre>
       * Array of IAB content categories that describe the current section
       * of the app.
       * </pre>
       *
       * <code>repeated string sectioncat = 5;</code>
       * @param index The index of the element to return.
       * @return The sectioncat at the given index.
       */
      java.lang.String getSectioncat(int index);
      /**
       * <pre>
       * Array of IAB content categories that describe the current section
       * of the app.
       * </pre>
       *
       * <code>repeated string sectioncat = 5;</code>
       * @param index The index of the value to return.
       * @return The bytes of the sectioncat at the given index.
       */
      com.google.protobuf.ByteString
          getSectioncatBytes(int index);

      /**
       * <pre>
       * Array of IAB content categories that describe the current page or view
       * of the app.
       * </pre>
       *
       * <code>repeated string pagecat = 6;</code>
       * @return A list containing the pagecat.
       */
      java.util.List<java.lang.String>
          getPagecatList();
      /**
       * <pre>
       * Array of IAB content categories that describe the current page or view
       * of the app.
       * </pre>
       *
       * <code>repeated string pagecat = 6;</code>
       * @return The count of pagecat.
       */
      int getPagecatCount();
      /**
       * <pre>
       * Array of IAB content categories that describe the current page or view
       * of the app.
       * </pre>
       *
       * <code>repeated string pagecat = 6;</code>
       * @param index The index of the element to return.
       * @return The pagecat at the given index.
       */
      java.lang.String getPagecat(int index);
      /**
       * <pre>
       * Array of IAB content categories that describe the current page or view
       * of the app.
       * </pre>
       *
       * <code>repeated string pagecat = 6;</code>
       * @param index The index of the value to return.
       * @return The bytes of the pagecat at the given index.
       */
      com.google.protobuf.ByteString
          getPagecatBytes(int index);

      /**
       * <pre>
       * Application version.
       * </pre>
       *
       * <code>optional string ver = 7;</code>
       * @return Whether the ver field is set.
       */
      boolean hasVer();
      /**
       * <pre>
       * Application version.
       * </pre>
       *
       * <code>optional string ver = 7;</code>
       * @return The ver.
       */
      java.lang.String getVer();
      /**
       * <pre>
       * Application version.
       * </pre>
       *
       * <code>optional string ver = 7;</code>
       * @return The bytes for ver.
       */
      com.google.protobuf.ByteString
          getVerBytes();

      /**
       * <pre>
       * A platform-specific application identifier intended to be
       * unique to the app and independent of the exchange. On Android,
       * this should be a bundle or package name (e.g., com.foo.mygame).
       * On iOS, it is a numeric ID. For SDK-less requests (mostly from connected
       * TVs), it can be provided by the publisher directly in the request.
       * </pre>
       *
       * <code>optional string bundle = 8;</code>
       * @return Whether the bundle field is set.
       */
      boolean hasBundle();
      /**
       * <pre>
       * A platform-specific application identifier intended to be
       * unique to the app and independent of the exchange. On Android,
       * this should be a bundle or package name (e.g., com.foo.mygame).
       * On iOS, it is a numeric ID. For SDK-less requests (mostly from connected
       * TVs), it can be provided by the publisher directly in the request.
       * </pre>
       *
       * <code>optional string bundle = 8;</code>
       * @return The bundle.
       */
      java.lang.String getBundle();
      /**
       * <pre>
       * A platform-specific application identifier intended to be
       * unique to the app and independent of the exchange. On Android,
       * this should be a bundle or package name (e.g., com.foo.mygame).
       * On iOS, it is a numeric ID. For SDK-less requests (mostly from connected
       * TVs), it can be provided by the publisher directly in the request.
       * </pre>
       *
       * <code>optional string bundle = 8;</code>
       * @return The bytes for bundle.
       */
      com.google.protobuf.ByteString
          getBundleBytes();

      /**
       * <pre>
       * Indicates if the app has a privacy policy, where 0 = no, 1 = yes.
       * </pre>
       *
       * <code>optional bool privacypolicy = 9;</code>
       * @return Whether the privacypolicy field is set.
       */
      boolean hasPrivacypolicy();
      /**
       * <pre>
       * Indicates if the app has a privacy policy, where 0 = no, 1 = yes.
       * </pre>
       *
       * <code>optional bool privacypolicy = 9;</code>
       * @return The privacypolicy.
       */
      boolean getPrivacypolicy();

      /**
       * <pre>
       * 0 = app is free, 1 = the app is a paid version.
       * </pre>
       *
       * <code>optional bool paid = 10;</code>
       * @return Whether the paid field is set.
       */
      boolean hasPaid();
      /**
       * <pre>
       * 0 = app is free, 1 = the app is a paid version.
       * </pre>
       *
       * <code>optional bool paid = 10;</code>
       * @return The paid.
       */
      boolean getPaid();

      /**
       * <pre>
       * Details about the Publisher (Section 3.2.8) of the app.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Publisher publisher = 11;</code>
       * @return Whether the publisher field is set.
       */
      boolean hasPublisher();
      /**
       * <pre>
       * Details about the Publisher (Section 3.2.8) of the app.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Publisher publisher = 11;</code>
       * @return The publisher.
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher getPublisher();
      /**
       * <pre>
       * Details about the Publisher (Section 3.2.8) of the app.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Publisher publisher = 11;</code>
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.PublisherOrBuilder getPublisherOrBuilder();

      /**
       * <pre>
       * Details about the Content (Section 3.2.9) within the app.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Content content = 12;</code>
       * @return Whether the content field is set.
       */
      boolean hasContent();
      /**
       * <pre>
       * Details about the Content (Section 3.2.9) within the app.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Content content = 12;</code>
       * @return The content.
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content getContent();
      /**
       * <pre>
       * Details about the Content (Section 3.2.9) within the app.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Content content = 12;</code>
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.ContentOrBuilder getContentOrBuilder();

      /**
       * <pre>
       * Comma separated list of keywords about the app.
       * </pre>
       *
       * <code>optional string keywords = 13;</code>
       * @return Whether the keywords field is set.
       */
      boolean hasKeywords();
      /**
       * <pre>
       * Comma separated list of keywords about the app.
       * </pre>
       *
       * <code>optional string keywords = 13;</code>
       * @return The keywords.
       */
      java.lang.String getKeywords();
      /**
       * <pre>
       * Comma separated list of keywords about the app.
       * </pre>
       *
       * <code>optional string keywords = 13;</code>
       * @return The bytes for keywords.
       */
      com.google.protobuf.ByteString
          getKeywordsBytes();

      /**
       * <pre>
       * App store URL for an installed app; for QAG 1.5 compliance.
       * </pre>
       *
       * <code>optional string storeurl = 16;</code>
       * @return Whether the storeurl field is set.
       */
      boolean hasStoreurl();
      /**
       * <pre>
       * App store URL for an installed app; for QAG 1.5 compliance.
       * </pre>
       *
       * <code>optional string storeurl = 16;</code>
       * @return The storeurl.
       */
      java.lang.String getStoreurl();
      /**
       * <pre>
       * App store URL for an installed app; for QAG 1.5 compliance.
       * </pre>
       *
       * <code>optional string storeurl = 16;</code>
       * @return The bytes for storeurl.
       */
      com.google.protobuf.ByteString
          getStoreurlBytes();
    }
    /**
     * <pre>
     * OpenRTB 2.0: This object should be included if the ad supported content
     * is a non-browser application (typically in mobile) as opposed to a website.
     * A bid request must not contain both an App and a Site object.
     * At a minimum, it is useful to provide an App ID or bundle,
     * but this is not strictly required.
     * </pre>
     *
     * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.App}
     */
    public static final class App extends
        com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
          App> implements
        // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.BidRequest.App)
        AppOrBuilder {
    private static final long serialVersionUID = 0L;
      // Use App.newBuilder() to construct.
      private App(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App, ?> builder) {
        super(builder);
      }
      private App() {
        id_ = "";
        name_ = "";
        domain_ = "";
        cattax_ = 1;
        cat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        sectioncat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        pagecat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        ver_ = "";
        bundle_ = "";
        keywords_ = "";
        storeurl_ = "";
      }

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

      @java.lang.Override
      public final com.google.protobuf.UnknownFieldSet
      getUnknownFields() {
        return this.unknownFields;
      }
      private App(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        this();
        if (extensionRegistry == null) {
          throw new java.lang.NullPointerException();
        }
        int mutable_bitField0_ = 0;
        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
            com.google.protobuf.UnknownFieldSet.newBuilder();
        try {
          boolean done = false;
          while (!done) {
            int tag = input.readTag();
            switch (tag) {
              case 0:
                done = true;
                break;
              case 10: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000001;
                id_ = bs;
                break;
              }
              case 18: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000002;
                name_ = bs;
                break;
              }
              case 26: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000004;
                domain_ = bs;
                break;
              }
              case 34: {
                com.google.protobuf.ByteString bs = input.readBytes();
                if (!((mutable_bitField0_ & 0x00000010) != 0)) {
                  cat_ = new com.google.protobuf.LazyStringArrayList();
                  mutable_bitField0_ |= 0x00000010;
                }
                cat_.add(bs);
                break;
              }
              case 42: {
                com.google.protobuf.ByteString bs = input.readBytes();
                if (!((mutable_bitField0_ & 0x00000020) != 0)) {
                  sectioncat_ = new com.google.protobuf.LazyStringArrayList();
                  mutable_bitField0_ |= 0x00000020;
                }
                sectioncat_.add(bs);
                break;
              }
              case 50: {
                com.google.protobuf.ByteString bs = input.readBytes();
                if (!((mutable_bitField0_ & 0x00000040) != 0)) {
                  pagecat_ = new com.google.protobuf.LazyStringArrayList();
                  mutable_bitField0_ |= 0x00000040;
                }
                pagecat_.add(bs);
                break;
              }
              case 58: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000010;
                ver_ = bs;
                break;
              }
              case 66: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000020;
                bundle_ = bs;
                break;
              }
              case 72: {
                bitField0_ |= 0x00000040;
                privacypolicy_ = input.readBool();
                break;
              }
              case 80: {
                bitField0_ |= 0x00000080;
                paid_ = input.readBool();
                break;
              }
              case 90: {
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher.Builder subBuilder = null;
                if (((bitField0_ & 0x00000100) != 0)) {
                  subBuilder = publisher_.toBuilder();
                }
                publisher_ = input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher.PARSER, extensionRegistry);
                if (subBuilder != null) {
                  subBuilder.mergeFrom(publisher_);
                  publisher_ = subBuilder.buildPartial();
                }
                bitField0_ |= 0x00000100;
                break;
              }
              case 98: {
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content.Builder subBuilder = null;
                if (((bitField0_ & 0x00000200) != 0)) {
                  subBuilder = content_.toBuilder();
                }
                content_ = input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content.PARSER, extensionRegistry);
                if (subBuilder != null) {
                  subBuilder.mergeFrom(content_);
                  content_ = subBuilder.buildPartial();
                }
                bitField0_ |= 0x00000200;
                break;
              }
              case 106: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000400;
                keywords_ = bs;
                break;
              }
              case 130: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000800;
                storeurl_ = bs;
                break;
              }
              case 136: {
                bitField0_ |= 0x00000008;
                cattax_ = input.readInt32();
                break;
              }
              default: {
                if (!parseUnknownField(
                    input, unknownFields, extensionRegistry, tag)) {
                  done = true;
                }
                break;
              }
            }
          }
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          throw e.setUnfinishedMessage(this);
        } catch (java.io.IOException e) {
          throw new com.google.protobuf.InvalidProtocolBufferException(
              e).setUnfinishedMessage(this);
        } finally {
          if (((mutable_bitField0_ & 0x00000010) != 0)) {
            cat_ = cat_.getUnmodifiableView();
          }
          if (((mutable_bitField0_ & 0x00000020) != 0)) {
            sectioncat_ = sectioncat_.getUnmodifiableView();
          }
          if (((mutable_bitField0_ & 0x00000040) != 0)) {
            pagecat_ = pagecat_.getUnmodifiableView();
          }
          this.unknownFields = unknownFields.build();
          makeExtensionsImmutable();
        }
      }
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_App_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_App_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App.Builder.class);
      }

      private int bitField0_;
      public static final int ID_FIELD_NUMBER = 1;
      private volatile java.lang.Object id_;
      /**
       * <pre>
       * Application ID on the exchange.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return Whether the id field is set.
       */
      @java.lang.Override
      public boolean hasId() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <pre>
       * Application ID on the exchange.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return The id.
       */
      @java.lang.Override
      public java.lang.String getId() {
        java.lang.Object ref = id_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            id_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Application ID on the exchange.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return The bytes for id.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getIdBytes() {
        java.lang.Object ref = id_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          id_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int NAME_FIELD_NUMBER = 2;
      private volatile java.lang.Object name_;
      /**
       * <pre>
       * Application name (may be aliased at publisher's request). App names for
       * SDK-less requests (mostly from connected TVs) can be provided by the
       * publisher directly in the request.
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return Whether the name field is set.
       */
      @java.lang.Override
      public boolean hasName() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <pre>
       * Application name (may be aliased at publisher's request). App names for
       * SDK-less requests (mostly from connected TVs) can be provided by the
       * publisher directly in the request.
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return The name.
       */
      @java.lang.Override
      public java.lang.String getName() {
        java.lang.Object ref = name_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            name_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Application name (may be aliased at publisher's request). App names for
       * SDK-less requests (mostly from connected TVs) can be provided by the
       * publisher directly in the request.
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return The bytes for name.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getNameBytes() {
        java.lang.Object ref = name_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          name_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int DOMAIN_FIELD_NUMBER = 3;
      private volatile java.lang.Object domain_;
      /**
       * <pre>
       * Domain of the application. For example, "mygame.foo.com".
       * </pre>
       *
       * <code>optional string domain = 3;</code>
       * @return Whether the domain field is set.
       */
      @java.lang.Override
      public boolean hasDomain() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <pre>
       * Domain of the application. For example, "mygame.foo.com".
       * </pre>
       *
       * <code>optional string domain = 3;</code>
       * @return The domain.
       */
      @java.lang.Override
      public java.lang.String getDomain() {
        java.lang.Object ref = domain_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            domain_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Domain of the application. For example, "mygame.foo.com".
       * </pre>
       *
       * <code>optional string domain = 3;</code>
       * @return The bytes for domain.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getDomainBytes() {
        java.lang.Object ref = domain_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          domain_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int CATTAX_FIELD_NUMBER = 17;
      private int cattax_;
      /**
       * <pre>
       * The taxonomy in use.
       * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
       * </pre>
       *
       * <code>optional int32 cattax = 17 [default = 1];</code>
       * @return Whether the cattax field is set.
       */
      @java.lang.Override
      public boolean hasCattax() {
        return ((bitField0_ & 0x00000008) != 0);
      }
      /**
       * <pre>
       * The taxonomy in use.
       * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
       * </pre>
       *
       * <code>optional int32 cattax = 17 [default = 1];</code>
       * @return The cattax.
       */
      @java.lang.Override
      public int getCattax() {
        return cattax_;
      }

      public static final int CAT_FIELD_NUMBER = 4;
      private com.google.protobuf.LazyStringList cat_;
      /**
       * <pre>
       * Array of IAB content categories of the app.
       * </pre>
       *
       * <code>repeated string cat = 4;</code>
       * @return A list containing the cat.
       */
      public com.google.protobuf.ProtocolStringList
          getCatList() {
        return cat_;
      }
      /**
       * <pre>
       * Array of IAB content categories of the app.
       * </pre>
       *
       * <code>repeated string cat = 4;</code>
       * @return The count of cat.
       */
      public int getCatCount() {
        return cat_.size();
      }
      /**
       * <pre>
       * Array of IAB content categories of the app.
       * </pre>
       *
       * <code>repeated string cat = 4;</code>
       * @param index The index of the element to return.
       * @return The cat at the given index.
       */
      public java.lang.String getCat(int index) {
        return cat_.get(index);
      }
      /**
       * <pre>
       * Array of IAB content categories of the app.
       * </pre>
       *
       * <code>repeated string cat = 4;</code>
       * @param index The index of the value to return.
       * @return The bytes of the cat at the given index.
       */
      public com.google.protobuf.ByteString
          getCatBytes(int index) {
        return cat_.getByteString(index);
      }

      public static final int SECTIONCAT_FIELD_NUMBER = 5;
      private com.google.protobuf.LazyStringList sectioncat_;
      /**
       * <pre>
       * Array of IAB content categories that describe the current section
       * of the app.
       * </pre>
       *
       * <code>repeated string sectioncat = 5;</code>
       * @return A list containing the sectioncat.
       */
      public com.google.protobuf.ProtocolStringList
          getSectioncatList() {
        return sectioncat_;
      }
      /**
       * <pre>
       * Array of IAB content categories that describe the current section
       * of the app.
       * </pre>
       *
       * <code>repeated string sectioncat = 5;</code>
       * @return The count of sectioncat.
       */
      public int getSectioncatCount() {
        return sectioncat_.size();
      }
      /**
       * <pre>
       * Array of IAB content categories that describe the current section
       * of the app.
       * </pre>
       *
       * <code>repeated string sectioncat = 5;</code>
       * @param index The index of the element to return.
       * @return The sectioncat at the given index.
       */
      public java.lang.String getSectioncat(int index) {
        return sectioncat_.get(index);
      }
      /**
       * <pre>
       * Array of IAB content categories that describe the current section
       * of the app.
       * </pre>
       *
       * <code>repeated string sectioncat = 5;</code>
       * @param index The index of the value to return.
       * @return The bytes of the sectioncat at the given index.
       */
      public com.google.protobuf.ByteString
          getSectioncatBytes(int index) {
        return sectioncat_.getByteString(index);
      }

      public static final int PAGECAT_FIELD_NUMBER = 6;
      private com.google.protobuf.LazyStringList pagecat_;
      /**
       * <pre>
       * Array of IAB content categories that describe the current page or view
       * of the app.
       * </pre>
       *
       * <code>repeated string pagecat = 6;</code>
       * @return A list containing the pagecat.
       */
      public com.google.protobuf.ProtocolStringList
          getPagecatList() {
        return pagecat_;
      }
      /**
       * <pre>
       * Array of IAB content categories that describe the current page or view
       * of the app.
       * </pre>
       *
       * <code>repeated string pagecat = 6;</code>
       * @return The count of pagecat.
       */
      public int getPagecatCount() {
        return pagecat_.size();
      }
      /**
       * <pre>
       * Array of IAB content categories that describe the current page or view
       * of the app.
       * </pre>
       *
       * <code>repeated string pagecat = 6;</code>
       * @param index The index of the element to return.
       * @return The pagecat at the given index.
       */
      public java.lang.String getPagecat(int index) {
        return pagecat_.get(index);
      }
      /**
       * <pre>
       * Array of IAB content categories that describe the current page or view
       * of the app.
       * </pre>
       *
       * <code>repeated string pagecat = 6;</code>
       * @param index The index of the value to return.
       * @return The bytes of the pagecat at the given index.
       */
      public com.google.protobuf.ByteString
          getPagecatBytes(int index) {
        return pagecat_.getByteString(index);
      }

      public static final int VER_FIELD_NUMBER = 7;
      private volatile java.lang.Object ver_;
      /**
       * <pre>
       * Application version.
       * </pre>
       *
       * <code>optional string ver = 7;</code>
       * @return Whether the ver field is set.
       */
      @java.lang.Override
      public boolean hasVer() {
        return ((bitField0_ & 0x00000010) != 0);
      }
      /**
       * <pre>
       * Application version.
       * </pre>
       *
       * <code>optional string ver = 7;</code>
       * @return The ver.
       */
      @java.lang.Override
      public java.lang.String getVer() {
        java.lang.Object ref = ver_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            ver_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Application version.
       * </pre>
       *
       * <code>optional string ver = 7;</code>
       * @return The bytes for ver.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getVerBytes() {
        java.lang.Object ref = ver_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          ver_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int BUNDLE_FIELD_NUMBER = 8;
      private volatile java.lang.Object bundle_;
      /**
       * <pre>
       * A platform-specific application identifier intended to be
       * unique to the app and independent of the exchange. On Android,
       * this should be a bundle or package name (e.g., com.foo.mygame).
       * On iOS, it is a numeric ID. For SDK-less requests (mostly from connected
       * TVs), it can be provided by the publisher directly in the request.
       * </pre>
       *
       * <code>optional string bundle = 8;</code>
       * @return Whether the bundle field is set.
       */
      @java.lang.Override
      public boolean hasBundle() {
        return ((bitField0_ & 0x00000020) != 0);
      }
      /**
       * <pre>
       * A platform-specific application identifier intended to be
       * unique to the app and independent of the exchange. On Android,
       * this should be a bundle or package name (e.g., com.foo.mygame).
       * On iOS, it is a numeric ID. For SDK-less requests (mostly from connected
       * TVs), it can be provided by the publisher directly in the request.
       * </pre>
       *
       * <code>optional string bundle = 8;</code>
       * @return The bundle.
       */
      @java.lang.Override
      public java.lang.String getBundle() {
        java.lang.Object ref = bundle_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            bundle_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * A platform-specific application identifier intended to be
       * unique to the app and independent of the exchange. On Android,
       * this should be a bundle or package name (e.g., com.foo.mygame).
       * On iOS, it is a numeric ID. For SDK-less requests (mostly from connected
       * TVs), it can be provided by the publisher directly in the request.
       * </pre>
       *
       * <code>optional string bundle = 8;</code>
       * @return The bytes for bundle.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getBundleBytes() {
        java.lang.Object ref = bundle_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          bundle_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int PRIVACYPOLICY_FIELD_NUMBER = 9;
      private boolean privacypolicy_;
      /**
       * <pre>
       * Indicates if the app has a privacy policy, where 0 = no, 1 = yes.
       * </pre>
       *
       * <code>optional bool privacypolicy = 9;</code>
       * @return Whether the privacypolicy field is set.
       */
      @java.lang.Override
      public boolean hasPrivacypolicy() {
        return ((bitField0_ & 0x00000040) != 0);
      }
      /**
       * <pre>
       * Indicates if the app has a privacy policy, where 0 = no, 1 = yes.
       * </pre>
       *
       * <code>optional bool privacypolicy = 9;</code>
       * @return The privacypolicy.
       */
      @java.lang.Override
      public boolean getPrivacypolicy() {
        return privacypolicy_;
      }

      public static final int PAID_FIELD_NUMBER = 10;
      private boolean paid_;
      /**
       * <pre>
       * 0 = app is free, 1 = the app is a paid version.
       * </pre>
       *
       * <code>optional bool paid = 10;</code>
       * @return Whether the paid field is set.
       */
      @java.lang.Override
      public boolean hasPaid() {
        return ((bitField0_ & 0x00000080) != 0);
      }
      /**
       * <pre>
       * 0 = app is free, 1 = the app is a paid version.
       * </pre>
       *
       * <code>optional bool paid = 10;</code>
       * @return The paid.
       */
      @java.lang.Override
      public boolean getPaid() {
        return paid_;
      }

      public static final int PUBLISHER_FIELD_NUMBER = 11;
      private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher publisher_;
      /**
       * <pre>
       * Details about the Publisher (Section 3.2.8) of the app.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Publisher publisher = 11;</code>
       * @return Whether the publisher field is set.
       */
      @java.lang.Override
      public boolean hasPublisher() {
        return ((bitField0_ & 0x00000100) != 0);
      }
      /**
       * <pre>
       * Details about the Publisher (Section 3.2.8) of the app.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Publisher publisher = 11;</code>
       * @return The publisher.
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher getPublisher() {
        return publisher_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher.getDefaultInstance() : publisher_;
      }
      /**
       * <pre>
       * Details about the Publisher (Section 3.2.8) of the app.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Publisher publisher = 11;</code>
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.PublisherOrBuilder getPublisherOrBuilder() {
        return publisher_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher.getDefaultInstance() : publisher_;
      }

      public static final int CONTENT_FIELD_NUMBER = 12;
      private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content content_;
      /**
       * <pre>
       * Details about the Content (Section 3.2.9) within the app.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Content content = 12;</code>
       * @return Whether the content field is set.
       */
      @java.lang.Override
      public boolean hasContent() {
        return ((bitField0_ & 0x00000200) != 0);
      }
      /**
       * <pre>
       * Details about the Content (Section 3.2.9) within the app.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Content content = 12;</code>
       * @return The content.
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content getContent() {
        return content_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content.getDefaultInstance() : content_;
      }
      /**
       * <pre>
       * Details about the Content (Section 3.2.9) within the app.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Content content = 12;</code>
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.ContentOrBuilder getContentOrBuilder() {
        return content_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content.getDefaultInstance() : content_;
      }

      public static final int KEYWORDS_FIELD_NUMBER = 13;
      private volatile java.lang.Object keywords_;
      /**
       * <pre>
       * Comma separated list of keywords about the app.
       * </pre>
       *
       * <code>optional string keywords = 13;</code>
       * @return Whether the keywords field is set.
       */
      @java.lang.Override
      public boolean hasKeywords() {
        return ((bitField0_ & 0x00000400) != 0);
      }
      /**
       * <pre>
       * Comma separated list of keywords about the app.
       * </pre>
       *
       * <code>optional string keywords = 13;</code>
       * @return The keywords.
       */
      @java.lang.Override
      public java.lang.String getKeywords() {
        java.lang.Object ref = keywords_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            keywords_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Comma separated list of keywords about the app.
       * </pre>
       *
       * <code>optional string keywords = 13;</code>
       * @return The bytes for keywords.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getKeywordsBytes() {
        java.lang.Object ref = keywords_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          keywords_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int STOREURL_FIELD_NUMBER = 16;
      private volatile java.lang.Object storeurl_;
      /**
       * <pre>
       * App store URL for an installed app; for QAG 1.5 compliance.
       * </pre>
       *
       * <code>optional string storeurl = 16;</code>
       * @return Whether the storeurl field is set.
       */
      @java.lang.Override
      public boolean hasStoreurl() {
        return ((bitField0_ & 0x00000800) != 0);
      }
      /**
       * <pre>
       * App store URL for an installed app; for QAG 1.5 compliance.
       * </pre>
       *
       * <code>optional string storeurl = 16;</code>
       * @return The storeurl.
       */
      @java.lang.Override
      public java.lang.String getStoreurl() {
        java.lang.Object ref = storeurl_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            storeurl_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * App store URL for an installed app; for QAG 1.5 compliance.
       * </pre>
       *
       * <code>optional string storeurl = 16;</code>
       * @return The bytes for storeurl.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getStoreurlBytes() {
        java.lang.Object ref = storeurl_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          storeurl_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

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

        if (hasPublisher()) {
          if (!getPublisher().isInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
        }
        if (hasContent()) {
          if (!getContent().isInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
        }
        if (!extensionsAreInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
        memoizedIsInitialized = 1;
        return true;
      }

      @java.lang.Override
      public void writeTo(com.google.protobuf.CodedOutputStream output)
                          throws java.io.IOException {
        com.google.protobuf.GeneratedMessageV3
          .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App>.ExtensionWriter
            extensionWriter = newExtensionWriter();
        if (((bitField0_ & 0x00000001) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 1, id_);
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 2, name_);
        }
        if (((bitField0_ & 0x00000004) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 3, domain_);
        }
        for (int i = 0; i < cat_.size(); i++) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 4, cat_.getRaw(i));
        }
        for (int i = 0; i < sectioncat_.size(); i++) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 5, sectioncat_.getRaw(i));
        }
        for (int i = 0; i < pagecat_.size(); i++) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 6, pagecat_.getRaw(i));
        }
        if (((bitField0_ & 0x00000010) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 7, ver_);
        }
        if (((bitField0_ & 0x00000020) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 8, bundle_);
        }
        if (((bitField0_ & 0x00000040) != 0)) {
          output.writeBool(9, privacypolicy_);
        }
        if (((bitField0_ & 0x00000080) != 0)) {
          output.writeBool(10, paid_);
        }
        if (((bitField0_ & 0x00000100) != 0)) {
          output.writeMessage(11, getPublisher());
        }
        if (((bitField0_ & 0x00000200) != 0)) {
          output.writeMessage(12, getContent());
        }
        if (((bitField0_ & 0x00000400) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 13, keywords_);
        }
        if (((bitField0_ & 0x00000800) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 16, storeurl_);
        }
        if (((bitField0_ & 0x00000008) != 0)) {
          output.writeInt32(17, cattax_);
        }
        extensionWriter.writeUntil(10000, output);
        unknownFields.writeTo(output);
      }

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

        size = 0;
        if (((bitField0_ & 0x00000001) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, id_);
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, name_);
        }
        if (((bitField0_ & 0x00000004) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, domain_);
        }
        {
          int dataSize = 0;
          for (int i = 0; i < cat_.size(); i++) {
            dataSize += computeStringSizeNoTag(cat_.getRaw(i));
          }
          size += dataSize;
          size += 1 * getCatList().size();
        }
        {
          int dataSize = 0;
          for (int i = 0; i < sectioncat_.size(); i++) {
            dataSize += computeStringSizeNoTag(sectioncat_.getRaw(i));
          }
          size += dataSize;
          size += 1 * getSectioncatList().size();
        }
        {
          int dataSize = 0;
          for (int i = 0; i < pagecat_.size(); i++) {
            dataSize += computeStringSizeNoTag(pagecat_.getRaw(i));
          }
          size += dataSize;
          size += 1 * getPagecatList().size();
        }
        if (((bitField0_ & 0x00000010) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(7, ver_);
        }
        if (((bitField0_ & 0x00000020) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(8, bundle_);
        }
        if (((bitField0_ & 0x00000040) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeBoolSize(9, privacypolicy_);
        }
        if (((bitField0_ & 0x00000080) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeBoolSize(10, paid_);
        }
        if (((bitField0_ & 0x00000100) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeMessageSize(11, getPublisher());
        }
        if (((bitField0_ & 0x00000200) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeMessageSize(12, getContent());
        }
        if (((bitField0_ & 0x00000400) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(13, keywords_);
        }
        if (((bitField0_ & 0x00000800) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(16, storeurl_);
        }
        if (((bitField0_ & 0x00000008) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeInt32Size(17, cattax_);
        }
        size += extensionsSerializedSize();
        size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App)) {
          return super.equals(obj);
        }
        com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App other = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App) obj;

        if (hasId() != other.hasId()) return false;
        if (hasId()) {
          if (!getId()
              .equals(other.getId())) return false;
        }
        if (hasName() != other.hasName()) return false;
        if (hasName()) {
          if (!getName()
              .equals(other.getName())) return false;
        }
        if (hasDomain() != other.hasDomain()) return false;
        if (hasDomain()) {
          if (!getDomain()
              .equals(other.getDomain())) return false;
        }
        if (hasCattax() != other.hasCattax()) return false;
        if (hasCattax()) {
          if (getCattax()
              != other.getCattax()) return false;
        }
        if (!getCatList()
            .equals(other.getCatList())) return false;
        if (!getSectioncatList()
            .equals(other.getSectioncatList())) return false;
        if (!getPagecatList()
            .equals(other.getPagecatList())) return false;
        if (hasVer() != other.hasVer()) return false;
        if (hasVer()) {
          if (!getVer()
              .equals(other.getVer())) return false;
        }
        if (hasBundle() != other.hasBundle()) return false;
        if (hasBundle()) {
          if (!getBundle()
              .equals(other.getBundle())) return false;
        }
        if (hasPrivacypolicy() != other.hasPrivacypolicy()) return false;
        if (hasPrivacypolicy()) {
          if (getPrivacypolicy()
              != other.getPrivacypolicy()) return false;
        }
        if (hasPaid() != other.hasPaid()) return false;
        if (hasPaid()) {
          if (getPaid()
              != other.getPaid()) return false;
        }
        if (hasPublisher() != other.hasPublisher()) return false;
        if (hasPublisher()) {
          if (!getPublisher()
              .equals(other.getPublisher())) return false;
        }
        if (hasContent() != other.hasContent()) return false;
        if (hasContent()) {
          if (!getContent()
              .equals(other.getContent())) return false;
        }
        if (hasKeywords() != other.hasKeywords()) return false;
        if (hasKeywords()) {
          if (!getKeywords()
              .equals(other.getKeywords())) return false;
        }
        if (hasStoreurl() != other.hasStoreurl()) return false;
        if (hasStoreurl()) {
          if (!getStoreurl()
              .equals(other.getStoreurl())) return false;
        }
        if (!unknownFields.equals(other.unknownFields)) return false;
        if (!getExtensionFields().equals(other.getExtensionFields()))
          return false;
        return true;
      }

      @java.lang.Override
      public int hashCode() {
        if (memoizedHashCode != 0) {
          return memoizedHashCode;
        }
        int hash = 41;
        hash = (19 * hash) + getDescriptor().hashCode();
        if (hasId()) {
          hash = (37 * hash) + ID_FIELD_NUMBER;
          hash = (53 * hash) + getId().hashCode();
        }
        if (hasName()) {
          hash = (37 * hash) + NAME_FIELD_NUMBER;
          hash = (53 * hash) + getName().hashCode();
        }
        if (hasDomain()) {
          hash = (37 * hash) + DOMAIN_FIELD_NUMBER;
          hash = (53 * hash) + getDomain().hashCode();
        }
        if (hasCattax()) {
          hash = (37 * hash) + CATTAX_FIELD_NUMBER;
          hash = (53 * hash) + getCattax();
        }
        if (getCatCount() > 0) {
          hash = (37 * hash) + CAT_FIELD_NUMBER;
          hash = (53 * hash) + getCatList().hashCode();
        }
        if (getSectioncatCount() > 0) {
          hash = (37 * hash) + SECTIONCAT_FIELD_NUMBER;
          hash = (53 * hash) + getSectioncatList().hashCode();
        }
        if (getPagecatCount() > 0) {
          hash = (37 * hash) + PAGECAT_FIELD_NUMBER;
          hash = (53 * hash) + getPagecatList().hashCode();
        }
        if (hasVer()) {
          hash = (37 * hash) + VER_FIELD_NUMBER;
          hash = (53 * hash) + getVer().hashCode();
        }
        if (hasBundle()) {
          hash = (37 * hash) + BUNDLE_FIELD_NUMBER;
          hash = (53 * hash) + getBundle().hashCode();
        }
        if (hasPrivacypolicy()) {
          hash = (37 * hash) + PRIVACYPOLICY_FIELD_NUMBER;
          hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
              getPrivacypolicy());
        }
        if (hasPaid()) {
          hash = (37 * hash) + PAID_FIELD_NUMBER;
          hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
              getPaid());
        }
        if (hasPublisher()) {
          hash = (37 * hash) + PUBLISHER_FIELD_NUMBER;
          hash = (53 * hash) + getPublisher().hashCode();
        }
        if (hasContent()) {
          hash = (37 * hash) + CONTENT_FIELD_NUMBER;
          hash = (53 * hash) + getContent().hashCode();
        }
        if (hasKeywords()) {
          hash = (37 * hash) + KEYWORDS_FIELD_NUMBER;
          hash = (53 * hash) + getKeywords().hashCode();
        }
        if (hasStoreurl()) {
          hash = (37 * hash) + STOREURL_FIELD_NUMBER;
          hash = (53 * hash) + getStoreurl().hashCode();
        }
        hash = hashFields(hash, getExtensionFields());
        hash = (29 * hash) + unknownFields.hashCode();
        memoizedHashCode = hash;
        return hash;
      }

      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App parseFrom(
          java.nio.ByteBuffer data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App parseFrom(
          java.nio.ByteBuffer data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App parseFrom(
          com.google.protobuf.ByteString data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App parseFrom(
          com.google.protobuf.ByteString data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App parseFrom(byte[] data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App parseFrom(
          byte[] data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App parseFrom(java.io.InputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App parseDelimitedFrom(java.io.InputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseDelimitedWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App parseFrom(
          com.google.protobuf.CodedInputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App 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>
       * OpenRTB 2.0: This object should be included if the ad supported content
       * is a non-browser application (typically in mobile) as opposed to a website.
       * A bid request must not contain both an App and a Site object.
       * At a minimum, it is useful to provide an App ID or bundle,
       * but this is not strictly required.
       * </pre>
       *
       * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.App}
       */
      public static final class Builder extends
          com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App, Builder> implements
          // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.BidRequest.App)
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.AppOrBuilder {
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_App_descriptor;
        }

        @java.lang.Override
        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_App_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App.Builder.class);
        }

        // Construct using com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App.newBuilder()
        private Builder() {
          maybeForceBuilderInitialization();
        }

        private Builder(
            com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
          super(parent);
          maybeForceBuilderInitialization();
        }
        private void maybeForceBuilderInitialization() {
          if (com.google.protobuf.GeneratedMessageV3
                  .alwaysUseFieldBuilders) {
            getPublisherFieldBuilder();
            getContentFieldBuilder();
          }
        }
        @java.lang.Override
        public Builder clear() {
          super.clear();
          id_ = "";
          bitField0_ = (bitField0_ & ~0x00000001);
          name_ = "";
          bitField0_ = (bitField0_ & ~0x00000002);
          domain_ = "";
          bitField0_ = (bitField0_ & ~0x00000004);
          cattax_ = 1;
          bitField0_ = (bitField0_ & ~0x00000008);
          cat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
          bitField0_ = (bitField0_ & ~0x00000010);
          sectioncat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
          bitField0_ = (bitField0_ & ~0x00000020);
          pagecat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
          bitField0_ = (bitField0_ & ~0x00000040);
          ver_ = "";
          bitField0_ = (bitField0_ & ~0x00000080);
          bundle_ = "";
          bitField0_ = (bitField0_ & ~0x00000100);
          privacypolicy_ = false;
          bitField0_ = (bitField0_ & ~0x00000200);
          paid_ = false;
          bitField0_ = (bitField0_ & ~0x00000400);
          if (publisherBuilder_ == null) {
            publisher_ = null;
          } else {
            publisherBuilder_.clear();
          }
          bitField0_ = (bitField0_ & ~0x00000800);
          if (contentBuilder_ == null) {
            content_ = null;
          } else {
            contentBuilder_.clear();
          }
          bitField0_ = (bitField0_ & ~0x00001000);
          keywords_ = "";
          bitField0_ = (bitField0_ & ~0x00002000);
          storeurl_ = "";
          bitField0_ = (bitField0_ & ~0x00004000);
          return this;
        }

        @java.lang.Override
        public com.google.protobuf.Descriptors.Descriptor
            getDescriptorForType() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_App_descriptor;
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App getDefaultInstanceForType() {
          return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App.getDefaultInstance();
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App build() {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App result = buildPartial();
          if (!result.isInitialized()) {
            throw newUninitializedMessageException(result);
          }
          return result;
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App buildPartial() {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App result = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App(this);
          int from_bitField0_ = bitField0_;
          int to_bitField0_ = 0;
          if (((from_bitField0_ & 0x00000001) != 0)) {
            to_bitField0_ |= 0x00000001;
          }
          result.id_ = id_;
          if (((from_bitField0_ & 0x00000002) != 0)) {
            to_bitField0_ |= 0x00000002;
          }
          result.name_ = name_;
          if (((from_bitField0_ & 0x00000004) != 0)) {
            to_bitField0_ |= 0x00000004;
          }
          result.domain_ = domain_;
          if (((from_bitField0_ & 0x00000008) != 0)) {
            to_bitField0_ |= 0x00000008;
          }
          result.cattax_ = cattax_;
          if (((bitField0_ & 0x00000010) != 0)) {
            cat_ = cat_.getUnmodifiableView();
            bitField0_ = (bitField0_ & ~0x00000010);
          }
          result.cat_ = cat_;
          if (((bitField0_ & 0x00000020) != 0)) {
            sectioncat_ = sectioncat_.getUnmodifiableView();
            bitField0_ = (bitField0_ & ~0x00000020);
          }
          result.sectioncat_ = sectioncat_;
          if (((bitField0_ & 0x00000040) != 0)) {
            pagecat_ = pagecat_.getUnmodifiableView();
            bitField0_ = (bitField0_ & ~0x00000040);
          }
          result.pagecat_ = pagecat_;
          if (((from_bitField0_ & 0x00000080) != 0)) {
            to_bitField0_ |= 0x00000010;
          }
          result.ver_ = ver_;
          if (((from_bitField0_ & 0x00000100) != 0)) {
            to_bitField0_ |= 0x00000020;
          }
          result.bundle_ = bundle_;
          if (((from_bitField0_ & 0x00000200) != 0)) {
            result.privacypolicy_ = privacypolicy_;
            to_bitField0_ |= 0x00000040;
          }
          if (((from_bitField0_ & 0x00000400) != 0)) {
            result.paid_ = paid_;
            to_bitField0_ |= 0x00000080;
          }
          if (((from_bitField0_ & 0x00000800) != 0)) {
            if (publisherBuilder_ == null) {
              result.publisher_ = publisher_;
            } else {
              result.publisher_ = publisherBuilder_.build();
            }
            to_bitField0_ |= 0x00000100;
          }
          if (((from_bitField0_ & 0x00001000) != 0)) {
            if (contentBuilder_ == null) {
              result.content_ = content_;
            } else {
              result.content_ = contentBuilder_.build();
            }
            to_bitField0_ |= 0x00000200;
          }
          if (((from_bitField0_ & 0x00002000) != 0)) {
            to_bitField0_ |= 0x00000400;
          }
          result.keywords_ = keywords_;
          if (((from_bitField0_ & 0x00004000) != 0)) {
            to_bitField0_ |= 0x00000800;
          }
          result.storeurl_ = storeurl_;
          result.bitField0_ = to_bitField0_;
          onBuilt();
          return result;
        }

        @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 <Type> Builder setExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App, Type> extension,
            Type value) {
          return super.setExtension(extension, value);
        }
        @java.lang.Override
        public <Type> Builder setExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App, java.util.List<Type>> extension,
            int index, Type value) {
          return super.setExtension(extension, index, value);
        }
        @java.lang.Override
        public <Type> Builder addExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App, java.util.List<Type>> extension,
            Type value) {
          return super.addExtension(extension, value);
        }
        @java.lang.Override
        public <Type> Builder clearExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App, ?> extension) {
          return super.clearExtension(extension);
        }
        @java.lang.Override
        public Builder mergeFrom(com.google.protobuf.Message other) {
          if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App) {
            return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App)other);
          } else {
            super.mergeFrom(other);
            return this;
          }
        }

        public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App other) {
          if (other == com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App.getDefaultInstance()) return this;
          if (other.hasId()) {
            bitField0_ |= 0x00000001;
            id_ = other.id_;
            onChanged();
          }
          if (other.hasName()) {
            bitField0_ |= 0x00000002;
            name_ = other.name_;
            onChanged();
          }
          if (other.hasDomain()) {
            bitField0_ |= 0x00000004;
            domain_ = other.domain_;
            onChanged();
          }
          if (other.hasCattax()) {
            setCattax(other.getCattax());
          }
          if (!other.cat_.isEmpty()) {
            if (cat_.isEmpty()) {
              cat_ = other.cat_;
              bitField0_ = (bitField0_ & ~0x00000010);
            } else {
              ensureCatIsMutable();
              cat_.addAll(other.cat_);
            }
            onChanged();
          }
          if (!other.sectioncat_.isEmpty()) {
            if (sectioncat_.isEmpty()) {
              sectioncat_ = other.sectioncat_;
              bitField0_ = (bitField0_ & ~0x00000020);
            } else {
              ensureSectioncatIsMutable();
              sectioncat_.addAll(other.sectioncat_);
            }
            onChanged();
          }
          if (!other.pagecat_.isEmpty()) {
            if (pagecat_.isEmpty()) {
              pagecat_ = other.pagecat_;
              bitField0_ = (bitField0_ & ~0x00000040);
            } else {
              ensurePagecatIsMutable();
              pagecat_.addAll(other.pagecat_);
            }
            onChanged();
          }
          if (other.hasVer()) {
            bitField0_ |= 0x00000080;
            ver_ = other.ver_;
            onChanged();
          }
          if (other.hasBundle()) {
            bitField0_ |= 0x00000100;
            bundle_ = other.bundle_;
            onChanged();
          }
          if (other.hasPrivacypolicy()) {
            setPrivacypolicy(other.getPrivacypolicy());
          }
          if (other.hasPaid()) {
            setPaid(other.getPaid());
          }
          if (other.hasPublisher()) {
            mergePublisher(other.getPublisher());
          }
          if (other.hasContent()) {
            mergeContent(other.getContent());
          }
          if (other.hasKeywords()) {
            bitField0_ |= 0x00002000;
            keywords_ = other.keywords_;
            onChanged();
          }
          if (other.hasStoreurl()) {
            bitField0_ |= 0x00004000;
            storeurl_ = other.storeurl_;
            onChanged();
          }
          this.mergeExtensionFields(other);
          this.mergeUnknownFields(other.unknownFields);
          onChanged();
          return this;
        }

        @java.lang.Override
        public final boolean isInitialized() {
          if (hasPublisher()) {
            if (!getPublisher().isInitialized()) {
              return false;
            }
          }
          if (hasContent()) {
            if (!getContent().isInitialized()) {
              return false;
            }
          }
          if (!extensionsAreInitialized()) {
            return false;
          }
          return true;
        }

        @java.lang.Override
        public Builder mergeFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws java.io.IOException {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App parsedMessage = null;
          try {
            parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App) e.getUnfinishedMessage();
            throw e.unwrapIOException();
          } finally {
            if (parsedMessage != null) {
              mergeFrom(parsedMessage);
            }
          }
          return this;
        }
        private int bitField0_;

        private java.lang.Object id_ = "";
        /**
         * <pre>
         * Application ID on the exchange.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @return Whether the id field is set.
         */
        public boolean hasId() {
          return ((bitField0_ & 0x00000001) != 0);
        }
        /**
         * <pre>
         * Application ID on the exchange.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @return The id.
         */
        public java.lang.String getId() {
          java.lang.Object ref = id_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              id_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Application ID on the exchange.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @return The bytes for id.
         */
        public com.google.protobuf.ByteString
            getIdBytes() {
          java.lang.Object ref = id_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            id_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Application ID on the exchange.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @param value The id to set.
         * @return This builder for chaining.
         */
        public Builder setId(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
          id_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Application ID on the exchange.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @return This builder for chaining.
         */
        public Builder clearId() {
          bitField0_ = (bitField0_ & ~0x00000001);
          id_ = getDefaultInstance().getId();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Application ID on the exchange.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @param value The bytes for id to set.
         * @return This builder for chaining.
         */
        public Builder setIdBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
          id_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object name_ = "";
        /**
         * <pre>
         * Application name (may be aliased at publisher's request). App names for
         * SDK-less requests (mostly from connected TVs) can be provided by the
         * publisher directly in the request.
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @return Whether the name field is set.
         */
        public boolean hasName() {
          return ((bitField0_ & 0x00000002) != 0);
        }
        /**
         * <pre>
         * Application name (may be aliased at publisher's request). App names for
         * SDK-less requests (mostly from connected TVs) can be provided by the
         * publisher directly in the request.
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @return The name.
         */
        public java.lang.String getName() {
          java.lang.Object ref = name_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              name_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Application name (may be aliased at publisher's request). App names for
         * SDK-less requests (mostly from connected TVs) can be provided by the
         * publisher directly in the request.
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @return The bytes for name.
         */
        public com.google.protobuf.ByteString
            getNameBytes() {
          java.lang.Object ref = name_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            name_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Application name (may be aliased at publisher's request). App names for
         * SDK-less requests (mostly from connected TVs) can be provided by the
         * publisher directly in the request.
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @param value The name to set.
         * @return This builder for chaining.
         */
        public Builder setName(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
          name_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Application name (may be aliased at publisher's request). App names for
         * SDK-less requests (mostly from connected TVs) can be provided by the
         * publisher directly in the request.
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @return This builder for chaining.
         */
        public Builder clearName() {
          bitField0_ = (bitField0_ & ~0x00000002);
          name_ = getDefaultInstance().getName();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Application name (may be aliased at publisher's request). App names for
         * SDK-less requests (mostly from connected TVs) can be provided by the
         * publisher directly in the request.
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @param value The bytes for name to set.
         * @return This builder for chaining.
         */
        public Builder setNameBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
          name_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object domain_ = "";
        /**
         * <pre>
         * Domain of the application. For example, "mygame.foo.com".
         * </pre>
         *
         * <code>optional string domain = 3;</code>
         * @return Whether the domain field is set.
         */
        public boolean hasDomain() {
          return ((bitField0_ & 0x00000004) != 0);
        }
        /**
         * <pre>
         * Domain of the application. For example, "mygame.foo.com".
         * </pre>
         *
         * <code>optional string domain = 3;</code>
         * @return The domain.
         */
        public java.lang.String getDomain() {
          java.lang.Object ref = domain_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              domain_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Domain of the application. For example, "mygame.foo.com".
         * </pre>
         *
         * <code>optional string domain = 3;</code>
         * @return The bytes for domain.
         */
        public com.google.protobuf.ByteString
            getDomainBytes() {
          java.lang.Object ref = domain_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            domain_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Domain of the application. For example, "mygame.foo.com".
         * </pre>
         *
         * <code>optional string domain = 3;</code>
         * @param value The domain to set.
         * @return This builder for chaining.
         */
        public Builder setDomain(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
          domain_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Domain of the application. For example, "mygame.foo.com".
         * </pre>
         *
         * <code>optional string domain = 3;</code>
         * @return This builder for chaining.
         */
        public Builder clearDomain() {
          bitField0_ = (bitField0_ & ~0x00000004);
          domain_ = getDefaultInstance().getDomain();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Domain of the application. For example, "mygame.foo.com".
         * </pre>
         *
         * <code>optional string domain = 3;</code>
         * @param value The bytes for domain to set.
         * @return This builder for chaining.
         */
        public Builder setDomainBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
          domain_ = value;
          onChanged();
          return this;
        }

        private int cattax_ = 1;
        /**
         * <pre>
         * The taxonomy in use.
         * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
         * </pre>
         *
         * <code>optional int32 cattax = 17 [default = 1];</code>
         * @return Whether the cattax field is set.
         */
        @java.lang.Override
        public boolean hasCattax() {
          return ((bitField0_ & 0x00000008) != 0);
        }
        /**
         * <pre>
         * The taxonomy in use.
         * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
         * </pre>
         *
         * <code>optional int32 cattax = 17 [default = 1];</code>
         * @return The cattax.
         */
        @java.lang.Override
        public int getCattax() {
          return cattax_;
        }
        /**
         * <pre>
         * The taxonomy in use.
         * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
         * </pre>
         *
         * <code>optional int32 cattax = 17 [default = 1];</code>
         * @param value The cattax to set.
         * @return This builder for chaining.
         */
        public Builder setCattax(int value) {
          bitField0_ |= 0x00000008;
          cattax_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * The taxonomy in use.
         * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
         * </pre>
         *
         * <code>optional int32 cattax = 17 [default = 1];</code>
         * @return This builder for chaining.
         */
        public Builder clearCattax() {
          bitField0_ = (bitField0_ & ~0x00000008);
          cattax_ = 1;
          onChanged();
          return this;
        }

        private com.google.protobuf.LazyStringList cat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        private void ensureCatIsMutable() {
          if (!((bitField0_ & 0x00000010) != 0)) {
            cat_ = new com.google.protobuf.LazyStringArrayList(cat_);
            bitField0_ |= 0x00000010;
           }
        }
        /**
         * <pre>
         * Array of IAB content categories of the app.
         * </pre>
         *
         * <code>repeated string cat = 4;</code>
         * @return A list containing the cat.
         */
        public com.google.protobuf.ProtocolStringList
            getCatList() {
          return cat_.getUnmodifiableView();
        }
        /**
         * <pre>
         * Array of IAB content categories of the app.
         * </pre>
         *
         * <code>repeated string cat = 4;</code>
         * @return The count of cat.
         */
        public int getCatCount() {
          return cat_.size();
        }
        /**
         * <pre>
         * Array of IAB content categories of the app.
         * </pre>
         *
         * <code>repeated string cat = 4;</code>
         * @param index The index of the element to return.
         * @return The cat at the given index.
         */
        public java.lang.String getCat(int index) {
          return cat_.get(index);
        }
        /**
         * <pre>
         * Array of IAB content categories of the app.
         * </pre>
         *
         * <code>repeated string cat = 4;</code>
         * @param index The index of the value to return.
         * @return The bytes of the cat at the given index.
         */
        public com.google.protobuf.ByteString
            getCatBytes(int index) {
          return cat_.getByteString(index);
        }
        /**
         * <pre>
         * Array of IAB content categories of the app.
         * </pre>
         *
         * <code>repeated string cat = 4;</code>
         * @param index The index to set the value at.
         * @param value The cat to set.
         * @return This builder for chaining.
         */
        public Builder setCat(
            int index, java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  ensureCatIsMutable();
          cat_.set(index, value);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Array of IAB content categories of the app.
         * </pre>
         *
         * <code>repeated string cat = 4;</code>
         * @param value The cat to add.
         * @return This builder for chaining.
         */
        public Builder addCat(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  ensureCatIsMutable();
          cat_.add(value);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Array of IAB content categories of the app.
         * </pre>
         *
         * <code>repeated string cat = 4;</code>
         * @param values The cat to add.
         * @return This builder for chaining.
         */
        public Builder addAllCat(
            java.lang.Iterable<java.lang.String> values) {
          ensureCatIsMutable();
          com.google.protobuf.AbstractMessageLite.Builder.addAll(
              values, cat_);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Array of IAB content categories of the app.
         * </pre>
         *
         * <code>repeated string cat = 4;</code>
         * @return This builder for chaining.
         */
        public Builder clearCat() {
          cat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
          bitField0_ = (bitField0_ & ~0x00000010);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Array of IAB content categories of the app.
         * </pre>
         *
         * <code>repeated string cat = 4;</code>
         * @param value The bytes of the cat to add.
         * @return This builder for chaining.
         */
        public Builder addCatBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  ensureCatIsMutable();
          cat_.add(value);
          onChanged();
          return this;
        }

        private com.google.protobuf.LazyStringList sectioncat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        private void ensureSectioncatIsMutable() {
          if (!((bitField0_ & 0x00000020) != 0)) {
            sectioncat_ = new com.google.protobuf.LazyStringArrayList(sectioncat_);
            bitField0_ |= 0x00000020;
           }
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the current section
         * of the app.
         * </pre>
         *
         * <code>repeated string sectioncat = 5;</code>
         * @return A list containing the sectioncat.
         */
        public com.google.protobuf.ProtocolStringList
            getSectioncatList() {
          return sectioncat_.getUnmodifiableView();
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the current section
         * of the app.
         * </pre>
         *
         * <code>repeated string sectioncat = 5;</code>
         * @return The count of sectioncat.
         */
        public int getSectioncatCount() {
          return sectioncat_.size();
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the current section
         * of the app.
         * </pre>
         *
         * <code>repeated string sectioncat = 5;</code>
         * @param index The index of the element to return.
         * @return The sectioncat at the given index.
         */
        public java.lang.String getSectioncat(int index) {
          return sectioncat_.get(index);
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the current section
         * of the app.
         * </pre>
         *
         * <code>repeated string sectioncat = 5;</code>
         * @param index The index of the value to return.
         * @return The bytes of the sectioncat at the given index.
         */
        public com.google.protobuf.ByteString
            getSectioncatBytes(int index) {
          return sectioncat_.getByteString(index);
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the current section
         * of the app.
         * </pre>
         *
         * <code>repeated string sectioncat = 5;</code>
         * @param index The index to set the value at.
         * @param value The sectioncat to set.
         * @return This builder for chaining.
         */
        public Builder setSectioncat(
            int index, java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  ensureSectioncatIsMutable();
          sectioncat_.set(index, value);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the current section
         * of the app.
         * </pre>
         *
         * <code>repeated string sectioncat = 5;</code>
         * @param value The sectioncat to add.
         * @return This builder for chaining.
         */
        public Builder addSectioncat(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  ensureSectioncatIsMutable();
          sectioncat_.add(value);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the current section
         * of the app.
         * </pre>
         *
         * <code>repeated string sectioncat = 5;</code>
         * @param values The sectioncat to add.
         * @return This builder for chaining.
         */
        public Builder addAllSectioncat(
            java.lang.Iterable<java.lang.String> values) {
          ensureSectioncatIsMutable();
          com.google.protobuf.AbstractMessageLite.Builder.addAll(
              values, sectioncat_);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the current section
         * of the app.
         * </pre>
         *
         * <code>repeated string sectioncat = 5;</code>
         * @return This builder for chaining.
         */
        public Builder clearSectioncat() {
          sectioncat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
          bitField0_ = (bitField0_ & ~0x00000020);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the current section
         * of the app.
         * </pre>
         *
         * <code>repeated string sectioncat = 5;</code>
         * @param value The bytes of the sectioncat to add.
         * @return This builder for chaining.
         */
        public Builder addSectioncatBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  ensureSectioncatIsMutable();
          sectioncat_.add(value);
          onChanged();
          return this;
        }

        private com.google.protobuf.LazyStringList pagecat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        private void ensurePagecatIsMutable() {
          if (!((bitField0_ & 0x00000040) != 0)) {
            pagecat_ = new com.google.protobuf.LazyStringArrayList(pagecat_);
            bitField0_ |= 0x00000040;
           }
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the current page or view
         * of the app.
         * </pre>
         *
         * <code>repeated string pagecat = 6;</code>
         * @return A list containing the pagecat.
         */
        public com.google.protobuf.ProtocolStringList
            getPagecatList() {
          return pagecat_.getUnmodifiableView();
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the current page or view
         * of the app.
         * </pre>
         *
         * <code>repeated string pagecat = 6;</code>
         * @return The count of pagecat.
         */
        public int getPagecatCount() {
          return pagecat_.size();
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the current page or view
         * of the app.
         * </pre>
         *
         * <code>repeated string pagecat = 6;</code>
         * @param index The index of the element to return.
         * @return The pagecat at the given index.
         */
        public java.lang.String getPagecat(int index) {
          return pagecat_.get(index);
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the current page or view
         * of the app.
         * </pre>
         *
         * <code>repeated string pagecat = 6;</code>
         * @param index The index of the value to return.
         * @return The bytes of the pagecat at the given index.
         */
        public com.google.protobuf.ByteString
            getPagecatBytes(int index) {
          return pagecat_.getByteString(index);
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the current page or view
         * of the app.
         * </pre>
         *
         * <code>repeated string pagecat = 6;</code>
         * @param index The index to set the value at.
         * @param value The pagecat to set.
         * @return This builder for chaining.
         */
        public Builder setPagecat(
            int index, java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  ensurePagecatIsMutable();
          pagecat_.set(index, value);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the current page or view
         * of the app.
         * </pre>
         *
         * <code>repeated string pagecat = 6;</code>
         * @param value The pagecat to add.
         * @return This builder for chaining.
         */
        public Builder addPagecat(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  ensurePagecatIsMutable();
          pagecat_.add(value);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the current page or view
         * of the app.
         * </pre>
         *
         * <code>repeated string pagecat = 6;</code>
         * @param values The pagecat to add.
         * @return This builder for chaining.
         */
        public Builder addAllPagecat(
            java.lang.Iterable<java.lang.String> values) {
          ensurePagecatIsMutable();
          com.google.protobuf.AbstractMessageLite.Builder.addAll(
              values, pagecat_);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the current page or view
         * of the app.
         * </pre>
         *
         * <code>repeated string pagecat = 6;</code>
         * @return This builder for chaining.
         */
        public Builder clearPagecat() {
          pagecat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
          bitField0_ = (bitField0_ & ~0x00000040);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the current page or view
         * of the app.
         * </pre>
         *
         * <code>repeated string pagecat = 6;</code>
         * @param value The bytes of the pagecat to add.
         * @return This builder for chaining.
         */
        public Builder addPagecatBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  ensurePagecatIsMutable();
          pagecat_.add(value);
          onChanged();
          return this;
        }

        private java.lang.Object ver_ = "";
        /**
         * <pre>
         * Application version.
         * </pre>
         *
         * <code>optional string ver = 7;</code>
         * @return Whether the ver field is set.
         */
        public boolean hasVer() {
          return ((bitField0_ & 0x00000080) != 0);
        }
        /**
         * <pre>
         * Application version.
         * </pre>
         *
         * <code>optional string ver = 7;</code>
         * @return The ver.
         */
        public java.lang.String getVer() {
          java.lang.Object ref = ver_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              ver_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Application version.
         * </pre>
         *
         * <code>optional string ver = 7;</code>
         * @return The bytes for ver.
         */
        public com.google.protobuf.ByteString
            getVerBytes() {
          java.lang.Object ref = ver_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            ver_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Application version.
         * </pre>
         *
         * <code>optional string ver = 7;</code>
         * @param value The ver to set.
         * @return This builder for chaining.
         */
        public Builder setVer(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000080;
          ver_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Application version.
         * </pre>
         *
         * <code>optional string ver = 7;</code>
         * @return This builder for chaining.
         */
        public Builder clearVer() {
          bitField0_ = (bitField0_ & ~0x00000080);
          ver_ = getDefaultInstance().getVer();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Application version.
         * </pre>
         *
         * <code>optional string ver = 7;</code>
         * @param value The bytes for ver to set.
         * @return This builder for chaining.
         */
        public Builder setVerBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000080;
          ver_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object bundle_ = "";
        /**
         * <pre>
         * A platform-specific application identifier intended to be
         * unique to the app and independent of the exchange. On Android,
         * this should be a bundle or package name (e.g., com.foo.mygame).
         * On iOS, it is a numeric ID. For SDK-less requests (mostly from connected
         * TVs), it can be provided by the publisher directly in the request.
         * </pre>
         *
         * <code>optional string bundle = 8;</code>
         * @return Whether the bundle field is set.
         */
        public boolean hasBundle() {
          return ((bitField0_ & 0x00000100) != 0);
        }
        /**
         * <pre>
         * A platform-specific application identifier intended to be
         * unique to the app and independent of the exchange. On Android,
         * this should be a bundle or package name (e.g., com.foo.mygame).
         * On iOS, it is a numeric ID. For SDK-less requests (mostly from connected
         * TVs), it can be provided by the publisher directly in the request.
         * </pre>
         *
         * <code>optional string bundle = 8;</code>
         * @return The bundle.
         */
        public java.lang.String getBundle() {
          java.lang.Object ref = bundle_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              bundle_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * A platform-specific application identifier intended to be
         * unique to the app and independent of the exchange. On Android,
         * this should be a bundle or package name (e.g., com.foo.mygame).
         * On iOS, it is a numeric ID. For SDK-less requests (mostly from connected
         * TVs), it can be provided by the publisher directly in the request.
         * </pre>
         *
         * <code>optional string bundle = 8;</code>
         * @return The bytes for bundle.
         */
        public com.google.protobuf.ByteString
            getBundleBytes() {
          java.lang.Object ref = bundle_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            bundle_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * A platform-specific application identifier intended to be
         * unique to the app and independent of the exchange. On Android,
         * this should be a bundle or package name (e.g., com.foo.mygame).
         * On iOS, it is a numeric ID. For SDK-less requests (mostly from connected
         * TVs), it can be provided by the publisher directly in the request.
         * </pre>
         *
         * <code>optional string bundle = 8;</code>
         * @param value The bundle to set.
         * @return This builder for chaining.
         */
        public Builder setBundle(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000100;
          bundle_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * A platform-specific application identifier intended to be
         * unique to the app and independent of the exchange. On Android,
         * this should be a bundle or package name (e.g., com.foo.mygame).
         * On iOS, it is a numeric ID. For SDK-less requests (mostly from connected
         * TVs), it can be provided by the publisher directly in the request.
         * </pre>
         *
         * <code>optional string bundle = 8;</code>
         * @return This builder for chaining.
         */
        public Builder clearBundle() {
          bitField0_ = (bitField0_ & ~0x00000100);
          bundle_ = getDefaultInstance().getBundle();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * A platform-specific application identifier intended to be
         * unique to the app and independent of the exchange. On Android,
         * this should be a bundle or package name (e.g., com.foo.mygame).
         * On iOS, it is a numeric ID. For SDK-less requests (mostly from connected
         * TVs), it can be provided by the publisher directly in the request.
         * </pre>
         *
         * <code>optional string bundle = 8;</code>
         * @param value The bytes for bundle to set.
         * @return This builder for chaining.
         */
        public Builder setBundleBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000100;
          bundle_ = value;
          onChanged();
          return this;
        }

        private boolean privacypolicy_ ;
        /**
         * <pre>
         * Indicates if the app has a privacy policy, where 0 = no, 1 = yes.
         * </pre>
         *
         * <code>optional bool privacypolicy = 9;</code>
         * @return Whether the privacypolicy field is set.
         */
        @java.lang.Override
        public boolean hasPrivacypolicy() {
          return ((bitField0_ & 0x00000200) != 0);
        }
        /**
         * <pre>
         * Indicates if the app has a privacy policy, where 0 = no, 1 = yes.
         * </pre>
         *
         * <code>optional bool privacypolicy = 9;</code>
         * @return The privacypolicy.
         */
        @java.lang.Override
        public boolean getPrivacypolicy() {
          return privacypolicy_;
        }
        /**
         * <pre>
         * Indicates if the app has a privacy policy, where 0 = no, 1 = yes.
         * </pre>
         *
         * <code>optional bool privacypolicy = 9;</code>
         * @param value The privacypolicy to set.
         * @return This builder for chaining.
         */
        public Builder setPrivacypolicy(boolean value) {
          bitField0_ |= 0x00000200;
          privacypolicy_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Indicates if the app has a privacy policy, where 0 = no, 1 = yes.
         * </pre>
         *
         * <code>optional bool privacypolicy = 9;</code>
         * @return This builder for chaining.
         */
        public Builder clearPrivacypolicy() {
          bitField0_ = (bitField0_ & ~0x00000200);
          privacypolicy_ = false;
          onChanged();
          return this;
        }

        private boolean paid_ ;
        /**
         * <pre>
         * 0 = app is free, 1 = the app is a paid version.
         * </pre>
         *
         * <code>optional bool paid = 10;</code>
         * @return Whether the paid field is set.
         */
        @java.lang.Override
        public boolean hasPaid() {
          return ((bitField0_ & 0x00000400) != 0);
        }
        /**
         * <pre>
         * 0 = app is free, 1 = the app is a paid version.
         * </pre>
         *
         * <code>optional bool paid = 10;</code>
         * @return The paid.
         */
        @java.lang.Override
        public boolean getPaid() {
          return paid_;
        }
        /**
         * <pre>
         * 0 = app is free, 1 = the app is a paid version.
         * </pre>
         *
         * <code>optional bool paid = 10;</code>
         * @param value The paid to set.
         * @return This builder for chaining.
         */
        public Builder setPaid(boolean value) {
          bitField0_ |= 0x00000400;
          paid_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * 0 = app is free, 1 = the app is a paid version.
         * </pre>
         *
         * <code>optional bool paid = 10;</code>
         * @return This builder for chaining.
         */
        public Builder clearPaid() {
          bitField0_ = (bitField0_ & ~0x00000400);
          paid_ = false;
          onChanged();
          return this;
        }

        private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher publisher_;
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.PublisherOrBuilder> publisherBuilder_;
        /**
         * <pre>
         * Details about the Publisher (Section 3.2.8) of the app.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Publisher publisher = 11;</code>
         * @return Whether the publisher field is set.
         */
        public boolean hasPublisher() {
          return ((bitField0_ & 0x00000800) != 0);
        }
        /**
         * <pre>
         * Details about the Publisher (Section 3.2.8) of the app.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Publisher publisher = 11;</code>
         * @return The publisher.
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher getPublisher() {
          if (publisherBuilder_ == null) {
            return publisher_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher.getDefaultInstance() : publisher_;
          } else {
            return publisherBuilder_.getMessage();
          }
        }
        /**
         * <pre>
         * Details about the Publisher (Section 3.2.8) of the app.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Publisher publisher = 11;</code>
         */
        public Builder setPublisher(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher value) {
          if (publisherBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            publisher_ = value;
            onChanged();
          } else {
            publisherBuilder_.setMessage(value);
          }
          bitField0_ |= 0x00000800;
          return this;
        }
        /**
         * <pre>
         * Details about the Publisher (Section 3.2.8) of the app.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Publisher publisher = 11;</code>
         */
        public Builder setPublisher(
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher.Builder builderForValue) {
          if (publisherBuilder_ == null) {
            publisher_ = builderForValue.build();
            onChanged();
          } else {
            publisherBuilder_.setMessage(builderForValue.build());
          }
          bitField0_ |= 0x00000800;
          return this;
        }
        /**
         * <pre>
         * Details about the Publisher (Section 3.2.8) of the app.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Publisher publisher = 11;</code>
         */
        public Builder mergePublisher(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher value) {
          if (publisherBuilder_ == null) {
            if (((bitField0_ & 0x00000800) != 0) &&
                publisher_ != null &&
                publisher_ != com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher.getDefaultInstance()) {
              publisher_ =
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher.newBuilder(publisher_).mergeFrom(value).buildPartial();
            } else {
              publisher_ = value;
            }
            onChanged();
          } else {
            publisherBuilder_.mergeFrom(value);
          }
          bitField0_ |= 0x00000800;
          return this;
        }
        /**
         * <pre>
         * Details about the Publisher (Section 3.2.8) of the app.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Publisher publisher = 11;</code>
         */
        public Builder clearPublisher() {
          if (publisherBuilder_ == null) {
            publisher_ = null;
            onChanged();
          } else {
            publisherBuilder_.clear();
          }
          bitField0_ = (bitField0_ & ~0x00000800);
          return this;
        }
        /**
         * <pre>
         * Details about the Publisher (Section 3.2.8) of the app.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Publisher publisher = 11;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher.Builder getPublisherBuilder() {
          bitField0_ |= 0x00000800;
          onChanged();
          return getPublisherFieldBuilder().getBuilder();
        }
        /**
         * <pre>
         * Details about the Publisher (Section 3.2.8) of the app.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Publisher publisher = 11;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.PublisherOrBuilder getPublisherOrBuilder() {
          if (publisherBuilder_ != null) {
            return publisherBuilder_.getMessageOrBuilder();
          } else {
            return publisher_ == null ?
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher.getDefaultInstance() : publisher_;
          }
        }
        /**
         * <pre>
         * Details about the Publisher (Section 3.2.8) of the app.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Publisher publisher = 11;</code>
         */
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.PublisherOrBuilder> 
            getPublisherFieldBuilder() {
          if (publisherBuilder_ == null) {
            publisherBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.PublisherOrBuilder>(
                    getPublisher(),
                    getParentForChildren(),
                    isClean());
            publisher_ = null;
          }
          return publisherBuilder_;
        }

        private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content content_;
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.ContentOrBuilder> contentBuilder_;
        /**
         * <pre>
         * Details about the Content (Section 3.2.9) within the app.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Content content = 12;</code>
         * @return Whether the content field is set.
         */
        public boolean hasContent() {
          return ((bitField0_ & 0x00001000) != 0);
        }
        /**
         * <pre>
         * Details about the Content (Section 3.2.9) within the app.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Content content = 12;</code>
         * @return The content.
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content getContent() {
          if (contentBuilder_ == null) {
            return content_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content.getDefaultInstance() : content_;
          } else {
            return contentBuilder_.getMessage();
          }
        }
        /**
         * <pre>
         * Details about the Content (Section 3.2.9) within the app.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Content content = 12;</code>
         */
        public Builder setContent(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content value) {
          if (contentBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            content_ = value;
            onChanged();
          } else {
            contentBuilder_.setMessage(value);
          }
          bitField0_ |= 0x00001000;
          return this;
        }
        /**
         * <pre>
         * Details about the Content (Section 3.2.9) within the app.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Content content = 12;</code>
         */
        public Builder setContent(
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content.Builder builderForValue) {
          if (contentBuilder_ == null) {
            content_ = builderForValue.build();
            onChanged();
          } else {
            contentBuilder_.setMessage(builderForValue.build());
          }
          bitField0_ |= 0x00001000;
          return this;
        }
        /**
         * <pre>
         * Details about the Content (Section 3.2.9) within the app.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Content content = 12;</code>
         */
        public Builder mergeContent(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content value) {
          if (contentBuilder_ == null) {
            if (((bitField0_ & 0x00001000) != 0) &&
                content_ != null &&
                content_ != com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content.getDefaultInstance()) {
              content_ =
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content.newBuilder(content_).mergeFrom(value).buildPartial();
            } else {
              content_ = value;
            }
            onChanged();
          } else {
            contentBuilder_.mergeFrom(value);
          }
          bitField0_ |= 0x00001000;
          return this;
        }
        /**
         * <pre>
         * Details about the Content (Section 3.2.9) within the app.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Content content = 12;</code>
         */
        public Builder clearContent() {
          if (contentBuilder_ == null) {
            content_ = null;
            onChanged();
          } else {
            contentBuilder_.clear();
          }
          bitField0_ = (bitField0_ & ~0x00001000);
          return this;
        }
        /**
         * <pre>
         * Details about the Content (Section 3.2.9) within the app.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Content content = 12;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content.Builder getContentBuilder() {
          bitField0_ |= 0x00001000;
          onChanged();
          return getContentFieldBuilder().getBuilder();
        }
        /**
         * <pre>
         * Details about the Content (Section 3.2.9) within the app.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Content content = 12;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.ContentOrBuilder getContentOrBuilder() {
          if (contentBuilder_ != null) {
            return contentBuilder_.getMessageOrBuilder();
          } else {
            return content_ == null ?
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content.getDefaultInstance() : content_;
          }
        }
        /**
         * <pre>
         * Details about the Content (Section 3.2.9) within the app.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Content content = 12;</code>
         */
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.ContentOrBuilder> 
            getContentFieldBuilder() {
          if (contentBuilder_ == null) {
            contentBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.ContentOrBuilder>(
                    getContent(),
                    getParentForChildren(),
                    isClean());
            content_ = null;
          }
          return contentBuilder_;
        }

        private java.lang.Object keywords_ = "";
        /**
         * <pre>
         * Comma separated list of keywords about the app.
         * </pre>
         *
         * <code>optional string keywords = 13;</code>
         * @return Whether the keywords field is set.
         */
        public boolean hasKeywords() {
          return ((bitField0_ & 0x00002000) != 0);
        }
        /**
         * <pre>
         * Comma separated list of keywords about the app.
         * </pre>
         *
         * <code>optional string keywords = 13;</code>
         * @return The keywords.
         */
        public java.lang.String getKeywords() {
          java.lang.Object ref = keywords_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              keywords_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Comma separated list of keywords about the app.
         * </pre>
         *
         * <code>optional string keywords = 13;</code>
         * @return The bytes for keywords.
         */
        public com.google.protobuf.ByteString
            getKeywordsBytes() {
          java.lang.Object ref = keywords_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            keywords_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Comma separated list of keywords about the app.
         * </pre>
         *
         * <code>optional string keywords = 13;</code>
         * @param value The keywords to set.
         * @return This builder for chaining.
         */
        public Builder setKeywords(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00002000;
          keywords_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Comma separated list of keywords about the app.
         * </pre>
         *
         * <code>optional string keywords = 13;</code>
         * @return This builder for chaining.
         */
        public Builder clearKeywords() {
          bitField0_ = (bitField0_ & ~0x00002000);
          keywords_ = getDefaultInstance().getKeywords();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Comma separated list of keywords about the app.
         * </pre>
         *
         * <code>optional string keywords = 13;</code>
         * @param value The bytes for keywords to set.
         * @return This builder for chaining.
         */
        public Builder setKeywordsBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00002000;
          keywords_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object storeurl_ = "";
        /**
         * <pre>
         * App store URL for an installed app; for QAG 1.5 compliance.
         * </pre>
         *
         * <code>optional string storeurl = 16;</code>
         * @return Whether the storeurl field is set.
         */
        public boolean hasStoreurl() {
          return ((bitField0_ & 0x00004000) != 0);
        }
        /**
         * <pre>
         * App store URL for an installed app; for QAG 1.5 compliance.
         * </pre>
         *
         * <code>optional string storeurl = 16;</code>
         * @return The storeurl.
         */
        public java.lang.String getStoreurl() {
          java.lang.Object ref = storeurl_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              storeurl_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * App store URL for an installed app; for QAG 1.5 compliance.
         * </pre>
         *
         * <code>optional string storeurl = 16;</code>
         * @return The bytes for storeurl.
         */
        public com.google.protobuf.ByteString
            getStoreurlBytes() {
          java.lang.Object ref = storeurl_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            storeurl_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * App store URL for an installed app; for QAG 1.5 compliance.
         * </pre>
         *
         * <code>optional string storeurl = 16;</code>
         * @param value The storeurl to set.
         * @return This builder for chaining.
         */
        public Builder setStoreurl(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00004000;
          storeurl_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * App store URL for an installed app; for QAG 1.5 compliance.
         * </pre>
         *
         * <code>optional string storeurl = 16;</code>
         * @return This builder for chaining.
         */
        public Builder clearStoreurl() {
          bitField0_ = (bitField0_ & ~0x00004000);
          storeurl_ = getDefaultInstance().getStoreurl();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * App store URL for an installed app; for QAG 1.5 compliance.
         * </pre>
         *
         * <code>optional string storeurl = 16;</code>
         * @param value The bytes for storeurl to set.
         * @return This builder for chaining.
         */
        public Builder setStoreurlBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00004000;
          storeurl_ = value;
          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:com.iabtechlab.openrtb.v2.BidRequest.App)
      }

      // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.BidRequest.App)
      private static final com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App DEFAULT_INSTANCE;
      static {
        DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App();
      }

      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App getDefaultInstance() {
        return DEFAULT_INSTANCE;
      }

      @java.lang.Deprecated public static final com.google.protobuf.Parser<App>
          PARSER = new com.google.protobuf.AbstractParser<App>() {
        @java.lang.Override
        public App parsePartialFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return new App(input, extensionRegistry);
        }
      };

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

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

      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App getDefaultInstanceForType() {
        return DEFAULT_INSTANCE;
      }

    }

    public interface DoohOrBuilder extends
        // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.BidRequest.Dooh)
        com.google.protobuf.GeneratedMessageV3.
            ExtendableMessageOrBuilder<Dooh> {

      /**
       * <pre>
       * Exchange provided id for a placement or logical grouping of placements.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return Whether the id field is set.
       */
      boolean hasId();
      /**
       * <pre>
       * Exchange provided id for a placement or logical grouping of placements.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return The id.
       */
      java.lang.String getId();
      /**
       * <pre>
       * Exchange provided id for a placement or logical grouping of placements.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return The bytes for id.
       */
      com.google.protobuf.ByteString
          getIdBytes();

      /**
       * <pre>
       * Name of the DOOH placement.
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return Whether the name field is set.
       */
      boolean hasName();
      /**
       * <pre>
       * Name of the DOOH placement.
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return The name.
       */
      java.lang.String getName();
      /**
       * <pre>
       * Name of the DOOH placement.
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return The bytes for name.
       */
      com.google.protobuf.ByteString
          getNameBytes();

      /**
       * <pre>
       * The type of out-of-home venue. The taxonomy to be used is defined by the
       * venuetax field. If no venuetax field is supplied, The OpenOOH Venue
       * Taxonomy is assumed.
       * </pre>
       *
       * <code>repeated string venuetype = 3;</code>
       * @return A list containing the venuetype.
       */
      java.util.List<java.lang.String>
          getVenuetypeList();
      /**
       * <pre>
       * The type of out-of-home venue. The taxonomy to be used is defined by the
       * venuetax field. If no venuetax field is supplied, The OpenOOH Venue
       * Taxonomy is assumed.
       * </pre>
       *
       * <code>repeated string venuetype = 3;</code>
       * @return The count of venuetype.
       */
      int getVenuetypeCount();
      /**
       * <pre>
       * The type of out-of-home venue. The taxonomy to be used is defined by the
       * venuetax field. If no venuetax field is supplied, The OpenOOH Venue
       * Taxonomy is assumed.
       * </pre>
       *
       * <code>repeated string venuetype = 3;</code>
       * @param index The index of the element to return.
       * @return The venuetype at the given index.
       */
      java.lang.String getVenuetype(int index);
      /**
       * <pre>
       * The type of out-of-home venue. The taxonomy to be used is defined by the
       * venuetax field. If no venuetax field is supplied, The OpenOOH Venue
       * Taxonomy is assumed.
       * </pre>
       *
       * <code>repeated string venuetype = 3;</code>
       * @param index The index of the value to return.
       * @return The bytes of the venuetype at the given index.
       */
      com.google.protobuf.ByteString
          getVenuetypeBytes(int index);

      /**
       * <pre>
       * The venue taxonomy in use.
       * </pre>
       *
       * <code>optional int32 venuetypetax = 4 [default = 1];</code>
       * @return Whether the venuetypetax field is set.
       */
      boolean hasVenuetypetax();
      /**
       * <pre>
       * The venue taxonomy in use.
       * </pre>
       *
       * <code>optional int32 venuetypetax = 4 [default = 1];</code>
       * @return The venuetypetax.
       */
      int getVenuetypetax();

      /**
       * <pre>
       * Details about the publisher of the placement.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Publisher publisher = 5;</code>
       * @return Whether the publisher field is set.
       */
      boolean hasPublisher();
      /**
       * <pre>
       * Details about the publisher of the placement.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Publisher publisher = 5;</code>
       * @return The publisher.
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher getPublisher();
      /**
       * <pre>
       * Details about the publisher of the placement.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Publisher publisher = 5;</code>
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.PublisherOrBuilder getPublisherOrBuilder();

      /**
       * <pre>
       * Domain of the inventory owner (e.g., "mysite.foo.com").
       * </pre>
       *
       * <code>optional string domain = 6;</code>
       * @return Whether the domain field is set.
       */
      boolean hasDomain();
      /**
       * <pre>
       * Domain of the inventory owner (e.g., "mysite.foo.com").
       * </pre>
       *
       * <code>optional string domain = 6;</code>
       * @return The domain.
       */
      java.lang.String getDomain();
      /**
       * <pre>
       * Domain of the inventory owner (e.g., "mysite.foo.com").
       * </pre>
       *
       * <code>optional string domain = 6;</code>
       * @return The bytes for domain.
       */
      com.google.protobuf.ByteString
          getDomainBytes();

      /**
       * <pre>
       * Comma separated list of keywords about the DOOH placement.
       * </pre>
       *
       * <code>optional string keywords = 7;</code>
       * @return Whether the keywords field is set.
       */
      boolean hasKeywords();
      /**
       * <pre>
       * Comma separated list of keywords about the DOOH placement.
       * </pre>
       *
       * <code>optional string keywords = 7;</code>
       * @return The keywords.
       */
      java.lang.String getKeywords();
      /**
       * <pre>
       * Comma separated list of keywords about the DOOH placement.
       * </pre>
       *
       * <code>optional string keywords = 7;</code>
       * @return The bytes for keywords.
       */
      com.google.protobuf.ByteString
          getKeywordsBytes();

      /**
       * <pre>
       * Details about the Content within the DOOH placement.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Content content = 8;</code>
       * @return Whether the content field is set.
       */
      boolean hasContent();
      /**
       * <pre>
       * Details about the Content within the DOOH placement.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Content content = 8;</code>
       * @return The content.
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content getContent();
      /**
       * <pre>
       * Details about the Content within the DOOH placement.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Content content = 8;</code>
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.ContentOrBuilder getContentOrBuilder();
    }
    /**
     * <pre>
     * This object should be included if the ad supported content is a Digital
     * Out-Of-Home screen. A bid request with a DOOH object must not contain a
     * site or app object. At a minimum, it is useful to provide id and/or
     * venuetypeid, but this is not strictly required.
     * </pre>
     *
     * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Dooh}
     */
    public static final class Dooh extends
        com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
          Dooh> implements
        // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.BidRequest.Dooh)
        DoohOrBuilder {
    private static final long serialVersionUID = 0L;
      // Use Dooh.newBuilder() to construct.
      private Dooh(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh, ?> builder) {
        super(builder);
      }
      private Dooh() {
        id_ = "";
        name_ = "";
        venuetype_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        venuetypetax_ = 1;
        domain_ = "";
        keywords_ = "";
      }

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

      @java.lang.Override
      public final com.google.protobuf.UnknownFieldSet
      getUnknownFields() {
        return this.unknownFields;
      }
      private Dooh(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        this();
        if (extensionRegistry == null) {
          throw new java.lang.NullPointerException();
        }
        int mutable_bitField0_ = 0;
        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
            com.google.protobuf.UnknownFieldSet.newBuilder();
        try {
          boolean done = false;
          while (!done) {
            int tag = input.readTag();
            switch (tag) {
              case 0:
                done = true;
                break;
              case 10: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000001;
                id_ = bs;
                break;
              }
              case 18: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000002;
                name_ = bs;
                break;
              }
              case 26: {
                com.google.protobuf.ByteString bs = input.readBytes();
                if (!((mutable_bitField0_ & 0x00000004) != 0)) {
                  venuetype_ = new com.google.protobuf.LazyStringArrayList();
                  mutable_bitField0_ |= 0x00000004;
                }
                venuetype_.add(bs);
                break;
              }
              case 32: {
                bitField0_ |= 0x00000004;
                venuetypetax_ = input.readInt32();
                break;
              }
              case 42: {
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher.Builder subBuilder = null;
                if (((bitField0_ & 0x00000008) != 0)) {
                  subBuilder = publisher_.toBuilder();
                }
                publisher_ = input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher.PARSER, extensionRegistry);
                if (subBuilder != null) {
                  subBuilder.mergeFrom(publisher_);
                  publisher_ = subBuilder.buildPartial();
                }
                bitField0_ |= 0x00000008;
                break;
              }
              case 50: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000010;
                domain_ = bs;
                break;
              }
              case 58: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000020;
                keywords_ = bs;
                break;
              }
              case 66: {
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content.Builder subBuilder = null;
                if (((bitField0_ & 0x00000040) != 0)) {
                  subBuilder = content_.toBuilder();
                }
                content_ = input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content.PARSER, extensionRegistry);
                if (subBuilder != null) {
                  subBuilder.mergeFrom(content_);
                  content_ = subBuilder.buildPartial();
                }
                bitField0_ |= 0x00000040;
                break;
              }
              default: {
                if (!parseUnknownField(
                    input, unknownFields, extensionRegistry, tag)) {
                  done = true;
                }
                break;
              }
            }
          }
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          throw e.setUnfinishedMessage(this);
        } catch (java.io.IOException e) {
          throw new com.google.protobuf.InvalidProtocolBufferException(
              e).setUnfinishedMessage(this);
        } finally {
          if (((mutable_bitField0_ & 0x00000004) != 0)) {
            venuetype_ = venuetype_.getUnmodifiableView();
          }
          this.unknownFields = unknownFields.build();
          makeExtensionsImmutable();
        }
      }
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Dooh_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Dooh_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh.Builder.class);
      }

      private int bitField0_;
      public static final int ID_FIELD_NUMBER = 1;
      private volatile java.lang.Object id_;
      /**
       * <pre>
       * Exchange provided id for a placement or logical grouping of placements.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return Whether the id field is set.
       */
      @java.lang.Override
      public boolean hasId() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <pre>
       * Exchange provided id for a placement or logical grouping of placements.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return The id.
       */
      @java.lang.Override
      public java.lang.String getId() {
        java.lang.Object ref = id_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            id_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Exchange provided id for a placement or logical grouping of placements.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return The bytes for id.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getIdBytes() {
        java.lang.Object ref = id_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          id_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int NAME_FIELD_NUMBER = 2;
      private volatile java.lang.Object name_;
      /**
       * <pre>
       * Name of the DOOH placement.
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return Whether the name field is set.
       */
      @java.lang.Override
      public boolean hasName() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <pre>
       * Name of the DOOH placement.
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return The name.
       */
      @java.lang.Override
      public java.lang.String getName() {
        java.lang.Object ref = name_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            name_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Name of the DOOH placement.
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return The bytes for name.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getNameBytes() {
        java.lang.Object ref = name_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          name_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int VENUETYPE_FIELD_NUMBER = 3;
      private com.google.protobuf.LazyStringList venuetype_;
      /**
       * <pre>
       * The type of out-of-home venue. The taxonomy to be used is defined by the
       * venuetax field. If no venuetax field is supplied, The OpenOOH Venue
       * Taxonomy is assumed.
       * </pre>
       *
       * <code>repeated string venuetype = 3;</code>
       * @return A list containing the venuetype.
       */
      public com.google.protobuf.ProtocolStringList
          getVenuetypeList() {
        return venuetype_;
      }
      /**
       * <pre>
       * The type of out-of-home venue. The taxonomy to be used is defined by the
       * venuetax field. If no venuetax field is supplied, The OpenOOH Venue
       * Taxonomy is assumed.
       * </pre>
       *
       * <code>repeated string venuetype = 3;</code>
       * @return The count of venuetype.
       */
      public int getVenuetypeCount() {
        return venuetype_.size();
      }
      /**
       * <pre>
       * The type of out-of-home venue. The taxonomy to be used is defined by the
       * venuetax field. If no venuetax field is supplied, The OpenOOH Venue
       * Taxonomy is assumed.
       * </pre>
       *
       * <code>repeated string venuetype = 3;</code>
       * @param index The index of the element to return.
       * @return The venuetype at the given index.
       */
      public java.lang.String getVenuetype(int index) {
        return venuetype_.get(index);
      }
      /**
       * <pre>
       * The type of out-of-home venue. The taxonomy to be used is defined by the
       * venuetax field. If no venuetax field is supplied, The OpenOOH Venue
       * Taxonomy is assumed.
       * </pre>
       *
       * <code>repeated string venuetype = 3;</code>
       * @param index The index of the value to return.
       * @return The bytes of the venuetype at the given index.
       */
      public com.google.protobuf.ByteString
          getVenuetypeBytes(int index) {
        return venuetype_.getByteString(index);
      }

      public static final int VENUETYPETAX_FIELD_NUMBER = 4;
      private int venuetypetax_;
      /**
       * <pre>
       * The venue taxonomy in use.
       * </pre>
       *
       * <code>optional int32 venuetypetax = 4 [default = 1];</code>
       * @return Whether the venuetypetax field is set.
       */
      @java.lang.Override
      public boolean hasVenuetypetax() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <pre>
       * The venue taxonomy in use.
       * </pre>
       *
       * <code>optional int32 venuetypetax = 4 [default = 1];</code>
       * @return The venuetypetax.
       */
      @java.lang.Override
      public int getVenuetypetax() {
        return venuetypetax_;
      }

      public static final int PUBLISHER_FIELD_NUMBER = 5;
      private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher publisher_;
      /**
       * <pre>
       * Details about the publisher of the placement.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Publisher publisher = 5;</code>
       * @return Whether the publisher field is set.
       */
      @java.lang.Override
      public boolean hasPublisher() {
        return ((bitField0_ & 0x00000008) != 0);
      }
      /**
       * <pre>
       * Details about the publisher of the placement.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Publisher publisher = 5;</code>
       * @return The publisher.
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher getPublisher() {
        return publisher_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher.getDefaultInstance() : publisher_;
      }
      /**
       * <pre>
       * Details about the publisher of the placement.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Publisher publisher = 5;</code>
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.PublisherOrBuilder getPublisherOrBuilder() {
        return publisher_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher.getDefaultInstance() : publisher_;
      }

      public static final int DOMAIN_FIELD_NUMBER = 6;
      private volatile java.lang.Object domain_;
      /**
       * <pre>
       * Domain of the inventory owner (e.g., "mysite.foo.com").
       * </pre>
       *
       * <code>optional string domain = 6;</code>
       * @return Whether the domain field is set.
       */
      @java.lang.Override
      public boolean hasDomain() {
        return ((bitField0_ & 0x00000010) != 0);
      }
      /**
       * <pre>
       * Domain of the inventory owner (e.g., "mysite.foo.com").
       * </pre>
       *
       * <code>optional string domain = 6;</code>
       * @return The domain.
       */
      @java.lang.Override
      public java.lang.String getDomain() {
        java.lang.Object ref = domain_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            domain_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Domain of the inventory owner (e.g., "mysite.foo.com").
       * </pre>
       *
       * <code>optional string domain = 6;</code>
       * @return The bytes for domain.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getDomainBytes() {
        java.lang.Object ref = domain_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          domain_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int KEYWORDS_FIELD_NUMBER = 7;
      private volatile java.lang.Object keywords_;
      /**
       * <pre>
       * Comma separated list of keywords about the DOOH placement.
       * </pre>
       *
       * <code>optional string keywords = 7;</code>
       * @return Whether the keywords field is set.
       */
      @java.lang.Override
      public boolean hasKeywords() {
        return ((bitField0_ & 0x00000020) != 0);
      }
      /**
       * <pre>
       * Comma separated list of keywords about the DOOH placement.
       * </pre>
       *
       * <code>optional string keywords = 7;</code>
       * @return The keywords.
       */
      @java.lang.Override
      public java.lang.String getKeywords() {
        java.lang.Object ref = keywords_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            keywords_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Comma separated list of keywords about the DOOH placement.
       * </pre>
       *
       * <code>optional string keywords = 7;</code>
       * @return The bytes for keywords.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getKeywordsBytes() {
        java.lang.Object ref = keywords_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          keywords_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int CONTENT_FIELD_NUMBER = 8;
      private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content content_;
      /**
       * <pre>
       * Details about the Content within the DOOH placement.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Content content = 8;</code>
       * @return Whether the content field is set.
       */
      @java.lang.Override
      public boolean hasContent() {
        return ((bitField0_ & 0x00000040) != 0);
      }
      /**
       * <pre>
       * Details about the Content within the DOOH placement.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Content content = 8;</code>
       * @return The content.
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content getContent() {
        return content_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content.getDefaultInstance() : content_;
      }
      /**
       * <pre>
       * Details about the Content within the DOOH placement.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Content content = 8;</code>
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.ContentOrBuilder getContentOrBuilder() {
        return content_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content.getDefaultInstance() : content_;
      }

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

        if (hasPublisher()) {
          if (!getPublisher().isInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
        }
        if (hasContent()) {
          if (!getContent().isInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
        }
        if (!extensionsAreInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
        memoizedIsInitialized = 1;
        return true;
      }

      @java.lang.Override
      public void writeTo(com.google.protobuf.CodedOutputStream output)
                          throws java.io.IOException {
        com.google.protobuf.GeneratedMessageV3
          .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh>.ExtensionWriter
            extensionWriter = newExtensionWriter();
        if (((bitField0_ & 0x00000001) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 1, id_);
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 2, name_);
        }
        for (int i = 0; i < venuetype_.size(); i++) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 3, venuetype_.getRaw(i));
        }
        if (((bitField0_ & 0x00000004) != 0)) {
          output.writeInt32(4, venuetypetax_);
        }
        if (((bitField0_ & 0x00000008) != 0)) {
          output.writeMessage(5, getPublisher());
        }
        if (((bitField0_ & 0x00000010) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 6, domain_);
        }
        if (((bitField0_ & 0x00000020) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 7, keywords_);
        }
        if (((bitField0_ & 0x00000040) != 0)) {
          output.writeMessage(8, getContent());
        }
        extensionWriter.writeUntil(10000, output);
        unknownFields.writeTo(output);
      }

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

        size = 0;
        if (((bitField0_ & 0x00000001) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, id_);
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, name_);
        }
        {
          int dataSize = 0;
          for (int i = 0; i < venuetype_.size(); i++) {
            dataSize += computeStringSizeNoTag(venuetype_.getRaw(i));
          }
          size += dataSize;
          size += 1 * getVenuetypeList().size();
        }
        if (((bitField0_ & 0x00000004) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeInt32Size(4, venuetypetax_);
        }
        if (((bitField0_ & 0x00000008) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeMessageSize(5, getPublisher());
        }
        if (((bitField0_ & 0x00000010) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(6, domain_);
        }
        if (((bitField0_ & 0x00000020) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(7, keywords_);
        }
        if (((bitField0_ & 0x00000040) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeMessageSize(8, getContent());
        }
        size += extensionsSerializedSize();
        size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh)) {
          return super.equals(obj);
        }
        com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh other = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh) obj;

        if (hasId() != other.hasId()) return false;
        if (hasId()) {
          if (!getId()
              .equals(other.getId())) return false;
        }
        if (hasName() != other.hasName()) return false;
        if (hasName()) {
          if (!getName()
              .equals(other.getName())) return false;
        }
        if (!getVenuetypeList()
            .equals(other.getVenuetypeList())) return false;
        if (hasVenuetypetax() != other.hasVenuetypetax()) return false;
        if (hasVenuetypetax()) {
          if (getVenuetypetax()
              != other.getVenuetypetax()) return false;
        }
        if (hasPublisher() != other.hasPublisher()) return false;
        if (hasPublisher()) {
          if (!getPublisher()
              .equals(other.getPublisher())) return false;
        }
        if (hasDomain() != other.hasDomain()) return false;
        if (hasDomain()) {
          if (!getDomain()
              .equals(other.getDomain())) return false;
        }
        if (hasKeywords() != other.hasKeywords()) return false;
        if (hasKeywords()) {
          if (!getKeywords()
              .equals(other.getKeywords())) return false;
        }
        if (hasContent() != other.hasContent()) return false;
        if (hasContent()) {
          if (!getContent()
              .equals(other.getContent())) return false;
        }
        if (!unknownFields.equals(other.unknownFields)) return false;
        if (!getExtensionFields().equals(other.getExtensionFields()))
          return false;
        return true;
      }

      @java.lang.Override
      public int hashCode() {
        if (memoizedHashCode != 0) {
          return memoizedHashCode;
        }
        int hash = 41;
        hash = (19 * hash) + getDescriptor().hashCode();
        if (hasId()) {
          hash = (37 * hash) + ID_FIELD_NUMBER;
          hash = (53 * hash) + getId().hashCode();
        }
        if (hasName()) {
          hash = (37 * hash) + NAME_FIELD_NUMBER;
          hash = (53 * hash) + getName().hashCode();
        }
        if (getVenuetypeCount() > 0) {
          hash = (37 * hash) + VENUETYPE_FIELD_NUMBER;
          hash = (53 * hash) + getVenuetypeList().hashCode();
        }
        if (hasVenuetypetax()) {
          hash = (37 * hash) + VENUETYPETAX_FIELD_NUMBER;
          hash = (53 * hash) + getVenuetypetax();
        }
        if (hasPublisher()) {
          hash = (37 * hash) + PUBLISHER_FIELD_NUMBER;
          hash = (53 * hash) + getPublisher().hashCode();
        }
        if (hasDomain()) {
          hash = (37 * hash) + DOMAIN_FIELD_NUMBER;
          hash = (53 * hash) + getDomain().hashCode();
        }
        if (hasKeywords()) {
          hash = (37 * hash) + KEYWORDS_FIELD_NUMBER;
          hash = (53 * hash) + getKeywords().hashCode();
        }
        if (hasContent()) {
          hash = (37 * hash) + CONTENT_FIELD_NUMBER;
          hash = (53 * hash) + getContent().hashCode();
        }
        hash = hashFields(hash, getExtensionFields());
        hash = (29 * hash) + unknownFields.hashCode();
        memoizedHashCode = hash;
        return hash;
      }

      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh parseFrom(
          java.nio.ByteBuffer data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh parseFrom(
          java.nio.ByteBuffer data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh parseFrom(
          com.google.protobuf.ByteString data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh parseFrom(
          com.google.protobuf.ByteString data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh parseFrom(byte[] data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh parseFrom(
          byte[] data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh parseFrom(java.io.InputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh parseDelimitedFrom(java.io.InputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseDelimitedWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh parseFrom(
          com.google.protobuf.CodedInputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh 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>
       * This object should be included if the ad supported content is a Digital
       * Out-Of-Home screen. A bid request with a DOOH object must not contain a
       * site or app object. At a minimum, it is useful to provide id and/or
       * venuetypeid, but this is not strictly required.
       * </pre>
       *
       * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Dooh}
       */
      public static final class Builder extends
          com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh, Builder> implements
          // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.BidRequest.Dooh)
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.DoohOrBuilder {
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Dooh_descriptor;
        }

        @java.lang.Override
        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Dooh_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh.Builder.class);
        }

        // Construct using com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh.newBuilder()
        private Builder() {
          maybeForceBuilderInitialization();
        }

        private Builder(
            com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
          super(parent);
          maybeForceBuilderInitialization();
        }
        private void maybeForceBuilderInitialization() {
          if (com.google.protobuf.GeneratedMessageV3
                  .alwaysUseFieldBuilders) {
            getPublisherFieldBuilder();
            getContentFieldBuilder();
          }
        }
        @java.lang.Override
        public Builder clear() {
          super.clear();
          id_ = "";
          bitField0_ = (bitField0_ & ~0x00000001);
          name_ = "";
          bitField0_ = (bitField0_ & ~0x00000002);
          venuetype_ = com.google.protobuf.LazyStringArrayList.EMPTY;
          bitField0_ = (bitField0_ & ~0x00000004);
          venuetypetax_ = 1;
          bitField0_ = (bitField0_ & ~0x00000008);
          if (publisherBuilder_ == null) {
            publisher_ = null;
          } else {
            publisherBuilder_.clear();
          }
          bitField0_ = (bitField0_ & ~0x00000010);
          domain_ = "";
          bitField0_ = (bitField0_ & ~0x00000020);
          keywords_ = "";
          bitField0_ = (bitField0_ & ~0x00000040);
          if (contentBuilder_ == null) {
            content_ = null;
          } else {
            contentBuilder_.clear();
          }
          bitField0_ = (bitField0_ & ~0x00000080);
          return this;
        }

        @java.lang.Override
        public com.google.protobuf.Descriptors.Descriptor
            getDescriptorForType() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Dooh_descriptor;
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh getDefaultInstanceForType() {
          return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh.getDefaultInstance();
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh build() {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh result = buildPartial();
          if (!result.isInitialized()) {
            throw newUninitializedMessageException(result);
          }
          return result;
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh buildPartial() {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh result = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh(this);
          int from_bitField0_ = bitField0_;
          int to_bitField0_ = 0;
          if (((from_bitField0_ & 0x00000001) != 0)) {
            to_bitField0_ |= 0x00000001;
          }
          result.id_ = id_;
          if (((from_bitField0_ & 0x00000002) != 0)) {
            to_bitField0_ |= 0x00000002;
          }
          result.name_ = name_;
          if (((bitField0_ & 0x00000004) != 0)) {
            venuetype_ = venuetype_.getUnmodifiableView();
            bitField0_ = (bitField0_ & ~0x00000004);
          }
          result.venuetype_ = venuetype_;
          if (((from_bitField0_ & 0x00000008) != 0)) {
            to_bitField0_ |= 0x00000004;
          }
          result.venuetypetax_ = venuetypetax_;
          if (((from_bitField0_ & 0x00000010) != 0)) {
            if (publisherBuilder_ == null) {
              result.publisher_ = publisher_;
            } else {
              result.publisher_ = publisherBuilder_.build();
            }
            to_bitField0_ |= 0x00000008;
          }
          if (((from_bitField0_ & 0x00000020) != 0)) {
            to_bitField0_ |= 0x00000010;
          }
          result.domain_ = domain_;
          if (((from_bitField0_ & 0x00000040) != 0)) {
            to_bitField0_ |= 0x00000020;
          }
          result.keywords_ = keywords_;
          if (((from_bitField0_ & 0x00000080) != 0)) {
            if (contentBuilder_ == null) {
              result.content_ = content_;
            } else {
              result.content_ = contentBuilder_.build();
            }
            to_bitField0_ |= 0x00000040;
          }
          result.bitField0_ = to_bitField0_;
          onBuilt();
          return result;
        }

        @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 <Type> Builder setExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh, Type> extension,
            Type value) {
          return super.setExtension(extension, value);
        }
        @java.lang.Override
        public <Type> Builder setExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh, java.util.List<Type>> extension,
            int index, Type value) {
          return super.setExtension(extension, index, value);
        }
        @java.lang.Override
        public <Type> Builder addExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh, java.util.List<Type>> extension,
            Type value) {
          return super.addExtension(extension, value);
        }
        @java.lang.Override
        public <Type> Builder clearExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh, ?> extension) {
          return super.clearExtension(extension);
        }
        @java.lang.Override
        public Builder mergeFrom(com.google.protobuf.Message other) {
          if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh) {
            return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh)other);
          } else {
            super.mergeFrom(other);
            return this;
          }
        }

        public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh other) {
          if (other == com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh.getDefaultInstance()) return this;
          if (other.hasId()) {
            bitField0_ |= 0x00000001;
            id_ = other.id_;
            onChanged();
          }
          if (other.hasName()) {
            bitField0_ |= 0x00000002;
            name_ = other.name_;
            onChanged();
          }
          if (!other.venuetype_.isEmpty()) {
            if (venuetype_.isEmpty()) {
              venuetype_ = other.venuetype_;
              bitField0_ = (bitField0_ & ~0x00000004);
            } else {
              ensureVenuetypeIsMutable();
              venuetype_.addAll(other.venuetype_);
            }
            onChanged();
          }
          if (other.hasVenuetypetax()) {
            setVenuetypetax(other.getVenuetypetax());
          }
          if (other.hasPublisher()) {
            mergePublisher(other.getPublisher());
          }
          if (other.hasDomain()) {
            bitField0_ |= 0x00000020;
            domain_ = other.domain_;
            onChanged();
          }
          if (other.hasKeywords()) {
            bitField0_ |= 0x00000040;
            keywords_ = other.keywords_;
            onChanged();
          }
          if (other.hasContent()) {
            mergeContent(other.getContent());
          }
          this.mergeExtensionFields(other);
          this.mergeUnknownFields(other.unknownFields);
          onChanged();
          return this;
        }

        @java.lang.Override
        public final boolean isInitialized() {
          if (hasPublisher()) {
            if (!getPublisher().isInitialized()) {
              return false;
            }
          }
          if (hasContent()) {
            if (!getContent().isInitialized()) {
              return false;
            }
          }
          if (!extensionsAreInitialized()) {
            return false;
          }
          return true;
        }

        @java.lang.Override
        public Builder mergeFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws java.io.IOException {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh parsedMessage = null;
          try {
            parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh) e.getUnfinishedMessage();
            throw e.unwrapIOException();
          } finally {
            if (parsedMessage != null) {
              mergeFrom(parsedMessage);
            }
          }
          return this;
        }
        private int bitField0_;

        private java.lang.Object id_ = "";
        /**
         * <pre>
         * Exchange provided id for a placement or logical grouping of placements.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @return Whether the id field is set.
         */
        public boolean hasId() {
          return ((bitField0_ & 0x00000001) != 0);
        }
        /**
         * <pre>
         * Exchange provided id for a placement or logical grouping of placements.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @return The id.
         */
        public java.lang.String getId() {
          java.lang.Object ref = id_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              id_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Exchange provided id for a placement or logical grouping of placements.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @return The bytes for id.
         */
        public com.google.protobuf.ByteString
            getIdBytes() {
          java.lang.Object ref = id_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            id_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Exchange provided id for a placement or logical grouping of placements.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @param value The id to set.
         * @return This builder for chaining.
         */
        public Builder setId(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
          id_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Exchange provided id for a placement or logical grouping of placements.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @return This builder for chaining.
         */
        public Builder clearId() {
          bitField0_ = (bitField0_ & ~0x00000001);
          id_ = getDefaultInstance().getId();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Exchange provided id for a placement or logical grouping of placements.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @param value The bytes for id to set.
         * @return This builder for chaining.
         */
        public Builder setIdBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
          id_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object name_ = "";
        /**
         * <pre>
         * Name of the DOOH placement.
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @return Whether the name field is set.
         */
        public boolean hasName() {
          return ((bitField0_ & 0x00000002) != 0);
        }
        /**
         * <pre>
         * Name of the DOOH placement.
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @return The name.
         */
        public java.lang.String getName() {
          java.lang.Object ref = name_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              name_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Name of the DOOH placement.
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @return The bytes for name.
         */
        public com.google.protobuf.ByteString
            getNameBytes() {
          java.lang.Object ref = name_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            name_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Name of the DOOH placement.
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @param value The name to set.
         * @return This builder for chaining.
         */
        public Builder setName(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
          name_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Name of the DOOH placement.
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @return This builder for chaining.
         */
        public Builder clearName() {
          bitField0_ = (bitField0_ & ~0x00000002);
          name_ = getDefaultInstance().getName();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Name of the DOOH placement.
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @param value The bytes for name to set.
         * @return This builder for chaining.
         */
        public Builder setNameBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
          name_ = value;
          onChanged();
          return this;
        }

        private com.google.protobuf.LazyStringList venuetype_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        private void ensureVenuetypeIsMutable() {
          if (!((bitField0_ & 0x00000004) != 0)) {
            venuetype_ = new com.google.protobuf.LazyStringArrayList(venuetype_);
            bitField0_ |= 0x00000004;
           }
        }
        /**
         * <pre>
         * The type of out-of-home venue. The taxonomy to be used is defined by the
         * venuetax field. If no venuetax field is supplied, The OpenOOH Venue
         * Taxonomy is assumed.
         * </pre>
         *
         * <code>repeated string venuetype = 3;</code>
         * @return A list containing the venuetype.
         */
        public com.google.protobuf.ProtocolStringList
            getVenuetypeList() {
          return venuetype_.getUnmodifiableView();
        }
        /**
         * <pre>
         * The type of out-of-home venue. The taxonomy to be used is defined by the
         * venuetax field. If no venuetax field is supplied, The OpenOOH Venue
         * Taxonomy is assumed.
         * </pre>
         *
         * <code>repeated string venuetype = 3;</code>
         * @return The count of venuetype.
         */
        public int getVenuetypeCount() {
          return venuetype_.size();
        }
        /**
         * <pre>
         * The type of out-of-home venue. The taxonomy to be used is defined by the
         * venuetax field. If no venuetax field is supplied, The OpenOOH Venue
         * Taxonomy is assumed.
         * </pre>
         *
         * <code>repeated string venuetype = 3;</code>
         * @param index The index of the element to return.
         * @return The venuetype at the given index.
         */
        public java.lang.String getVenuetype(int index) {
          return venuetype_.get(index);
        }
        /**
         * <pre>
         * The type of out-of-home venue. The taxonomy to be used is defined by the
         * venuetax field. If no venuetax field is supplied, The OpenOOH Venue
         * Taxonomy is assumed.
         * </pre>
         *
         * <code>repeated string venuetype = 3;</code>
         * @param index The index of the value to return.
         * @return The bytes of the venuetype at the given index.
         */
        public com.google.protobuf.ByteString
            getVenuetypeBytes(int index) {
          return venuetype_.getByteString(index);
        }
        /**
         * <pre>
         * The type of out-of-home venue. The taxonomy to be used is defined by the
         * venuetax field. If no venuetax field is supplied, The OpenOOH Venue
         * Taxonomy is assumed.
         * </pre>
         *
         * <code>repeated string venuetype = 3;</code>
         * @param index The index to set the value at.
         * @param value The venuetype to set.
         * @return This builder for chaining.
         */
        public Builder setVenuetype(
            int index, java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  ensureVenuetypeIsMutable();
          venuetype_.set(index, value);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * The type of out-of-home venue. The taxonomy to be used is defined by the
         * venuetax field. If no venuetax field is supplied, The OpenOOH Venue
         * Taxonomy is assumed.
         * </pre>
         *
         * <code>repeated string venuetype = 3;</code>
         * @param value The venuetype to add.
         * @return This builder for chaining.
         */
        public Builder addVenuetype(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  ensureVenuetypeIsMutable();
          venuetype_.add(value);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * The type of out-of-home venue. The taxonomy to be used is defined by the
         * venuetax field. If no venuetax field is supplied, The OpenOOH Venue
         * Taxonomy is assumed.
         * </pre>
         *
         * <code>repeated string venuetype = 3;</code>
         * @param values The venuetype to add.
         * @return This builder for chaining.
         */
        public Builder addAllVenuetype(
            java.lang.Iterable<java.lang.String> values) {
          ensureVenuetypeIsMutable();
          com.google.protobuf.AbstractMessageLite.Builder.addAll(
              values, venuetype_);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * The type of out-of-home venue. The taxonomy to be used is defined by the
         * venuetax field. If no venuetax field is supplied, The OpenOOH Venue
         * Taxonomy is assumed.
         * </pre>
         *
         * <code>repeated string venuetype = 3;</code>
         * @return This builder for chaining.
         */
        public Builder clearVenuetype() {
          venuetype_ = com.google.protobuf.LazyStringArrayList.EMPTY;
          bitField0_ = (bitField0_ & ~0x00000004);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * The type of out-of-home venue. The taxonomy to be used is defined by the
         * venuetax field. If no venuetax field is supplied, The OpenOOH Venue
         * Taxonomy is assumed.
         * </pre>
         *
         * <code>repeated string venuetype = 3;</code>
         * @param value The bytes of the venuetype to add.
         * @return This builder for chaining.
         */
        public Builder addVenuetypeBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  ensureVenuetypeIsMutable();
          venuetype_.add(value);
          onChanged();
          return this;
        }

        private int venuetypetax_ = 1;
        /**
         * <pre>
         * The venue taxonomy in use.
         * </pre>
         *
         * <code>optional int32 venuetypetax = 4 [default = 1];</code>
         * @return Whether the venuetypetax field is set.
         */
        @java.lang.Override
        public boolean hasVenuetypetax() {
          return ((bitField0_ & 0x00000008) != 0);
        }
        /**
         * <pre>
         * The venue taxonomy in use.
         * </pre>
         *
         * <code>optional int32 venuetypetax = 4 [default = 1];</code>
         * @return The venuetypetax.
         */
        @java.lang.Override
        public int getVenuetypetax() {
          return venuetypetax_;
        }
        /**
         * <pre>
         * The venue taxonomy in use.
         * </pre>
         *
         * <code>optional int32 venuetypetax = 4 [default = 1];</code>
         * @param value The venuetypetax to set.
         * @return This builder for chaining.
         */
        public Builder setVenuetypetax(int value) {
          bitField0_ |= 0x00000008;
          venuetypetax_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * The venue taxonomy in use.
         * </pre>
         *
         * <code>optional int32 venuetypetax = 4 [default = 1];</code>
         * @return This builder for chaining.
         */
        public Builder clearVenuetypetax() {
          bitField0_ = (bitField0_ & ~0x00000008);
          venuetypetax_ = 1;
          onChanged();
          return this;
        }

        private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher publisher_;
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.PublisherOrBuilder> publisherBuilder_;
        /**
         * <pre>
         * Details about the publisher of the placement.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Publisher publisher = 5;</code>
         * @return Whether the publisher field is set.
         */
        public boolean hasPublisher() {
          return ((bitField0_ & 0x00000010) != 0);
        }
        /**
         * <pre>
         * Details about the publisher of the placement.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Publisher publisher = 5;</code>
         * @return The publisher.
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher getPublisher() {
          if (publisherBuilder_ == null) {
            return publisher_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher.getDefaultInstance() : publisher_;
          } else {
            return publisherBuilder_.getMessage();
          }
        }
        /**
         * <pre>
         * Details about the publisher of the placement.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Publisher publisher = 5;</code>
         */
        public Builder setPublisher(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher value) {
          if (publisherBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            publisher_ = value;
            onChanged();
          } else {
            publisherBuilder_.setMessage(value);
          }
          bitField0_ |= 0x00000010;
          return this;
        }
        /**
         * <pre>
         * Details about the publisher of the placement.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Publisher publisher = 5;</code>
         */
        public Builder setPublisher(
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher.Builder builderForValue) {
          if (publisherBuilder_ == null) {
            publisher_ = builderForValue.build();
            onChanged();
          } else {
            publisherBuilder_.setMessage(builderForValue.build());
          }
          bitField0_ |= 0x00000010;
          return this;
        }
        /**
         * <pre>
         * Details about the publisher of the placement.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Publisher publisher = 5;</code>
         */
        public Builder mergePublisher(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher value) {
          if (publisherBuilder_ == null) {
            if (((bitField0_ & 0x00000010) != 0) &&
                publisher_ != null &&
                publisher_ != com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher.getDefaultInstance()) {
              publisher_ =
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher.newBuilder(publisher_).mergeFrom(value).buildPartial();
            } else {
              publisher_ = value;
            }
            onChanged();
          } else {
            publisherBuilder_.mergeFrom(value);
          }
          bitField0_ |= 0x00000010;
          return this;
        }
        /**
         * <pre>
         * Details about the publisher of the placement.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Publisher publisher = 5;</code>
         */
        public Builder clearPublisher() {
          if (publisherBuilder_ == null) {
            publisher_ = null;
            onChanged();
          } else {
            publisherBuilder_.clear();
          }
          bitField0_ = (bitField0_ & ~0x00000010);
          return this;
        }
        /**
         * <pre>
         * Details about the publisher of the placement.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Publisher publisher = 5;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher.Builder getPublisherBuilder() {
          bitField0_ |= 0x00000010;
          onChanged();
          return getPublisherFieldBuilder().getBuilder();
        }
        /**
         * <pre>
         * Details about the publisher of the placement.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Publisher publisher = 5;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.PublisherOrBuilder getPublisherOrBuilder() {
          if (publisherBuilder_ != null) {
            return publisherBuilder_.getMessageOrBuilder();
          } else {
            return publisher_ == null ?
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher.getDefaultInstance() : publisher_;
          }
        }
        /**
         * <pre>
         * Details about the publisher of the placement.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Publisher publisher = 5;</code>
         */
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.PublisherOrBuilder> 
            getPublisherFieldBuilder() {
          if (publisherBuilder_ == null) {
            publisherBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.PublisherOrBuilder>(
                    getPublisher(),
                    getParentForChildren(),
                    isClean());
            publisher_ = null;
          }
          return publisherBuilder_;
        }

        private java.lang.Object domain_ = "";
        /**
         * <pre>
         * Domain of the inventory owner (e.g., "mysite.foo.com").
         * </pre>
         *
         * <code>optional string domain = 6;</code>
         * @return Whether the domain field is set.
         */
        public boolean hasDomain() {
          return ((bitField0_ & 0x00000020) != 0);
        }
        /**
         * <pre>
         * Domain of the inventory owner (e.g., "mysite.foo.com").
         * </pre>
         *
         * <code>optional string domain = 6;</code>
         * @return The domain.
         */
        public java.lang.String getDomain() {
          java.lang.Object ref = domain_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              domain_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Domain of the inventory owner (e.g., "mysite.foo.com").
         * </pre>
         *
         * <code>optional string domain = 6;</code>
         * @return The bytes for domain.
         */
        public com.google.protobuf.ByteString
            getDomainBytes() {
          java.lang.Object ref = domain_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            domain_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Domain of the inventory owner (e.g., "mysite.foo.com").
         * </pre>
         *
         * <code>optional string domain = 6;</code>
         * @param value The domain to set.
         * @return This builder for chaining.
         */
        public Builder setDomain(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000020;
          domain_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Domain of the inventory owner (e.g., "mysite.foo.com").
         * </pre>
         *
         * <code>optional string domain = 6;</code>
         * @return This builder for chaining.
         */
        public Builder clearDomain() {
          bitField0_ = (bitField0_ & ~0x00000020);
          domain_ = getDefaultInstance().getDomain();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Domain of the inventory owner (e.g., "mysite.foo.com").
         * </pre>
         *
         * <code>optional string domain = 6;</code>
         * @param value The bytes for domain to set.
         * @return This builder for chaining.
         */
        public Builder setDomainBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000020;
          domain_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object keywords_ = "";
        /**
         * <pre>
         * Comma separated list of keywords about the DOOH placement.
         * </pre>
         *
         * <code>optional string keywords = 7;</code>
         * @return Whether the keywords field is set.
         */
        public boolean hasKeywords() {
          return ((bitField0_ & 0x00000040) != 0);
        }
        /**
         * <pre>
         * Comma separated list of keywords about the DOOH placement.
         * </pre>
         *
         * <code>optional string keywords = 7;</code>
         * @return The keywords.
         */
        public java.lang.String getKeywords() {
          java.lang.Object ref = keywords_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              keywords_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Comma separated list of keywords about the DOOH placement.
         * </pre>
         *
         * <code>optional string keywords = 7;</code>
         * @return The bytes for keywords.
         */
        public com.google.protobuf.ByteString
            getKeywordsBytes() {
          java.lang.Object ref = keywords_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            keywords_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Comma separated list of keywords about the DOOH placement.
         * </pre>
         *
         * <code>optional string keywords = 7;</code>
         * @param value The keywords to set.
         * @return This builder for chaining.
         */
        public Builder setKeywords(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000040;
          keywords_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Comma separated list of keywords about the DOOH placement.
         * </pre>
         *
         * <code>optional string keywords = 7;</code>
         * @return This builder for chaining.
         */
        public Builder clearKeywords() {
          bitField0_ = (bitField0_ & ~0x00000040);
          keywords_ = getDefaultInstance().getKeywords();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Comma separated list of keywords about the DOOH placement.
         * </pre>
         *
         * <code>optional string keywords = 7;</code>
         * @param value The bytes for keywords to set.
         * @return This builder for chaining.
         */
        public Builder setKeywordsBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000040;
          keywords_ = value;
          onChanged();
          return this;
        }

        private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content content_;
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.ContentOrBuilder> contentBuilder_;
        /**
         * <pre>
         * Details about the Content within the DOOH placement.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Content content = 8;</code>
         * @return Whether the content field is set.
         */
        public boolean hasContent() {
          return ((bitField0_ & 0x00000080) != 0);
        }
        /**
         * <pre>
         * Details about the Content within the DOOH placement.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Content content = 8;</code>
         * @return The content.
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content getContent() {
          if (contentBuilder_ == null) {
            return content_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content.getDefaultInstance() : content_;
          } else {
            return contentBuilder_.getMessage();
          }
        }
        /**
         * <pre>
         * Details about the Content within the DOOH placement.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Content content = 8;</code>
         */
        public Builder setContent(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content value) {
          if (contentBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            content_ = value;
            onChanged();
          } else {
            contentBuilder_.setMessage(value);
          }
          bitField0_ |= 0x00000080;
          return this;
        }
        /**
         * <pre>
         * Details about the Content within the DOOH placement.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Content content = 8;</code>
         */
        public Builder setContent(
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content.Builder builderForValue) {
          if (contentBuilder_ == null) {
            content_ = builderForValue.build();
            onChanged();
          } else {
            contentBuilder_.setMessage(builderForValue.build());
          }
          bitField0_ |= 0x00000080;
          return this;
        }
        /**
         * <pre>
         * Details about the Content within the DOOH placement.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Content content = 8;</code>
         */
        public Builder mergeContent(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content value) {
          if (contentBuilder_ == null) {
            if (((bitField0_ & 0x00000080) != 0) &&
                content_ != null &&
                content_ != com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content.getDefaultInstance()) {
              content_ =
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content.newBuilder(content_).mergeFrom(value).buildPartial();
            } else {
              content_ = value;
            }
            onChanged();
          } else {
            contentBuilder_.mergeFrom(value);
          }
          bitField0_ |= 0x00000080;
          return this;
        }
        /**
         * <pre>
         * Details about the Content within the DOOH placement.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Content content = 8;</code>
         */
        public Builder clearContent() {
          if (contentBuilder_ == null) {
            content_ = null;
            onChanged();
          } else {
            contentBuilder_.clear();
          }
          bitField0_ = (bitField0_ & ~0x00000080);
          return this;
        }
        /**
         * <pre>
         * Details about the Content within the DOOH placement.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Content content = 8;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content.Builder getContentBuilder() {
          bitField0_ |= 0x00000080;
          onChanged();
          return getContentFieldBuilder().getBuilder();
        }
        /**
         * <pre>
         * Details about the Content within the DOOH placement.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Content content = 8;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.ContentOrBuilder getContentOrBuilder() {
          if (contentBuilder_ != null) {
            return contentBuilder_.getMessageOrBuilder();
          } else {
            return content_ == null ?
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content.getDefaultInstance() : content_;
          }
        }
        /**
         * <pre>
         * Details about the Content within the DOOH placement.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Content content = 8;</code>
         */
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.ContentOrBuilder> 
            getContentFieldBuilder() {
          if (contentBuilder_ == null) {
            contentBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.ContentOrBuilder>(
                    getContent(),
                    getParentForChildren(),
                    isClean());
            content_ = null;
          }
          return contentBuilder_;
        }
        @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:com.iabtechlab.openrtb.v2.BidRequest.Dooh)
      }

      // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.BidRequest.Dooh)
      private static final com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh DEFAULT_INSTANCE;
      static {
        DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh();
      }

      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh getDefaultInstance() {
        return DEFAULT_INSTANCE;
      }

      @java.lang.Deprecated public static final com.google.protobuf.Parser<Dooh>
          PARSER = new com.google.protobuf.AbstractParser<Dooh>() {
        @java.lang.Override
        public Dooh parsePartialFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return new Dooh(input, extensionRegistry);
        }
      };

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

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

      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh getDefaultInstanceForType() {
        return DEFAULT_INSTANCE;
      }

    }

    public interface PublisherOrBuilder extends
        // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.BidRequest.Publisher)
        com.google.protobuf.GeneratedMessageV3.
            ExtendableMessageOrBuilder<Publisher> {

      /**
       * <pre>
       * Exchange-specific publisher ID.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return Whether the id field is set.
       */
      boolean hasId();
      /**
       * <pre>
       * Exchange-specific publisher ID.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return The id.
       */
      java.lang.String getId();
      /**
       * <pre>
       * Exchange-specific publisher ID.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return The bytes for id.
       */
      com.google.protobuf.ByteString
          getIdBytes();

      /**
       * <pre>
       * Publisher name (may be aliased at publisher's request).
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return Whether the name field is set.
       */
      boolean hasName();
      /**
       * <pre>
       * Publisher name (may be aliased at publisher's request).
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return The name.
       */
      java.lang.String getName();
      /**
       * <pre>
       * Publisher name (may be aliased at publisher's request).
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return The bytes for name.
       */
      com.google.protobuf.ByteString
          getNameBytes();

      /**
       * <pre>
       * The taxonomy in use.
       * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
       * </pre>
       *
       * <code>optional int32 cattax = 5 [default = 1];</code>
       * @return Whether the cattax field is set.
       */
      boolean hasCattax();
      /**
       * <pre>
       * The taxonomy in use.
       * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
       * </pre>
       *
       * <code>optional int32 cattax = 5 [default = 1];</code>
       * @return The cattax.
       */
      int getCattax();

      /**
       * <pre>
       * Array of IAB content categories that describe the publisher.
       * </pre>
       *
       * <code>repeated string cat = 3;</code>
       * @return A list containing the cat.
       */
      java.util.List<java.lang.String>
          getCatList();
      /**
       * <pre>
       * Array of IAB content categories that describe the publisher.
       * </pre>
       *
       * <code>repeated string cat = 3;</code>
       * @return The count of cat.
       */
      int getCatCount();
      /**
       * <pre>
       * Array of IAB content categories that describe the publisher.
       * </pre>
       *
       * <code>repeated string cat = 3;</code>
       * @param index The index of the element to return.
       * @return The cat at the given index.
       */
      java.lang.String getCat(int index);
      /**
       * <pre>
       * Array of IAB content categories that describe the publisher.
       * </pre>
       *
       * <code>repeated string cat = 3;</code>
       * @param index The index of the value to return.
       * @return The bytes of the cat at the given index.
       */
      com.google.protobuf.ByteString
          getCatBytes(int index);

      /**
       * <pre>
       * Highest level domain of the publisher (e.g., "publisher.com").
       * </pre>
       *
       * <code>optional string domain = 4;</code>
       * @return Whether the domain field is set.
       */
      boolean hasDomain();
      /**
       * <pre>
       * Highest level domain of the publisher (e.g., "publisher.com").
       * </pre>
       *
       * <code>optional string domain = 4;</code>
       * @return The domain.
       */
      java.lang.String getDomain();
      /**
       * <pre>
       * Highest level domain of the publisher (e.g., "publisher.com").
       * </pre>
       *
       * <code>optional string domain = 4;</code>
       * @return The bytes for domain.
       */
      com.google.protobuf.ByteString
          getDomainBytes();
    }
    /**
     * <pre>
     * OpenRTB 2.0: This object describes the publisher of the media in which
     * the ad will be displayed. The publisher is typically the seller
     * in an OpenRTB transaction.
     * </pre>
     *
     * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Publisher}
     */
    public static final class Publisher extends
        com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
          Publisher> implements
        // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.BidRequest.Publisher)
        PublisherOrBuilder {
    private static final long serialVersionUID = 0L;
      // Use Publisher.newBuilder() to construct.
      private Publisher(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher, ?> builder) {
        super(builder);
      }
      private Publisher() {
        id_ = "";
        name_ = "";
        cattax_ = 1;
        cat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        domain_ = "";
      }

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

      @java.lang.Override
      public final com.google.protobuf.UnknownFieldSet
      getUnknownFields() {
        return this.unknownFields;
      }
      private Publisher(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        this();
        if (extensionRegistry == null) {
          throw new java.lang.NullPointerException();
        }
        int mutable_bitField0_ = 0;
        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
            com.google.protobuf.UnknownFieldSet.newBuilder();
        try {
          boolean done = false;
          while (!done) {
            int tag = input.readTag();
            switch (tag) {
              case 0:
                done = true;
                break;
              case 10: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000001;
                id_ = bs;
                break;
              }
              case 18: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000002;
                name_ = bs;
                break;
              }
              case 26: {
                com.google.protobuf.ByteString bs = input.readBytes();
                if (!((mutable_bitField0_ & 0x00000008) != 0)) {
                  cat_ = new com.google.protobuf.LazyStringArrayList();
                  mutable_bitField0_ |= 0x00000008;
                }
                cat_.add(bs);
                break;
              }
              case 34: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000008;
                domain_ = bs;
                break;
              }
              case 40: {
                bitField0_ |= 0x00000004;
                cattax_ = input.readInt32();
                break;
              }
              default: {
                if (!parseUnknownField(
                    input, unknownFields, extensionRegistry, tag)) {
                  done = true;
                }
                break;
              }
            }
          }
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          throw e.setUnfinishedMessage(this);
        } catch (java.io.IOException e) {
          throw new com.google.protobuf.InvalidProtocolBufferException(
              e).setUnfinishedMessage(this);
        } finally {
          if (((mutable_bitField0_ & 0x00000008) != 0)) {
            cat_ = cat_.getUnmodifiableView();
          }
          this.unknownFields = unknownFields.build();
          makeExtensionsImmutable();
        }
      }
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Publisher_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Publisher_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher.Builder.class);
      }

      private int bitField0_;
      public static final int ID_FIELD_NUMBER = 1;
      private volatile java.lang.Object id_;
      /**
       * <pre>
       * Exchange-specific publisher ID.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return Whether the id field is set.
       */
      @java.lang.Override
      public boolean hasId() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <pre>
       * Exchange-specific publisher ID.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return The id.
       */
      @java.lang.Override
      public java.lang.String getId() {
        java.lang.Object ref = id_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            id_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Exchange-specific publisher ID.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return The bytes for id.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getIdBytes() {
        java.lang.Object ref = id_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          id_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int NAME_FIELD_NUMBER = 2;
      private volatile java.lang.Object name_;
      /**
       * <pre>
       * Publisher name (may be aliased at publisher's request).
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return Whether the name field is set.
       */
      @java.lang.Override
      public boolean hasName() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <pre>
       * Publisher name (may be aliased at publisher's request).
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return The name.
       */
      @java.lang.Override
      public java.lang.String getName() {
        java.lang.Object ref = name_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            name_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Publisher name (may be aliased at publisher's request).
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return The bytes for name.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getNameBytes() {
        java.lang.Object ref = name_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          name_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int CATTAX_FIELD_NUMBER = 5;
      private int cattax_;
      /**
       * <pre>
       * The taxonomy in use.
       * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
       * </pre>
       *
       * <code>optional int32 cattax = 5 [default = 1];</code>
       * @return Whether the cattax field is set.
       */
      @java.lang.Override
      public boolean hasCattax() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <pre>
       * The taxonomy in use.
       * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
       * </pre>
       *
       * <code>optional int32 cattax = 5 [default = 1];</code>
       * @return The cattax.
       */
      @java.lang.Override
      public int getCattax() {
        return cattax_;
      }

      public static final int CAT_FIELD_NUMBER = 3;
      private com.google.protobuf.LazyStringList cat_;
      /**
       * <pre>
       * Array of IAB content categories that describe the publisher.
       * </pre>
       *
       * <code>repeated string cat = 3;</code>
       * @return A list containing the cat.
       */
      public com.google.protobuf.ProtocolStringList
          getCatList() {
        return cat_;
      }
      /**
       * <pre>
       * Array of IAB content categories that describe the publisher.
       * </pre>
       *
       * <code>repeated string cat = 3;</code>
       * @return The count of cat.
       */
      public int getCatCount() {
        return cat_.size();
      }
      /**
       * <pre>
       * Array of IAB content categories that describe the publisher.
       * </pre>
       *
       * <code>repeated string cat = 3;</code>
       * @param index The index of the element to return.
       * @return The cat at the given index.
       */
      public java.lang.String getCat(int index) {
        return cat_.get(index);
      }
      /**
       * <pre>
       * Array of IAB content categories that describe the publisher.
       * </pre>
       *
       * <code>repeated string cat = 3;</code>
       * @param index The index of the value to return.
       * @return The bytes of the cat at the given index.
       */
      public com.google.protobuf.ByteString
          getCatBytes(int index) {
        return cat_.getByteString(index);
      }

      public static final int DOMAIN_FIELD_NUMBER = 4;
      private volatile java.lang.Object domain_;
      /**
       * <pre>
       * Highest level domain of the publisher (e.g., "publisher.com").
       * </pre>
       *
       * <code>optional string domain = 4;</code>
       * @return Whether the domain field is set.
       */
      @java.lang.Override
      public boolean hasDomain() {
        return ((bitField0_ & 0x00000008) != 0);
      }
      /**
       * <pre>
       * Highest level domain of the publisher (e.g., "publisher.com").
       * </pre>
       *
       * <code>optional string domain = 4;</code>
       * @return The domain.
       */
      @java.lang.Override
      public java.lang.String getDomain() {
        java.lang.Object ref = domain_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            domain_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Highest level domain of the publisher (e.g., "publisher.com").
       * </pre>
       *
       * <code>optional string domain = 4;</code>
       * @return The bytes for domain.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getDomainBytes() {
        java.lang.Object ref = domain_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          domain_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

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

        if (!extensionsAreInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
        memoizedIsInitialized = 1;
        return true;
      }

      @java.lang.Override
      public void writeTo(com.google.protobuf.CodedOutputStream output)
                          throws java.io.IOException {
        com.google.protobuf.GeneratedMessageV3
          .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher>.ExtensionWriter
            extensionWriter = newExtensionWriter();
        if (((bitField0_ & 0x00000001) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 1, id_);
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 2, name_);
        }
        for (int i = 0; i < cat_.size(); i++) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 3, cat_.getRaw(i));
        }
        if (((bitField0_ & 0x00000008) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 4, domain_);
        }
        if (((bitField0_ & 0x00000004) != 0)) {
          output.writeInt32(5, cattax_);
        }
        extensionWriter.writeUntil(10000, output);
        unknownFields.writeTo(output);
      }

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

        size = 0;
        if (((bitField0_ & 0x00000001) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, id_);
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, name_);
        }
        {
          int dataSize = 0;
          for (int i = 0; i < cat_.size(); i++) {
            dataSize += computeStringSizeNoTag(cat_.getRaw(i));
          }
          size += dataSize;
          size += 1 * getCatList().size();
        }
        if (((bitField0_ & 0x00000008) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, domain_);
        }
        if (((bitField0_ & 0x00000004) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeInt32Size(5, cattax_);
        }
        size += extensionsSerializedSize();
        size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher)) {
          return super.equals(obj);
        }
        com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher other = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher) obj;

        if (hasId() != other.hasId()) return false;
        if (hasId()) {
          if (!getId()
              .equals(other.getId())) return false;
        }
        if (hasName() != other.hasName()) return false;
        if (hasName()) {
          if (!getName()
              .equals(other.getName())) return false;
        }
        if (hasCattax() != other.hasCattax()) return false;
        if (hasCattax()) {
          if (getCattax()
              != other.getCattax()) return false;
        }
        if (!getCatList()
            .equals(other.getCatList())) return false;
        if (hasDomain() != other.hasDomain()) return false;
        if (hasDomain()) {
          if (!getDomain()
              .equals(other.getDomain())) return false;
        }
        if (!unknownFields.equals(other.unknownFields)) return false;
        if (!getExtensionFields().equals(other.getExtensionFields()))
          return false;
        return true;
      }

      @java.lang.Override
      public int hashCode() {
        if (memoizedHashCode != 0) {
          return memoizedHashCode;
        }
        int hash = 41;
        hash = (19 * hash) + getDescriptor().hashCode();
        if (hasId()) {
          hash = (37 * hash) + ID_FIELD_NUMBER;
          hash = (53 * hash) + getId().hashCode();
        }
        if (hasName()) {
          hash = (37 * hash) + NAME_FIELD_NUMBER;
          hash = (53 * hash) + getName().hashCode();
        }
        if (hasCattax()) {
          hash = (37 * hash) + CATTAX_FIELD_NUMBER;
          hash = (53 * hash) + getCattax();
        }
        if (getCatCount() > 0) {
          hash = (37 * hash) + CAT_FIELD_NUMBER;
          hash = (53 * hash) + getCatList().hashCode();
        }
        if (hasDomain()) {
          hash = (37 * hash) + DOMAIN_FIELD_NUMBER;
          hash = (53 * hash) + getDomain().hashCode();
        }
        hash = hashFields(hash, getExtensionFields());
        hash = (29 * hash) + unknownFields.hashCode();
        memoizedHashCode = hash;
        return hash;
      }

      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher parseFrom(
          java.nio.ByteBuffer data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher parseFrom(
          java.nio.ByteBuffer data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher parseFrom(
          com.google.protobuf.ByteString data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher parseFrom(
          com.google.protobuf.ByteString data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher parseFrom(byte[] data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher parseFrom(
          byte[] data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher parseFrom(java.io.InputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher parseDelimitedFrom(java.io.InputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseDelimitedWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher parseFrom(
          com.google.protobuf.CodedInputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher 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>
       * OpenRTB 2.0: This object describes the publisher of the media in which
       * the ad will be displayed. The publisher is typically the seller
       * in an OpenRTB transaction.
       * </pre>
       *
       * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Publisher}
       */
      public static final class Builder extends
          com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher, Builder> implements
          // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.BidRequest.Publisher)
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.PublisherOrBuilder {
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Publisher_descriptor;
        }

        @java.lang.Override
        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Publisher_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher.Builder.class);
        }

        // Construct using com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher.newBuilder()
        private Builder() {
          maybeForceBuilderInitialization();
        }

        private Builder(
            com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
          super(parent);
          maybeForceBuilderInitialization();
        }
        private void maybeForceBuilderInitialization() {
          if (com.google.protobuf.GeneratedMessageV3
                  .alwaysUseFieldBuilders) {
          }
        }
        @java.lang.Override
        public Builder clear() {
          super.clear();
          id_ = "";
          bitField0_ = (bitField0_ & ~0x00000001);
          name_ = "";
          bitField0_ = (bitField0_ & ~0x00000002);
          cattax_ = 1;
          bitField0_ = (bitField0_ & ~0x00000004);
          cat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
          bitField0_ = (bitField0_ & ~0x00000008);
          domain_ = "";
          bitField0_ = (bitField0_ & ~0x00000010);
          return this;
        }

        @java.lang.Override
        public com.google.protobuf.Descriptors.Descriptor
            getDescriptorForType() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Publisher_descriptor;
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher getDefaultInstanceForType() {
          return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher.getDefaultInstance();
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher build() {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher result = buildPartial();
          if (!result.isInitialized()) {
            throw newUninitializedMessageException(result);
          }
          return result;
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher buildPartial() {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher result = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher(this);
          int from_bitField0_ = bitField0_;
          int to_bitField0_ = 0;
          if (((from_bitField0_ & 0x00000001) != 0)) {
            to_bitField0_ |= 0x00000001;
          }
          result.id_ = id_;
          if (((from_bitField0_ & 0x00000002) != 0)) {
            to_bitField0_ |= 0x00000002;
          }
          result.name_ = name_;
          if (((from_bitField0_ & 0x00000004) != 0)) {
            to_bitField0_ |= 0x00000004;
          }
          result.cattax_ = cattax_;
          if (((bitField0_ & 0x00000008) != 0)) {
            cat_ = cat_.getUnmodifiableView();
            bitField0_ = (bitField0_ & ~0x00000008);
          }
          result.cat_ = cat_;
          if (((from_bitField0_ & 0x00000010) != 0)) {
            to_bitField0_ |= 0x00000008;
          }
          result.domain_ = domain_;
          result.bitField0_ = to_bitField0_;
          onBuilt();
          return result;
        }

        @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 <Type> Builder setExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher, Type> extension,
            Type value) {
          return super.setExtension(extension, value);
        }
        @java.lang.Override
        public <Type> Builder setExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher, java.util.List<Type>> extension,
            int index, Type value) {
          return super.setExtension(extension, index, value);
        }
        @java.lang.Override
        public <Type> Builder addExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher, java.util.List<Type>> extension,
            Type value) {
          return super.addExtension(extension, value);
        }
        @java.lang.Override
        public <Type> Builder clearExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher, ?> extension) {
          return super.clearExtension(extension);
        }
        @java.lang.Override
        public Builder mergeFrom(com.google.protobuf.Message other) {
          if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher) {
            return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher)other);
          } else {
            super.mergeFrom(other);
            return this;
          }
        }

        public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher other) {
          if (other == com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher.getDefaultInstance()) return this;
          if (other.hasId()) {
            bitField0_ |= 0x00000001;
            id_ = other.id_;
            onChanged();
          }
          if (other.hasName()) {
            bitField0_ |= 0x00000002;
            name_ = other.name_;
            onChanged();
          }
          if (other.hasCattax()) {
            setCattax(other.getCattax());
          }
          if (!other.cat_.isEmpty()) {
            if (cat_.isEmpty()) {
              cat_ = other.cat_;
              bitField0_ = (bitField0_ & ~0x00000008);
            } else {
              ensureCatIsMutable();
              cat_.addAll(other.cat_);
            }
            onChanged();
          }
          if (other.hasDomain()) {
            bitField0_ |= 0x00000010;
            domain_ = other.domain_;
            onChanged();
          }
          this.mergeExtensionFields(other);
          this.mergeUnknownFields(other.unknownFields);
          onChanged();
          return this;
        }

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

        @java.lang.Override
        public Builder mergeFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws java.io.IOException {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher parsedMessage = null;
          try {
            parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher) e.getUnfinishedMessage();
            throw e.unwrapIOException();
          } finally {
            if (parsedMessage != null) {
              mergeFrom(parsedMessage);
            }
          }
          return this;
        }
        private int bitField0_;

        private java.lang.Object id_ = "";
        /**
         * <pre>
         * Exchange-specific publisher ID.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @return Whether the id field is set.
         */
        public boolean hasId() {
          return ((bitField0_ & 0x00000001) != 0);
        }
        /**
         * <pre>
         * Exchange-specific publisher ID.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @return The id.
         */
        public java.lang.String getId() {
          java.lang.Object ref = id_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              id_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Exchange-specific publisher ID.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @return The bytes for id.
         */
        public com.google.protobuf.ByteString
            getIdBytes() {
          java.lang.Object ref = id_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            id_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Exchange-specific publisher ID.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @param value The id to set.
         * @return This builder for chaining.
         */
        public Builder setId(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
          id_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Exchange-specific publisher ID.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @return This builder for chaining.
         */
        public Builder clearId() {
          bitField0_ = (bitField0_ & ~0x00000001);
          id_ = getDefaultInstance().getId();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Exchange-specific publisher ID.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @param value The bytes for id to set.
         * @return This builder for chaining.
         */
        public Builder setIdBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
          id_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object name_ = "";
        /**
         * <pre>
         * Publisher name (may be aliased at publisher's request).
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @return Whether the name field is set.
         */
        public boolean hasName() {
          return ((bitField0_ & 0x00000002) != 0);
        }
        /**
         * <pre>
         * Publisher name (may be aliased at publisher's request).
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @return The name.
         */
        public java.lang.String getName() {
          java.lang.Object ref = name_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              name_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Publisher name (may be aliased at publisher's request).
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @return The bytes for name.
         */
        public com.google.protobuf.ByteString
            getNameBytes() {
          java.lang.Object ref = name_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            name_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Publisher name (may be aliased at publisher's request).
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @param value The name to set.
         * @return This builder for chaining.
         */
        public Builder setName(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
          name_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Publisher name (may be aliased at publisher's request).
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @return This builder for chaining.
         */
        public Builder clearName() {
          bitField0_ = (bitField0_ & ~0x00000002);
          name_ = getDefaultInstance().getName();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Publisher name (may be aliased at publisher's request).
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @param value The bytes for name to set.
         * @return This builder for chaining.
         */
        public Builder setNameBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
          name_ = value;
          onChanged();
          return this;
        }

        private int cattax_ = 1;
        /**
         * <pre>
         * The taxonomy in use.
         * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
         * </pre>
         *
         * <code>optional int32 cattax = 5 [default = 1];</code>
         * @return Whether the cattax field is set.
         */
        @java.lang.Override
        public boolean hasCattax() {
          return ((bitField0_ & 0x00000004) != 0);
        }
        /**
         * <pre>
         * The taxonomy in use.
         * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
         * </pre>
         *
         * <code>optional int32 cattax = 5 [default = 1];</code>
         * @return The cattax.
         */
        @java.lang.Override
        public int getCattax() {
          return cattax_;
        }
        /**
         * <pre>
         * The taxonomy in use.
         * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
         * </pre>
         *
         * <code>optional int32 cattax = 5 [default = 1];</code>
         * @param value The cattax to set.
         * @return This builder for chaining.
         */
        public Builder setCattax(int value) {
          bitField0_ |= 0x00000004;
          cattax_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * The taxonomy in use.
         * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
         * </pre>
         *
         * <code>optional int32 cattax = 5 [default = 1];</code>
         * @return This builder for chaining.
         */
        public Builder clearCattax() {
          bitField0_ = (bitField0_ & ~0x00000004);
          cattax_ = 1;
          onChanged();
          return this;
        }

        private com.google.protobuf.LazyStringList cat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        private void ensureCatIsMutable() {
          if (!((bitField0_ & 0x00000008) != 0)) {
            cat_ = new com.google.protobuf.LazyStringArrayList(cat_);
            bitField0_ |= 0x00000008;
           }
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the publisher.
         * </pre>
         *
         * <code>repeated string cat = 3;</code>
         * @return A list containing the cat.
         */
        public com.google.protobuf.ProtocolStringList
            getCatList() {
          return cat_.getUnmodifiableView();
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the publisher.
         * </pre>
         *
         * <code>repeated string cat = 3;</code>
         * @return The count of cat.
         */
        public int getCatCount() {
          return cat_.size();
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the publisher.
         * </pre>
         *
         * <code>repeated string cat = 3;</code>
         * @param index The index of the element to return.
         * @return The cat at the given index.
         */
        public java.lang.String getCat(int index) {
          return cat_.get(index);
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the publisher.
         * </pre>
         *
         * <code>repeated string cat = 3;</code>
         * @param index The index of the value to return.
         * @return The bytes of the cat at the given index.
         */
        public com.google.protobuf.ByteString
            getCatBytes(int index) {
          return cat_.getByteString(index);
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the publisher.
         * </pre>
         *
         * <code>repeated string cat = 3;</code>
         * @param index The index to set the value at.
         * @param value The cat to set.
         * @return This builder for chaining.
         */
        public Builder setCat(
            int index, java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  ensureCatIsMutable();
          cat_.set(index, value);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the publisher.
         * </pre>
         *
         * <code>repeated string cat = 3;</code>
         * @param value The cat to add.
         * @return This builder for chaining.
         */
        public Builder addCat(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  ensureCatIsMutable();
          cat_.add(value);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the publisher.
         * </pre>
         *
         * <code>repeated string cat = 3;</code>
         * @param values The cat to add.
         * @return This builder for chaining.
         */
        public Builder addAllCat(
            java.lang.Iterable<java.lang.String> values) {
          ensureCatIsMutable();
          com.google.protobuf.AbstractMessageLite.Builder.addAll(
              values, cat_);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the publisher.
         * </pre>
         *
         * <code>repeated string cat = 3;</code>
         * @return This builder for chaining.
         */
        public Builder clearCat() {
          cat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
          bitField0_ = (bitField0_ & ~0x00000008);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the publisher.
         * </pre>
         *
         * <code>repeated string cat = 3;</code>
         * @param value The bytes of the cat to add.
         * @return This builder for chaining.
         */
        public Builder addCatBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  ensureCatIsMutable();
          cat_.add(value);
          onChanged();
          return this;
        }

        private java.lang.Object domain_ = "";
        /**
         * <pre>
         * Highest level domain of the publisher (e.g., "publisher.com").
         * </pre>
         *
         * <code>optional string domain = 4;</code>
         * @return Whether the domain field is set.
         */
        public boolean hasDomain() {
          return ((bitField0_ & 0x00000010) != 0);
        }
        /**
         * <pre>
         * Highest level domain of the publisher (e.g., "publisher.com").
         * </pre>
         *
         * <code>optional string domain = 4;</code>
         * @return The domain.
         */
        public java.lang.String getDomain() {
          java.lang.Object ref = domain_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              domain_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Highest level domain of the publisher (e.g., "publisher.com").
         * </pre>
         *
         * <code>optional string domain = 4;</code>
         * @return The bytes for domain.
         */
        public com.google.protobuf.ByteString
            getDomainBytes() {
          java.lang.Object ref = domain_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            domain_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Highest level domain of the publisher (e.g., "publisher.com").
         * </pre>
         *
         * <code>optional string domain = 4;</code>
         * @param value The domain to set.
         * @return This builder for chaining.
         */
        public Builder setDomain(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
          domain_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Highest level domain of the publisher (e.g., "publisher.com").
         * </pre>
         *
         * <code>optional string domain = 4;</code>
         * @return This builder for chaining.
         */
        public Builder clearDomain() {
          bitField0_ = (bitField0_ & ~0x00000010);
          domain_ = getDefaultInstance().getDomain();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Highest level domain of the publisher (e.g., "publisher.com").
         * </pre>
         *
         * <code>optional string domain = 4;</code>
         * @param value The bytes for domain to set.
         * @return This builder for chaining.
         */
        public Builder setDomainBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
          domain_ = value;
          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:com.iabtechlab.openrtb.v2.BidRequest.Publisher)
      }

      // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.BidRequest.Publisher)
      private static final com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher DEFAULT_INSTANCE;
      static {
        DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher();
      }

      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher getDefaultInstance() {
        return DEFAULT_INSTANCE;
      }

      @java.lang.Deprecated public static final com.google.protobuf.Parser<Publisher>
          PARSER = new com.google.protobuf.AbstractParser<Publisher>() {
        @java.lang.Override
        public Publisher parsePartialFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return new Publisher(input, extensionRegistry);
        }
      };

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

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

      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Publisher getDefaultInstanceForType() {
        return DEFAULT_INSTANCE;
      }

    }

    public interface ContentOrBuilder extends
        // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.BidRequest.Content)
        com.google.protobuf.GeneratedMessageV3.
            ExtendableMessageOrBuilder<Content> {

      /**
       * <pre>
       * ID uniquely identifying the content.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return Whether the id field is set.
       */
      boolean hasId();
      /**
       * <pre>
       * ID uniquely identifying the content.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return The id.
       */
      java.lang.String getId();
      /**
       * <pre>
       * ID uniquely identifying the content.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return The bytes for id.
       */
      com.google.protobuf.ByteString
          getIdBytes();

      /**
       * <pre>
       * Content episode number (typically applies to video content).
       * </pre>
       *
       * <code>optional int32 episode = 2;</code>
       * @return Whether the episode field is set.
       */
      boolean hasEpisode();
      /**
       * <pre>
       * Content episode number (typically applies to video content).
       * </pre>
       *
       * <code>optional int32 episode = 2;</code>
       * @return The episode.
       */
      int getEpisode();

      /**
       * <pre>
       * Content title.
       * Video Examples: "Search Committee" (television), "A New Hope" (movie),
       * or "Endgame" (made for web).
       * Non-Video Example: "Why an Antarctic Glacier Is Melting So Quickly"
       * (Time magazine article).
       * </pre>
       *
       * <code>optional string title = 3;</code>
       * @return Whether the title field is set.
       */
      boolean hasTitle();
      /**
       * <pre>
       * Content title.
       * Video Examples: "Search Committee" (television), "A New Hope" (movie),
       * or "Endgame" (made for web).
       * Non-Video Example: "Why an Antarctic Glacier Is Melting So Quickly"
       * (Time magazine article).
       * </pre>
       *
       * <code>optional string title = 3;</code>
       * @return The title.
       */
      java.lang.String getTitle();
      /**
       * <pre>
       * Content title.
       * Video Examples: "Search Committee" (television), "A New Hope" (movie),
       * or "Endgame" (made for web).
       * Non-Video Example: "Why an Antarctic Glacier Is Melting So Quickly"
       * (Time magazine article).
       * </pre>
       *
       * <code>optional string title = 3;</code>
       * @return The bytes for title.
       */
      com.google.protobuf.ByteString
          getTitleBytes();

      /**
       * <pre>
       * Content series.
       * Video Examples: "The Office" (television), "Star Wars" (movie),
       * or "Arby 'N' The Chief" (made for web).
       * Non-Video Example: "Ecocentric" (Time Magazine blog).
       * </pre>
       *
       * <code>optional string series = 4;</code>
       * @return Whether the series field is set.
       */
      boolean hasSeries();
      /**
       * <pre>
       * Content series.
       * Video Examples: "The Office" (television), "Star Wars" (movie),
       * or "Arby 'N' The Chief" (made for web).
       * Non-Video Example: "Ecocentric" (Time Magazine blog).
       * </pre>
       *
       * <code>optional string series = 4;</code>
       * @return The series.
       */
      java.lang.String getSeries();
      /**
       * <pre>
       * Content series.
       * Video Examples: "The Office" (television), "Star Wars" (movie),
       * or "Arby 'N' The Chief" (made for web).
       * Non-Video Example: "Ecocentric" (Time Magazine blog).
       * </pre>
       *
       * <code>optional string series = 4;</code>
       * @return The bytes for series.
       */
      com.google.protobuf.ByteString
          getSeriesBytes();

      /**
       * <pre>
       * Content season; typically for video content (e.g., "Season 3").
       * </pre>
       *
       * <code>optional string season = 5;</code>
       * @return Whether the season field is set.
       */
      boolean hasSeason();
      /**
       * <pre>
       * Content season; typically for video content (e.g., "Season 3").
       * </pre>
       *
       * <code>optional string season = 5;</code>
       * @return The season.
       */
      java.lang.String getSeason();
      /**
       * <pre>
       * Content season; typically for video content (e.g., "Season 3").
       * </pre>
       *
       * <code>optional string season = 5;</code>
       * @return The bytes for season.
       */
      com.google.protobuf.ByteString
          getSeasonBytes();

      /**
       * <pre>
       * Artist credited with the content.
       * </pre>
       *
       * <code>optional string artist = 21;</code>
       * @return Whether the artist field is set.
       */
      boolean hasArtist();
      /**
       * <pre>
       * Artist credited with the content.
       * </pre>
       *
       * <code>optional string artist = 21;</code>
       * @return The artist.
       */
      java.lang.String getArtist();
      /**
       * <pre>
       * Artist credited with the content.
       * </pre>
       *
       * <code>optional string artist = 21;</code>
       * @return The bytes for artist.
       */
      com.google.protobuf.ByteString
          getArtistBytes();

      /**
       * <pre>
       * Genre that best describes the content (e.g., rock, pop, etc).
       * </pre>
       *
       * <code>optional string genre = 22;</code>
       * @return Whether the genre field is set.
       */
      boolean hasGenre();
      /**
       * <pre>
       * Genre that best describes the content (e.g., rock, pop, etc).
       * </pre>
       *
       * <code>optional string genre = 22;</code>
       * @return The genre.
       */
      java.lang.String getGenre();
      /**
       * <pre>
       * Genre that best describes the content (e.g., rock, pop, etc).
       * </pre>
       *
       * <code>optional string genre = 22;</code>
       * @return The bytes for genre.
       */
      com.google.protobuf.ByteString
          getGenreBytes();

      /**
       * <pre>
       * Album to which the content belongs; typically for audio.
       * </pre>
       *
       * <code>optional string album = 23;</code>
       * @return Whether the album field is set.
       */
      boolean hasAlbum();
      /**
       * <pre>
       * Album to which the content belongs; typically for audio.
       * </pre>
       *
       * <code>optional string album = 23;</code>
       * @return The album.
       */
      java.lang.String getAlbum();
      /**
       * <pre>
       * Album to which the content belongs; typically for audio.
       * </pre>
       *
       * <code>optional string album = 23;</code>
       * @return The bytes for album.
       */
      com.google.protobuf.ByteString
          getAlbumBytes();

      /**
       * <pre>
       * International Standard Recording Code conforming to ISO-3901.
       * </pre>
       *
       * <code>optional string isrc = 24;</code>
       * @return Whether the isrc field is set.
       */
      boolean hasIsrc();
      /**
       * <pre>
       * International Standard Recording Code conforming to ISO-3901.
       * </pre>
       *
       * <code>optional string isrc = 24;</code>
       * @return The isrc.
       */
      java.lang.String getIsrc();
      /**
       * <pre>
       * International Standard Recording Code conforming to ISO-3901.
       * </pre>
       *
       * <code>optional string isrc = 24;</code>
       * @return The bytes for isrc.
       */
      com.google.protobuf.ByteString
          getIsrcBytes();

      /**
       * <pre>
       * URL of the content, for buy-side contextualization or review.
       * </pre>
       *
       * <code>optional string url = 6;</code>
       * @return Whether the url field is set.
       */
      boolean hasUrl();
      /**
       * <pre>
       * URL of the content, for buy-side contextualization or review.
       * </pre>
       *
       * <code>optional string url = 6;</code>
       * @return The url.
       */
      java.lang.String getUrl();
      /**
       * <pre>
       * URL of the content, for buy-side contextualization or review.
       * </pre>
       *
       * <code>optional string url = 6;</code>
       * @return The bytes for url.
       */
      com.google.protobuf.ByteString
          getUrlBytes();

      /**
       * <pre>
       * The taxonomy in use.
       * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
       * </pre>
       *
       * <code>optional int32 cattax = 27 [default = 1];</code>
       * @return Whether the cattax field is set.
       */
      boolean hasCattax();
      /**
       * <pre>
       * The taxonomy in use.
       * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
       * </pre>
       *
       * <code>optional int32 cattax = 27 [default = 1];</code>
       * @return The cattax.
       */
      int getCattax();

      /**
       * <pre>
       * Array of IAB content categories that describe the content.
       * </pre>
       *
       * <code>repeated string cat = 7;</code>
       * @return A list containing the cat.
       */
      java.util.List<java.lang.String>
          getCatList();
      /**
       * <pre>
       * Array of IAB content categories that describe the content.
       * </pre>
       *
       * <code>repeated string cat = 7;</code>
       * @return The count of cat.
       */
      int getCatCount();
      /**
       * <pre>
       * Array of IAB content categories that describe the content.
       * </pre>
       *
       * <code>repeated string cat = 7;</code>
       * @param index The index of the element to return.
       * @return The cat at the given index.
       */
      java.lang.String getCat(int index);
      /**
       * <pre>
       * Array of IAB content categories that describe the content.
       * </pre>
       *
       * <code>repeated string cat = 7;</code>
       * @param index The index of the value to return.
       * @return The bytes of the cat at the given index.
       */
      com.google.protobuf.ByteString
          getCatBytes(int index);

      /**
       * <pre>
       * Production quality.
       * Refer to enum com.iabtechlab.adcom.v1.ProductionQuality for generic values.
       * </pre>
       *
       * <code>optional int32 prodq = 25;</code>
       * @return Whether the prodq field is set.
       */
      boolean hasProdq();
      /**
       * <pre>
       * Production quality.
       * Refer to enum com.iabtechlab.adcom.v1.ProductionQuality for generic values.
       * </pre>
       *
       * <code>optional int32 prodq = 25;</code>
       * @return The prodq.
       */
      int getProdq();

      /**
       * <pre>
       * NOTE: Deprecated in favor of prodq.
       * Video quality per IAB's classification.
       * Refer to enum com.iabtechlab.adcom.v1.ProductionQuality for generic values.
       * </pre>
       *
       * <code>optional int32 videoquality = 8 [deprecated = true];</code>
       * @return Whether the videoquality field is set.
       */
      @java.lang.Deprecated boolean hasVideoquality();
      /**
       * <pre>
       * NOTE: Deprecated in favor of prodq.
       * Video quality per IAB's classification.
       * Refer to enum com.iabtechlab.adcom.v1.ProductionQuality for generic values.
       * </pre>
       *
       * <code>optional int32 videoquality = 8 [deprecated = true];</code>
       * @return The videoquality.
       */
      @java.lang.Deprecated int getVideoquality();

      /**
       * <pre>
       * Comma separated list of keywords describing the content.
       * Note: OpenRTB 2.2 allowed an array-of-strings as alternate implementation
       * but this was fixed in 2.3+ where it's definitely a single string with CSV
       * content again. Compatibility with some OpenRTB 2.2 exchanges that adopted
       * the alternate representation may require custom handling of the JSON.
       * </pre>
       *
       * <code>optional string keywords = 9;</code>
       * @return Whether the keywords field is set.
       */
      boolean hasKeywords();
      /**
       * <pre>
       * Comma separated list of keywords describing the content.
       * Note: OpenRTB 2.2 allowed an array-of-strings as alternate implementation
       * but this was fixed in 2.3+ where it's definitely a single string with CSV
       * content again. Compatibility with some OpenRTB 2.2 exchanges that adopted
       * the alternate representation may require custom handling of the JSON.
       * </pre>
       *
       * <code>optional string keywords = 9;</code>
       * @return The keywords.
       */
      java.lang.String getKeywords();
      /**
       * <pre>
       * Comma separated list of keywords describing the content.
       * Note: OpenRTB 2.2 allowed an array-of-strings as alternate implementation
       * but this was fixed in 2.3+ where it's definitely a single string with CSV
       * content again. Compatibility with some OpenRTB 2.2 exchanges that adopted
       * the alternate representation may require custom handling of the JSON.
       * </pre>
       *
       * <code>optional string keywords = 9;</code>
       * @return The bytes for keywords.
       */
      com.google.protobuf.ByteString
          getKeywordsBytes();

      /**
       * <pre>
       * Content rating (e.g., MPAA).
       * </pre>
       *
       * <code>optional string contentrating = 10;</code>
       * @return Whether the contentrating field is set.
       */
      boolean hasContentrating();
      /**
       * <pre>
       * Content rating (e.g., MPAA).
       * </pre>
       *
       * <code>optional string contentrating = 10;</code>
       * @return The contentrating.
       */
      java.lang.String getContentrating();
      /**
       * <pre>
       * Content rating (e.g., MPAA).
       * </pre>
       *
       * <code>optional string contentrating = 10;</code>
       * @return The bytes for contentrating.
       */
      com.google.protobuf.ByteString
          getContentratingBytes();

      /**
       * <pre>
       * User rating of the content (e.g., number of stars, likes, etc.).
       * Refer to enum com.iabtechlab.adcom.v1.enums.ContentContext for generic values.
       * </pre>
       *
       * <code>optional string userrating = 11;</code>
       * @return Whether the userrating field is set.
       */
      boolean hasUserrating();
      /**
       * <pre>
       * User rating of the content (e.g., number of stars, likes, etc.).
       * Refer to enum com.iabtechlab.adcom.v1.enums.ContentContext for generic values.
       * </pre>
       *
       * <code>optional string userrating = 11;</code>
       * @return The userrating.
       */
      java.lang.String getUserrating();
      /**
       * <pre>
       * User rating of the content (e.g., number of stars, likes, etc.).
       * Refer to enum com.iabtechlab.adcom.v1.enums.ContentContext for generic values.
       * </pre>
       *
       * <code>optional string userrating = 11;</code>
       * @return The bytes for userrating.
       */
      com.google.protobuf.ByteString
          getUserratingBytes();

      /**
       * <pre>
       * Type of content (game, video, text, etc.).
       * </pre>
       *
       * <code>optional int32 context = 20;</code>
       * @return Whether the context field is set.
       */
      boolean hasContext();
      /**
       * <pre>
       * Type of content (game, video, text, etc.).
       * </pre>
       *
       * <code>optional int32 context = 20;</code>
       * @return The context.
       */
      int getContext();

      /**
       * <pre>
       * OpenRTB &lt;= 2.2 compatibility; use context for 2.3+.
       * </pre>
       *
       * <code>optional string context_22 = 12;</code>
       * @return Whether the context22 field is set.
       */
      boolean hasContext22();
      /**
       * <pre>
       * OpenRTB &lt;= 2.2 compatibility; use context for 2.3+.
       * </pre>
       *
       * <code>optional string context_22 = 12;</code>
       * @return The context22.
       */
      java.lang.String getContext22();
      /**
       * <pre>
       * OpenRTB &lt;= 2.2 compatibility; use context for 2.3+.
       * </pre>
       *
       * <code>optional string context_22 = 12;</code>
       * @return The bytes for context22.
       */
      com.google.protobuf.ByteString
          getContext22Bytes();

      /**
       * <pre>
       * 0 = not live, 1 = content is live (e.g., stream, live blog).
       * </pre>
       *
       * <code>optional bool livestream = 13;</code>
       * @return Whether the livestream field is set.
       */
      boolean hasLivestream();
      /**
       * <pre>
       * 0 = not live, 1 = content is live (e.g., stream, live blog).
       * </pre>
       *
       * <code>optional bool livestream = 13;</code>
       * @return The livestream.
       */
      boolean getLivestream();

      /**
       * <pre>
       * 0 = indirect, 1 = direct.
       * </pre>
       *
       * <code>optional bool sourcerelationship = 14;</code>
       * @return Whether the sourcerelationship field is set.
       */
      boolean hasSourcerelationship();
      /**
       * <pre>
       * 0 = indirect, 1 = direct.
       * </pre>
       *
       * <code>optional bool sourcerelationship = 14;</code>
       * @return The sourcerelationship.
       */
      boolean getSourcerelationship();

      /**
       * <pre>
       * Details about the content Producer (Section 3.2.10).
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Producer producer = 15;</code>
       * @return Whether the producer field is set.
       */
      boolean hasProducer();
      /**
       * <pre>
       * Details about the content Producer (Section 3.2.10).
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Producer producer = 15;</code>
       * @return The producer.
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer getProducer();
      /**
       * <pre>
       * Details about the content Producer (Section 3.2.10).
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Producer producer = 15;</code>
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.ProducerOrBuilder getProducerOrBuilder();

      /**
       * <pre>
       * Length of content in seconds; appropriate for video or audio.
       * </pre>
       *
       * <code>optional int32 len = 16;</code>
       * @return Whether the len field is set.
       */
      boolean hasLen();
      /**
       * <pre>
       * Length of content in seconds; appropriate for video or audio.
       * </pre>
       *
       * <code>optional int32 len = 16;</code>
       * @return The len.
       */
      int getLen();

      /**
       * <pre>
       * Media rating per QAG guidelines.
       * Refer to enum com.iabtechlab.adcom.v1.MediaRating for generic values.
       * </pre>
       *
       * <code>optional int32 qagmediarating = 17;</code>
       * @return Whether the qagmediarating field is set.
       */
      boolean hasQagmediarating();
      /**
       * <pre>
       * Media rating per QAG guidelines.
       * Refer to enum com.iabtechlab.adcom.v1.MediaRating for generic values.
       * </pre>
       *
       * <code>optional int32 qagmediarating = 17;</code>
       * @return The qagmediarating.
       */
      int getQagmediarating();

      /**
       * <pre>
       * Indicator of whether or not the content is embeddable (e.g., an
       * embeddable video player), where 0 = no, 1 = yes.
       * </pre>
       *
       * <code>optional bool embeddable = 18;</code>
       * @return Whether the embeddable field is set.
       */
      boolean hasEmbeddable();
      /**
       * <pre>
       * Indicator of whether or not the content is embeddable (e.g., an
       * embeddable video player), where 0 = no, 1 = yes.
       * </pre>
       *
       * <code>optional bool embeddable = 18;</code>
       * @return The embeddable.
       */
      boolean getEmbeddable();

      /**
       * <pre>
       * Content language using ISO-639-1-alpha-2.
       * </pre>
       *
       * <code>optional string language = 19;</code>
       * @return Whether the language field is set.
       */
      boolean hasLanguage();
      /**
       * <pre>
       * Content language using ISO-639-1-alpha-2.
       * </pre>
       *
       * <code>optional string language = 19;</code>
       * @return The language.
       */
      java.lang.String getLanguage();
      /**
       * <pre>
       * Content language using ISO-639-1-alpha-2.
       * </pre>
       *
       * <code>optional string language = 19;</code>
       * @return The bytes for language.
       */
      com.google.protobuf.ByteString
          getLanguageBytes();

      /**
       * <pre>
       * Content language using IETF BCP 47.
       * Only one of language or langb should be present.
       * </pre>
       *
       * <code>optional string langb = 29;</code>
       * @return Whether the langb field is set.
       */
      boolean hasLangb();
      /**
       * <pre>
       * Content language using IETF BCP 47.
       * Only one of language or langb should be present.
       * </pre>
       *
       * <code>optional string langb = 29;</code>
       * @return The langb.
       */
      java.lang.String getLangb();
      /**
       * <pre>
       * Content language using IETF BCP 47.
       * Only one of language or langb should be present.
       * </pre>
       *
       * <code>optional string langb = 29;</code>
       * @return The bytes for langb.
       */
      com.google.protobuf.ByteString
          getLangbBytes();

      /**
       * <pre>
       * Additional content data. Each Data object represents a different
       * data source.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 28;</code>
       */
      java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data> 
          getDataList();
      /**
       * <pre>
       * Additional content data. Each Data object represents a different
       * data source.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 28;</code>
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data getData(int index);
      /**
       * <pre>
       * Additional content data. Each Data object represents a different
       * data source.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 28;</code>
       */
      int getDataCount();
      /**
       * <pre>
       * Additional content data. Each Data object represents a different
       * data source.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 28;</code>
       */
      java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.DataOrBuilder> 
          getDataOrBuilderList();
      /**
       * <pre>
       * Additional content data. Each Data object represents a different
       * data source.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 28;</code>
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.DataOrBuilder getDataOrBuilder(
          int index);

      /**
       * <pre>
       * Details about the network the content is on.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Network network = 30;</code>
       * @return Whether the network field is set.
       */
      boolean hasNetwork();
      /**
       * <pre>
       * Details about the network the content is on.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Network network = 30;</code>
       * @return The network.
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network getNetwork();
      /**
       * <pre>
       * Details about the network the content is on.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Network network = 30;</code>
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.NetworkOrBuilder getNetworkOrBuilder();

      /**
       * <pre>
       * Details about the channel the content is on.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Channel channel = 31;</code>
       * @return Whether the channel field is set.
       */
      boolean hasChannel();
      /**
       * <pre>
       * Details about the channel the content is on.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Channel channel = 31;</code>
       * @return The channel.
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel getChannel();
      /**
       * <pre>
       * Details about the channel the content is on.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Channel channel = 31;</code>
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.ChannelOrBuilder getChannelOrBuilder();
    }
    /**
     * <pre>
     * OpenRTB 2.0: This object describes the content in which the impression
     * will appear, which may be syndicated or non-syndicated content.
     * This object may be useful when syndicated content contains impressions and
     * does not necessarily match the publisher's general content.
     * The exchange might or might not have knowledge of the page where the
     * content is running, as a result of the syndication method.
     * For example might be a video impression embedded in an iframe on an
     * unknown web property or device.
     * </pre>
     *
     * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Content}
     */
    public static final class Content extends
        com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
          Content> implements
        // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.BidRequest.Content)
        ContentOrBuilder {
    private static final long serialVersionUID = 0L;
      // Use Content.newBuilder() to construct.
      private Content(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content, ?> builder) {
        super(builder);
      }
      private Content() {
        id_ = "";
        title_ = "";
        series_ = "";
        season_ = "";
        artist_ = "";
        genre_ = "";
        album_ = "";
        isrc_ = "";
        url_ = "";
        cattax_ = 1;
        cat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        keywords_ = "";
        contentrating_ = "";
        userrating_ = "";
        context22_ = "";
        language_ = "";
        langb_ = "";
        data_ = java.util.Collections.emptyList();
      }

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

      @java.lang.Override
      public final com.google.protobuf.UnknownFieldSet
      getUnknownFields() {
        return this.unknownFields;
      }
      private Content(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        this();
        if (extensionRegistry == null) {
          throw new java.lang.NullPointerException();
        }
        int mutable_bitField0_ = 0;
        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
            com.google.protobuf.UnknownFieldSet.newBuilder();
        try {
          boolean done = false;
          while (!done) {
            int tag = input.readTag();
            switch (tag) {
              case 0:
                done = true;
                break;
              case 10: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000001;
                id_ = bs;
                break;
              }
              case 16: {
                bitField0_ |= 0x00000002;
                episode_ = input.readInt32();
                break;
              }
              case 26: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000004;
                title_ = bs;
                break;
              }
              case 34: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000008;
                series_ = bs;
                break;
              }
              case 42: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000010;
                season_ = bs;
                break;
              }
              case 50: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000200;
                url_ = bs;
                break;
              }
              case 58: {
                com.google.protobuf.ByteString bs = input.readBytes();
                if (!((mutable_bitField0_ & 0x00000800) != 0)) {
                  cat_ = new com.google.protobuf.LazyStringArrayList();
                  mutable_bitField0_ |= 0x00000800;
                }
                cat_.add(bs);
                break;
              }
              case 64: {
                bitField0_ |= 0x00001000;
                videoquality_ = input.readInt32();
                break;
              }
              case 74: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00002000;
                keywords_ = bs;
                break;
              }
              case 82: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00004000;
                contentrating_ = bs;
                break;
              }
              case 90: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00008000;
                userrating_ = bs;
                break;
              }
              case 98: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00020000;
                context22_ = bs;
                break;
              }
              case 104: {
                bitField0_ |= 0x00040000;
                livestream_ = input.readBool();
                break;
              }
              case 112: {
                bitField0_ |= 0x00080000;
                sourcerelationship_ = input.readBool();
                break;
              }
              case 122: {
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer.Builder subBuilder = null;
                if (((bitField0_ & 0x00100000) != 0)) {
                  subBuilder = producer_.toBuilder();
                }
                producer_ = input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer.PARSER, extensionRegistry);
                if (subBuilder != null) {
                  subBuilder.mergeFrom(producer_);
                  producer_ = subBuilder.buildPartial();
                }
                bitField0_ |= 0x00100000;
                break;
              }
              case 128: {
                bitField0_ |= 0x00200000;
                len_ = input.readInt32();
                break;
              }
              case 136: {
                bitField0_ |= 0x00400000;
                qagmediarating_ = input.readInt32();
                break;
              }
              case 144: {
                bitField0_ |= 0x00800000;
                embeddable_ = input.readBool();
                break;
              }
              case 154: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x01000000;
                language_ = bs;
                break;
              }
              case 160: {
                bitField0_ |= 0x00010000;
                context_ = input.readInt32();
                break;
              }
              case 170: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000020;
                artist_ = bs;
                break;
              }
              case 178: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000040;
                genre_ = bs;
                break;
              }
              case 186: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000080;
                album_ = bs;
                break;
              }
              case 194: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000100;
                isrc_ = bs;
                break;
              }
              case 200: {
                bitField0_ |= 0x00000800;
                prodq_ = input.readInt32();
                break;
              }
              case 216: {
                bitField0_ |= 0x00000400;
                cattax_ = input.readInt32();
                break;
              }
              case 226: {
                if (!((mutable_bitField0_ & 0x08000000) != 0)) {
                  data_ = new java.util.ArrayList<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data>();
                  mutable_bitField0_ |= 0x08000000;
                }
                data_.add(
                    input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.PARSER, extensionRegistry));
                break;
              }
              case 234: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x02000000;
                langb_ = bs;
                break;
              }
              case 242: {
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network.Builder subBuilder = null;
                if (((bitField0_ & 0x04000000) != 0)) {
                  subBuilder = network_.toBuilder();
                }
                network_ = input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network.PARSER, extensionRegistry);
                if (subBuilder != null) {
                  subBuilder.mergeFrom(network_);
                  network_ = subBuilder.buildPartial();
                }
                bitField0_ |= 0x04000000;
                break;
              }
              case 250: {
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel.Builder subBuilder = null;
                if (((bitField0_ & 0x08000000) != 0)) {
                  subBuilder = channel_.toBuilder();
                }
                channel_ = input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel.PARSER, extensionRegistry);
                if (subBuilder != null) {
                  subBuilder.mergeFrom(channel_);
                  channel_ = subBuilder.buildPartial();
                }
                bitField0_ |= 0x08000000;
                break;
              }
              default: {
                if (!parseUnknownField(
                    input, unknownFields, extensionRegistry, tag)) {
                  done = true;
                }
                break;
              }
            }
          }
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          throw e.setUnfinishedMessage(this);
        } catch (java.io.IOException e) {
          throw new com.google.protobuf.InvalidProtocolBufferException(
              e).setUnfinishedMessage(this);
        } finally {
          if (((mutable_bitField0_ & 0x00000800) != 0)) {
            cat_ = cat_.getUnmodifiableView();
          }
          if (((mutable_bitField0_ & 0x08000000) != 0)) {
            data_ = java.util.Collections.unmodifiableList(data_);
          }
          this.unknownFields = unknownFields.build();
          makeExtensionsImmutable();
        }
      }
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Content_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Content_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content.Builder.class);
      }

      private int bitField0_;
      public static final int ID_FIELD_NUMBER = 1;
      private volatile java.lang.Object id_;
      /**
       * <pre>
       * ID uniquely identifying the content.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return Whether the id field is set.
       */
      @java.lang.Override
      public boolean hasId() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <pre>
       * ID uniquely identifying the content.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return The id.
       */
      @java.lang.Override
      public java.lang.String getId() {
        java.lang.Object ref = id_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            id_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * ID uniquely identifying the content.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return The bytes for id.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getIdBytes() {
        java.lang.Object ref = id_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          id_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int EPISODE_FIELD_NUMBER = 2;
      private int episode_;
      /**
       * <pre>
       * Content episode number (typically applies to video content).
       * </pre>
       *
       * <code>optional int32 episode = 2;</code>
       * @return Whether the episode field is set.
       */
      @java.lang.Override
      public boolean hasEpisode() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <pre>
       * Content episode number (typically applies to video content).
       * </pre>
       *
       * <code>optional int32 episode = 2;</code>
       * @return The episode.
       */
      @java.lang.Override
      public int getEpisode() {
        return episode_;
      }

      public static final int TITLE_FIELD_NUMBER = 3;
      private volatile java.lang.Object title_;
      /**
       * <pre>
       * Content title.
       * Video Examples: "Search Committee" (television), "A New Hope" (movie),
       * or "Endgame" (made for web).
       * Non-Video Example: "Why an Antarctic Glacier Is Melting So Quickly"
       * (Time magazine article).
       * </pre>
       *
       * <code>optional string title = 3;</code>
       * @return Whether the title field is set.
       */
      @java.lang.Override
      public boolean hasTitle() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <pre>
       * Content title.
       * Video Examples: "Search Committee" (television), "A New Hope" (movie),
       * or "Endgame" (made for web).
       * Non-Video Example: "Why an Antarctic Glacier Is Melting So Quickly"
       * (Time magazine article).
       * </pre>
       *
       * <code>optional string title = 3;</code>
       * @return The title.
       */
      @java.lang.Override
      public java.lang.String getTitle() {
        java.lang.Object ref = title_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            title_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Content title.
       * Video Examples: "Search Committee" (television), "A New Hope" (movie),
       * or "Endgame" (made for web).
       * Non-Video Example: "Why an Antarctic Glacier Is Melting So Quickly"
       * (Time magazine article).
       * </pre>
       *
       * <code>optional string title = 3;</code>
       * @return The bytes for title.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getTitleBytes() {
        java.lang.Object ref = title_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          title_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int SERIES_FIELD_NUMBER = 4;
      private volatile java.lang.Object series_;
      /**
       * <pre>
       * Content series.
       * Video Examples: "The Office" (television), "Star Wars" (movie),
       * or "Arby 'N' The Chief" (made for web).
       * Non-Video Example: "Ecocentric" (Time Magazine blog).
       * </pre>
       *
       * <code>optional string series = 4;</code>
       * @return Whether the series field is set.
       */
      @java.lang.Override
      public boolean hasSeries() {
        return ((bitField0_ & 0x00000008) != 0);
      }
      /**
       * <pre>
       * Content series.
       * Video Examples: "The Office" (television), "Star Wars" (movie),
       * or "Arby 'N' The Chief" (made for web).
       * Non-Video Example: "Ecocentric" (Time Magazine blog).
       * </pre>
       *
       * <code>optional string series = 4;</code>
       * @return The series.
       */
      @java.lang.Override
      public java.lang.String getSeries() {
        java.lang.Object ref = series_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            series_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Content series.
       * Video Examples: "The Office" (television), "Star Wars" (movie),
       * or "Arby 'N' The Chief" (made for web).
       * Non-Video Example: "Ecocentric" (Time Magazine blog).
       * </pre>
       *
       * <code>optional string series = 4;</code>
       * @return The bytes for series.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getSeriesBytes() {
        java.lang.Object ref = series_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          series_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int SEASON_FIELD_NUMBER = 5;
      private volatile java.lang.Object season_;
      /**
       * <pre>
       * Content season; typically for video content (e.g., "Season 3").
       * </pre>
       *
       * <code>optional string season = 5;</code>
       * @return Whether the season field is set.
       */
      @java.lang.Override
      public boolean hasSeason() {
        return ((bitField0_ & 0x00000010) != 0);
      }
      /**
       * <pre>
       * Content season; typically for video content (e.g., "Season 3").
       * </pre>
       *
       * <code>optional string season = 5;</code>
       * @return The season.
       */
      @java.lang.Override
      public java.lang.String getSeason() {
        java.lang.Object ref = season_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            season_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Content season; typically for video content (e.g., "Season 3").
       * </pre>
       *
       * <code>optional string season = 5;</code>
       * @return The bytes for season.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getSeasonBytes() {
        java.lang.Object ref = season_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          season_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int ARTIST_FIELD_NUMBER = 21;
      private volatile java.lang.Object artist_;
      /**
       * <pre>
       * Artist credited with the content.
       * </pre>
       *
       * <code>optional string artist = 21;</code>
       * @return Whether the artist field is set.
       */
      @java.lang.Override
      public boolean hasArtist() {
        return ((bitField0_ & 0x00000020) != 0);
      }
      /**
       * <pre>
       * Artist credited with the content.
       * </pre>
       *
       * <code>optional string artist = 21;</code>
       * @return The artist.
       */
      @java.lang.Override
      public java.lang.String getArtist() {
        java.lang.Object ref = artist_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            artist_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Artist credited with the content.
       * </pre>
       *
       * <code>optional string artist = 21;</code>
       * @return The bytes for artist.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getArtistBytes() {
        java.lang.Object ref = artist_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          artist_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int GENRE_FIELD_NUMBER = 22;
      private volatile java.lang.Object genre_;
      /**
       * <pre>
       * Genre that best describes the content (e.g., rock, pop, etc).
       * </pre>
       *
       * <code>optional string genre = 22;</code>
       * @return Whether the genre field is set.
       */
      @java.lang.Override
      public boolean hasGenre() {
        return ((bitField0_ & 0x00000040) != 0);
      }
      /**
       * <pre>
       * Genre that best describes the content (e.g., rock, pop, etc).
       * </pre>
       *
       * <code>optional string genre = 22;</code>
       * @return The genre.
       */
      @java.lang.Override
      public java.lang.String getGenre() {
        java.lang.Object ref = genre_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            genre_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Genre that best describes the content (e.g., rock, pop, etc).
       * </pre>
       *
       * <code>optional string genre = 22;</code>
       * @return The bytes for genre.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getGenreBytes() {
        java.lang.Object ref = genre_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          genre_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int ALBUM_FIELD_NUMBER = 23;
      private volatile java.lang.Object album_;
      /**
       * <pre>
       * Album to which the content belongs; typically for audio.
       * </pre>
       *
       * <code>optional string album = 23;</code>
       * @return Whether the album field is set.
       */
      @java.lang.Override
      public boolean hasAlbum() {
        return ((bitField0_ & 0x00000080) != 0);
      }
      /**
       * <pre>
       * Album to which the content belongs; typically for audio.
       * </pre>
       *
       * <code>optional string album = 23;</code>
       * @return The album.
       */
      @java.lang.Override
      public java.lang.String getAlbum() {
        java.lang.Object ref = album_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            album_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Album to which the content belongs; typically for audio.
       * </pre>
       *
       * <code>optional string album = 23;</code>
       * @return The bytes for album.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getAlbumBytes() {
        java.lang.Object ref = album_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          album_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int ISRC_FIELD_NUMBER = 24;
      private volatile java.lang.Object isrc_;
      /**
       * <pre>
       * International Standard Recording Code conforming to ISO-3901.
       * </pre>
       *
       * <code>optional string isrc = 24;</code>
       * @return Whether the isrc field is set.
       */
      @java.lang.Override
      public boolean hasIsrc() {
        return ((bitField0_ & 0x00000100) != 0);
      }
      /**
       * <pre>
       * International Standard Recording Code conforming to ISO-3901.
       * </pre>
       *
       * <code>optional string isrc = 24;</code>
       * @return The isrc.
       */
      @java.lang.Override
      public java.lang.String getIsrc() {
        java.lang.Object ref = isrc_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            isrc_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * International Standard Recording Code conforming to ISO-3901.
       * </pre>
       *
       * <code>optional string isrc = 24;</code>
       * @return The bytes for isrc.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getIsrcBytes() {
        java.lang.Object ref = isrc_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          isrc_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int URL_FIELD_NUMBER = 6;
      private volatile java.lang.Object url_;
      /**
       * <pre>
       * URL of the content, for buy-side contextualization or review.
       * </pre>
       *
       * <code>optional string url = 6;</code>
       * @return Whether the url field is set.
       */
      @java.lang.Override
      public boolean hasUrl() {
        return ((bitField0_ & 0x00000200) != 0);
      }
      /**
       * <pre>
       * URL of the content, for buy-side contextualization or review.
       * </pre>
       *
       * <code>optional string url = 6;</code>
       * @return The url.
       */
      @java.lang.Override
      public java.lang.String getUrl() {
        java.lang.Object ref = url_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            url_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * URL of the content, for buy-side contextualization or review.
       * </pre>
       *
       * <code>optional string url = 6;</code>
       * @return The bytes for url.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getUrlBytes() {
        java.lang.Object ref = url_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          url_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int CATTAX_FIELD_NUMBER = 27;
      private int cattax_;
      /**
       * <pre>
       * The taxonomy in use.
       * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
       * </pre>
       *
       * <code>optional int32 cattax = 27 [default = 1];</code>
       * @return Whether the cattax field is set.
       */
      @java.lang.Override
      public boolean hasCattax() {
        return ((bitField0_ & 0x00000400) != 0);
      }
      /**
       * <pre>
       * The taxonomy in use.
       * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
       * </pre>
       *
       * <code>optional int32 cattax = 27 [default = 1];</code>
       * @return The cattax.
       */
      @java.lang.Override
      public int getCattax() {
        return cattax_;
      }

      public static final int CAT_FIELD_NUMBER = 7;
      private com.google.protobuf.LazyStringList cat_;
      /**
       * <pre>
       * Array of IAB content categories that describe the content.
       * </pre>
       *
       * <code>repeated string cat = 7;</code>
       * @return A list containing the cat.
       */
      public com.google.protobuf.ProtocolStringList
          getCatList() {
        return cat_;
      }
      /**
       * <pre>
       * Array of IAB content categories that describe the content.
       * </pre>
       *
       * <code>repeated string cat = 7;</code>
       * @return The count of cat.
       */
      public int getCatCount() {
        return cat_.size();
      }
      /**
       * <pre>
       * Array of IAB content categories that describe the content.
       * </pre>
       *
       * <code>repeated string cat = 7;</code>
       * @param index The index of the element to return.
       * @return The cat at the given index.
       */
      public java.lang.String getCat(int index) {
        return cat_.get(index);
      }
      /**
       * <pre>
       * Array of IAB content categories that describe the content.
       * </pre>
       *
       * <code>repeated string cat = 7;</code>
       * @param index The index of the value to return.
       * @return The bytes of the cat at the given index.
       */
      public com.google.protobuf.ByteString
          getCatBytes(int index) {
        return cat_.getByteString(index);
      }

      public static final int PRODQ_FIELD_NUMBER = 25;
      private int prodq_;
      /**
       * <pre>
       * Production quality.
       * Refer to enum com.iabtechlab.adcom.v1.ProductionQuality for generic values.
       * </pre>
       *
       * <code>optional int32 prodq = 25;</code>
       * @return Whether the prodq field is set.
       */
      @java.lang.Override
      public boolean hasProdq() {
        return ((bitField0_ & 0x00000800) != 0);
      }
      /**
       * <pre>
       * Production quality.
       * Refer to enum com.iabtechlab.adcom.v1.ProductionQuality for generic values.
       * </pre>
       *
       * <code>optional int32 prodq = 25;</code>
       * @return The prodq.
       */
      @java.lang.Override
      public int getProdq() {
        return prodq_;
      }

      public static final int VIDEOQUALITY_FIELD_NUMBER = 8;
      private int videoquality_;
      /**
       * <pre>
       * NOTE: Deprecated in favor of prodq.
       * Video quality per IAB's classification.
       * Refer to enum com.iabtechlab.adcom.v1.ProductionQuality for generic values.
       * </pre>
       *
       * <code>optional int32 videoquality = 8 [deprecated = true];</code>
       * @return Whether the videoquality field is set.
       */
      @java.lang.Override
      @java.lang.Deprecated public boolean hasVideoquality() {
        return ((bitField0_ & 0x00001000) != 0);
      }
      /**
       * <pre>
       * NOTE: Deprecated in favor of prodq.
       * Video quality per IAB's classification.
       * Refer to enum com.iabtechlab.adcom.v1.ProductionQuality for generic values.
       * </pre>
       *
       * <code>optional int32 videoquality = 8 [deprecated = true];</code>
       * @return The videoquality.
       */
      @java.lang.Override
      @java.lang.Deprecated public int getVideoquality() {
        return videoquality_;
      }

      public static final int KEYWORDS_FIELD_NUMBER = 9;
      private volatile java.lang.Object keywords_;
      /**
       * <pre>
       * Comma separated list of keywords describing the content.
       * Note: OpenRTB 2.2 allowed an array-of-strings as alternate implementation
       * but this was fixed in 2.3+ where it's definitely a single string with CSV
       * content again. Compatibility with some OpenRTB 2.2 exchanges that adopted
       * the alternate representation may require custom handling of the JSON.
       * </pre>
       *
       * <code>optional string keywords = 9;</code>
       * @return Whether the keywords field is set.
       */
      @java.lang.Override
      public boolean hasKeywords() {
        return ((bitField0_ & 0x00002000) != 0);
      }
      /**
       * <pre>
       * Comma separated list of keywords describing the content.
       * Note: OpenRTB 2.2 allowed an array-of-strings as alternate implementation
       * but this was fixed in 2.3+ where it's definitely a single string with CSV
       * content again. Compatibility with some OpenRTB 2.2 exchanges that adopted
       * the alternate representation may require custom handling of the JSON.
       * </pre>
       *
       * <code>optional string keywords = 9;</code>
       * @return The keywords.
       */
      @java.lang.Override
      public java.lang.String getKeywords() {
        java.lang.Object ref = keywords_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            keywords_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Comma separated list of keywords describing the content.
       * Note: OpenRTB 2.2 allowed an array-of-strings as alternate implementation
       * but this was fixed in 2.3+ where it's definitely a single string with CSV
       * content again. Compatibility with some OpenRTB 2.2 exchanges that adopted
       * the alternate representation may require custom handling of the JSON.
       * </pre>
       *
       * <code>optional string keywords = 9;</code>
       * @return The bytes for keywords.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getKeywordsBytes() {
        java.lang.Object ref = keywords_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          keywords_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int CONTENTRATING_FIELD_NUMBER = 10;
      private volatile java.lang.Object contentrating_;
      /**
       * <pre>
       * Content rating (e.g., MPAA).
       * </pre>
       *
       * <code>optional string contentrating = 10;</code>
       * @return Whether the contentrating field is set.
       */
      @java.lang.Override
      public boolean hasContentrating() {
        return ((bitField0_ & 0x00004000) != 0);
      }
      /**
       * <pre>
       * Content rating (e.g., MPAA).
       * </pre>
       *
       * <code>optional string contentrating = 10;</code>
       * @return The contentrating.
       */
      @java.lang.Override
      public java.lang.String getContentrating() {
        java.lang.Object ref = contentrating_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            contentrating_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Content rating (e.g., MPAA).
       * </pre>
       *
       * <code>optional string contentrating = 10;</code>
       * @return The bytes for contentrating.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getContentratingBytes() {
        java.lang.Object ref = contentrating_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          contentrating_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int USERRATING_FIELD_NUMBER = 11;
      private volatile java.lang.Object userrating_;
      /**
       * <pre>
       * User rating of the content (e.g., number of stars, likes, etc.).
       * Refer to enum com.iabtechlab.adcom.v1.enums.ContentContext for generic values.
       * </pre>
       *
       * <code>optional string userrating = 11;</code>
       * @return Whether the userrating field is set.
       */
      @java.lang.Override
      public boolean hasUserrating() {
        return ((bitField0_ & 0x00008000) != 0);
      }
      /**
       * <pre>
       * User rating of the content (e.g., number of stars, likes, etc.).
       * Refer to enum com.iabtechlab.adcom.v1.enums.ContentContext for generic values.
       * </pre>
       *
       * <code>optional string userrating = 11;</code>
       * @return The userrating.
       */
      @java.lang.Override
      public java.lang.String getUserrating() {
        java.lang.Object ref = userrating_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            userrating_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * User rating of the content (e.g., number of stars, likes, etc.).
       * Refer to enum com.iabtechlab.adcom.v1.enums.ContentContext for generic values.
       * </pre>
       *
       * <code>optional string userrating = 11;</code>
       * @return The bytes for userrating.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getUserratingBytes() {
        java.lang.Object ref = userrating_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          userrating_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int CONTEXT_FIELD_NUMBER = 20;
      private int context_;
      /**
       * <pre>
       * Type of content (game, video, text, etc.).
       * </pre>
       *
       * <code>optional int32 context = 20;</code>
       * @return Whether the context field is set.
       */
      @java.lang.Override
      public boolean hasContext() {
        return ((bitField0_ & 0x00010000) != 0);
      }
      /**
       * <pre>
       * Type of content (game, video, text, etc.).
       * </pre>
       *
       * <code>optional int32 context = 20;</code>
       * @return The context.
       */
      @java.lang.Override
      public int getContext() {
        return context_;
      }

      public static final int CONTEXT_22_FIELD_NUMBER = 12;
      private volatile java.lang.Object context22_;
      /**
       * <pre>
       * OpenRTB &lt;= 2.2 compatibility; use context for 2.3+.
       * </pre>
       *
       * <code>optional string context_22 = 12;</code>
       * @return Whether the context22 field is set.
       */
      @java.lang.Override
      public boolean hasContext22() {
        return ((bitField0_ & 0x00020000) != 0);
      }
      /**
       * <pre>
       * OpenRTB &lt;= 2.2 compatibility; use context for 2.3+.
       * </pre>
       *
       * <code>optional string context_22 = 12;</code>
       * @return The context22.
       */
      @java.lang.Override
      public java.lang.String getContext22() {
        java.lang.Object ref = context22_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            context22_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * OpenRTB &lt;= 2.2 compatibility; use context for 2.3+.
       * </pre>
       *
       * <code>optional string context_22 = 12;</code>
       * @return The bytes for context22.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getContext22Bytes() {
        java.lang.Object ref = context22_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          context22_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int LIVESTREAM_FIELD_NUMBER = 13;
      private boolean livestream_;
      /**
       * <pre>
       * 0 = not live, 1 = content is live (e.g., stream, live blog).
       * </pre>
       *
       * <code>optional bool livestream = 13;</code>
       * @return Whether the livestream field is set.
       */
      @java.lang.Override
      public boolean hasLivestream() {
        return ((bitField0_ & 0x00040000) != 0);
      }
      /**
       * <pre>
       * 0 = not live, 1 = content is live (e.g., stream, live blog).
       * </pre>
       *
       * <code>optional bool livestream = 13;</code>
       * @return The livestream.
       */
      @java.lang.Override
      public boolean getLivestream() {
        return livestream_;
      }

      public static final int SOURCERELATIONSHIP_FIELD_NUMBER = 14;
      private boolean sourcerelationship_;
      /**
       * <pre>
       * 0 = indirect, 1 = direct.
       * </pre>
       *
       * <code>optional bool sourcerelationship = 14;</code>
       * @return Whether the sourcerelationship field is set.
       */
      @java.lang.Override
      public boolean hasSourcerelationship() {
        return ((bitField0_ & 0x00080000) != 0);
      }
      /**
       * <pre>
       * 0 = indirect, 1 = direct.
       * </pre>
       *
       * <code>optional bool sourcerelationship = 14;</code>
       * @return The sourcerelationship.
       */
      @java.lang.Override
      public boolean getSourcerelationship() {
        return sourcerelationship_;
      }

      public static final int PRODUCER_FIELD_NUMBER = 15;
      private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer producer_;
      /**
       * <pre>
       * Details about the content Producer (Section 3.2.10).
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Producer producer = 15;</code>
       * @return Whether the producer field is set.
       */
      @java.lang.Override
      public boolean hasProducer() {
        return ((bitField0_ & 0x00100000) != 0);
      }
      /**
       * <pre>
       * Details about the content Producer (Section 3.2.10).
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Producer producer = 15;</code>
       * @return The producer.
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer getProducer() {
        return producer_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer.getDefaultInstance() : producer_;
      }
      /**
       * <pre>
       * Details about the content Producer (Section 3.2.10).
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Producer producer = 15;</code>
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.ProducerOrBuilder getProducerOrBuilder() {
        return producer_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer.getDefaultInstance() : producer_;
      }

      public static final int LEN_FIELD_NUMBER = 16;
      private int len_;
      /**
       * <pre>
       * Length of content in seconds; appropriate for video or audio.
       * </pre>
       *
       * <code>optional int32 len = 16;</code>
       * @return Whether the len field is set.
       */
      @java.lang.Override
      public boolean hasLen() {
        return ((bitField0_ & 0x00200000) != 0);
      }
      /**
       * <pre>
       * Length of content in seconds; appropriate for video or audio.
       * </pre>
       *
       * <code>optional int32 len = 16;</code>
       * @return The len.
       */
      @java.lang.Override
      public int getLen() {
        return len_;
      }

      public static final int QAGMEDIARATING_FIELD_NUMBER = 17;
      private int qagmediarating_;
      /**
       * <pre>
       * Media rating per QAG guidelines.
       * Refer to enum com.iabtechlab.adcom.v1.MediaRating for generic values.
       * </pre>
       *
       * <code>optional int32 qagmediarating = 17;</code>
       * @return Whether the qagmediarating field is set.
       */
      @java.lang.Override
      public boolean hasQagmediarating() {
        return ((bitField0_ & 0x00400000) != 0);
      }
      /**
       * <pre>
       * Media rating per QAG guidelines.
       * Refer to enum com.iabtechlab.adcom.v1.MediaRating for generic values.
       * </pre>
       *
       * <code>optional int32 qagmediarating = 17;</code>
       * @return The qagmediarating.
       */
      @java.lang.Override
      public int getQagmediarating() {
        return qagmediarating_;
      }

      public static final int EMBEDDABLE_FIELD_NUMBER = 18;
      private boolean embeddable_;
      /**
       * <pre>
       * Indicator of whether or not the content is embeddable (e.g., an
       * embeddable video player), where 0 = no, 1 = yes.
       * </pre>
       *
       * <code>optional bool embeddable = 18;</code>
       * @return Whether the embeddable field is set.
       */
      @java.lang.Override
      public boolean hasEmbeddable() {
        return ((bitField0_ & 0x00800000) != 0);
      }
      /**
       * <pre>
       * Indicator of whether or not the content is embeddable (e.g., an
       * embeddable video player), where 0 = no, 1 = yes.
       * </pre>
       *
       * <code>optional bool embeddable = 18;</code>
       * @return The embeddable.
       */
      @java.lang.Override
      public boolean getEmbeddable() {
        return embeddable_;
      }

      public static final int LANGUAGE_FIELD_NUMBER = 19;
      private volatile java.lang.Object language_;
      /**
       * <pre>
       * Content language using ISO-639-1-alpha-2.
       * </pre>
       *
       * <code>optional string language = 19;</code>
       * @return Whether the language field is set.
       */
      @java.lang.Override
      public boolean hasLanguage() {
        return ((bitField0_ & 0x01000000) != 0);
      }
      /**
       * <pre>
       * Content language using ISO-639-1-alpha-2.
       * </pre>
       *
       * <code>optional string language = 19;</code>
       * @return The language.
       */
      @java.lang.Override
      public java.lang.String getLanguage() {
        java.lang.Object ref = language_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            language_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Content language using ISO-639-1-alpha-2.
       * </pre>
       *
       * <code>optional string language = 19;</code>
       * @return The bytes for language.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getLanguageBytes() {
        java.lang.Object ref = language_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          language_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int LANGB_FIELD_NUMBER = 29;
      private volatile java.lang.Object langb_;
      /**
       * <pre>
       * Content language using IETF BCP 47.
       * Only one of language or langb should be present.
       * </pre>
       *
       * <code>optional string langb = 29;</code>
       * @return Whether the langb field is set.
       */
      @java.lang.Override
      public boolean hasLangb() {
        return ((bitField0_ & 0x02000000) != 0);
      }
      /**
       * <pre>
       * Content language using IETF BCP 47.
       * Only one of language or langb should be present.
       * </pre>
       *
       * <code>optional string langb = 29;</code>
       * @return The langb.
       */
      @java.lang.Override
      public java.lang.String getLangb() {
        java.lang.Object ref = langb_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            langb_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Content language using IETF BCP 47.
       * Only one of language or langb should be present.
       * </pre>
       *
       * <code>optional string langb = 29;</code>
       * @return The bytes for langb.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getLangbBytes() {
        java.lang.Object ref = langb_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          langb_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int DATA_FIELD_NUMBER = 28;
      private java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data> data_;
      /**
       * <pre>
       * Additional content data. Each Data object represents a different
       * data source.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 28;</code>
       */
      @java.lang.Override
      public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data> getDataList() {
        return data_;
      }
      /**
       * <pre>
       * Additional content data. Each Data object represents a different
       * data source.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 28;</code>
       */
      @java.lang.Override
      public java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.DataOrBuilder> 
          getDataOrBuilderList() {
        return data_;
      }
      /**
       * <pre>
       * Additional content data. Each Data object represents a different
       * data source.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 28;</code>
       */
      @java.lang.Override
      public int getDataCount() {
        return data_.size();
      }
      /**
       * <pre>
       * Additional content data. Each Data object represents a different
       * data source.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 28;</code>
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data getData(int index) {
        return data_.get(index);
      }
      /**
       * <pre>
       * Additional content data. Each Data object represents a different
       * data source.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 28;</code>
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.DataOrBuilder getDataOrBuilder(
          int index) {
        return data_.get(index);
      }

      public static final int NETWORK_FIELD_NUMBER = 30;
      private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network network_;
      /**
       * <pre>
       * Details about the network the content is on.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Network network = 30;</code>
       * @return Whether the network field is set.
       */
      @java.lang.Override
      public boolean hasNetwork() {
        return ((bitField0_ & 0x04000000) != 0);
      }
      /**
       * <pre>
       * Details about the network the content is on.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Network network = 30;</code>
       * @return The network.
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network getNetwork() {
        return network_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network.getDefaultInstance() : network_;
      }
      /**
       * <pre>
       * Details about the network the content is on.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Network network = 30;</code>
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.NetworkOrBuilder getNetworkOrBuilder() {
        return network_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network.getDefaultInstance() : network_;
      }

      public static final int CHANNEL_FIELD_NUMBER = 31;
      private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel channel_;
      /**
       * <pre>
       * Details about the channel the content is on.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Channel channel = 31;</code>
       * @return Whether the channel field is set.
       */
      @java.lang.Override
      public boolean hasChannel() {
        return ((bitField0_ & 0x08000000) != 0);
      }
      /**
       * <pre>
       * Details about the channel the content is on.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Channel channel = 31;</code>
       * @return The channel.
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel getChannel() {
        return channel_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel.getDefaultInstance() : channel_;
      }
      /**
       * <pre>
       * Details about the channel the content is on.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Channel channel = 31;</code>
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.ChannelOrBuilder getChannelOrBuilder() {
        return channel_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel.getDefaultInstance() : channel_;
      }

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

        if (hasProducer()) {
          if (!getProducer().isInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
        }
        for (int i = 0; i < getDataCount(); i++) {
          if (!getData(i).isInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
        }
        if (hasNetwork()) {
          if (!getNetwork().isInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
        }
        if (hasChannel()) {
          if (!getChannel().isInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
        }
        if (!extensionsAreInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
        memoizedIsInitialized = 1;
        return true;
      }

      @java.lang.Override
      public void writeTo(com.google.protobuf.CodedOutputStream output)
                          throws java.io.IOException {
        com.google.protobuf.GeneratedMessageV3
          .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content>.ExtensionWriter
            extensionWriter = newExtensionWriter();
        if (((bitField0_ & 0x00000001) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 1, id_);
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          output.writeInt32(2, episode_);
        }
        if (((bitField0_ & 0x00000004) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 3, title_);
        }
        if (((bitField0_ & 0x00000008) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 4, series_);
        }
        if (((bitField0_ & 0x00000010) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 5, season_);
        }
        if (((bitField0_ & 0x00000200) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 6, url_);
        }
        for (int i = 0; i < cat_.size(); i++) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 7, cat_.getRaw(i));
        }
        if (((bitField0_ & 0x00001000) != 0)) {
          output.writeInt32(8, videoquality_);
        }
        if (((bitField0_ & 0x00002000) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 9, keywords_);
        }
        if (((bitField0_ & 0x00004000) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 10, contentrating_);
        }
        if (((bitField0_ & 0x00008000) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 11, userrating_);
        }
        if (((bitField0_ & 0x00020000) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 12, context22_);
        }
        if (((bitField0_ & 0x00040000) != 0)) {
          output.writeBool(13, livestream_);
        }
        if (((bitField0_ & 0x00080000) != 0)) {
          output.writeBool(14, sourcerelationship_);
        }
        if (((bitField0_ & 0x00100000) != 0)) {
          output.writeMessage(15, getProducer());
        }
        if (((bitField0_ & 0x00200000) != 0)) {
          output.writeInt32(16, len_);
        }
        if (((bitField0_ & 0x00400000) != 0)) {
          output.writeInt32(17, qagmediarating_);
        }
        if (((bitField0_ & 0x00800000) != 0)) {
          output.writeBool(18, embeddable_);
        }
        if (((bitField0_ & 0x01000000) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 19, language_);
        }
        if (((bitField0_ & 0x00010000) != 0)) {
          output.writeInt32(20, context_);
        }
        if (((bitField0_ & 0x00000020) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 21, artist_);
        }
        if (((bitField0_ & 0x00000040) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 22, genre_);
        }
        if (((bitField0_ & 0x00000080) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 23, album_);
        }
        if (((bitField0_ & 0x00000100) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 24, isrc_);
        }
        if (((bitField0_ & 0x00000800) != 0)) {
          output.writeInt32(25, prodq_);
        }
        if (((bitField0_ & 0x00000400) != 0)) {
          output.writeInt32(27, cattax_);
        }
        for (int i = 0; i < data_.size(); i++) {
          output.writeMessage(28, data_.get(i));
        }
        if (((bitField0_ & 0x02000000) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 29, langb_);
        }
        if (((bitField0_ & 0x04000000) != 0)) {
          output.writeMessage(30, getNetwork());
        }
        if (((bitField0_ & 0x08000000) != 0)) {
          output.writeMessage(31, getChannel());
        }
        extensionWriter.writeUntil(10000, output);
        unknownFields.writeTo(output);
      }

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

        size = 0;
        if (((bitField0_ & 0x00000001) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, id_);
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeInt32Size(2, episode_);
        }
        if (((bitField0_ & 0x00000004) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, title_);
        }
        if (((bitField0_ & 0x00000008) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, series_);
        }
        if (((bitField0_ & 0x00000010) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(5, season_);
        }
        if (((bitField0_ & 0x00000200) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(6, url_);
        }
        {
          int dataSize = 0;
          for (int i = 0; i < cat_.size(); i++) {
            dataSize += computeStringSizeNoTag(cat_.getRaw(i));
          }
          size += dataSize;
          size += 1 * getCatList().size();
        }
        if (((bitField0_ & 0x00001000) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeInt32Size(8, videoquality_);
        }
        if (((bitField0_ & 0x00002000) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(9, keywords_);
        }
        if (((bitField0_ & 0x00004000) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(10, contentrating_);
        }
        if (((bitField0_ & 0x00008000) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(11, userrating_);
        }
        if (((bitField0_ & 0x00020000) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(12, context22_);
        }
        if (((bitField0_ & 0x00040000) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeBoolSize(13, livestream_);
        }
        if (((bitField0_ & 0x00080000) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeBoolSize(14, sourcerelationship_);
        }
        if (((bitField0_ & 0x00100000) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeMessageSize(15, getProducer());
        }
        if (((bitField0_ & 0x00200000) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeInt32Size(16, len_);
        }
        if (((bitField0_ & 0x00400000) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeInt32Size(17, qagmediarating_);
        }
        if (((bitField0_ & 0x00800000) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeBoolSize(18, embeddable_);
        }
        if (((bitField0_ & 0x01000000) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(19, language_);
        }
        if (((bitField0_ & 0x00010000) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeInt32Size(20, context_);
        }
        if (((bitField0_ & 0x00000020) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(21, artist_);
        }
        if (((bitField0_ & 0x00000040) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(22, genre_);
        }
        if (((bitField0_ & 0x00000080) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(23, album_);
        }
        if (((bitField0_ & 0x00000100) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(24, isrc_);
        }
        if (((bitField0_ & 0x00000800) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeInt32Size(25, prodq_);
        }
        if (((bitField0_ & 0x00000400) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeInt32Size(27, cattax_);
        }
        for (int i = 0; i < data_.size(); i++) {
          size += com.google.protobuf.CodedOutputStream
            .computeMessageSize(28, data_.get(i));
        }
        if (((bitField0_ & 0x02000000) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(29, langb_);
        }
        if (((bitField0_ & 0x04000000) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeMessageSize(30, getNetwork());
        }
        if (((bitField0_ & 0x08000000) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeMessageSize(31, getChannel());
        }
        size += extensionsSerializedSize();
        size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content)) {
          return super.equals(obj);
        }
        com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content other = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content) obj;

        if (hasId() != other.hasId()) return false;
        if (hasId()) {
          if (!getId()
              .equals(other.getId())) return false;
        }
        if (hasEpisode() != other.hasEpisode()) return false;
        if (hasEpisode()) {
          if (getEpisode()
              != other.getEpisode()) return false;
        }
        if (hasTitle() != other.hasTitle()) return false;
        if (hasTitle()) {
          if (!getTitle()
              .equals(other.getTitle())) return false;
        }
        if (hasSeries() != other.hasSeries()) return false;
        if (hasSeries()) {
          if (!getSeries()
              .equals(other.getSeries())) return false;
        }
        if (hasSeason() != other.hasSeason()) return false;
        if (hasSeason()) {
          if (!getSeason()
              .equals(other.getSeason())) return false;
        }
        if (hasArtist() != other.hasArtist()) return false;
        if (hasArtist()) {
          if (!getArtist()
              .equals(other.getArtist())) return false;
        }
        if (hasGenre() != other.hasGenre()) return false;
        if (hasGenre()) {
          if (!getGenre()
              .equals(other.getGenre())) return false;
        }
        if (hasAlbum() != other.hasAlbum()) return false;
        if (hasAlbum()) {
          if (!getAlbum()
              .equals(other.getAlbum())) return false;
        }
        if (hasIsrc() != other.hasIsrc()) return false;
        if (hasIsrc()) {
          if (!getIsrc()
              .equals(other.getIsrc())) return false;
        }
        if (hasUrl() != other.hasUrl()) return false;
        if (hasUrl()) {
          if (!getUrl()
              .equals(other.getUrl())) return false;
        }
        if (hasCattax() != other.hasCattax()) return false;
        if (hasCattax()) {
          if (getCattax()
              != other.getCattax()) return false;
        }
        if (!getCatList()
            .equals(other.getCatList())) return false;
        if (hasProdq() != other.hasProdq()) return false;
        if (hasProdq()) {
          if (getProdq()
              != other.getProdq()) return false;
        }
        if (hasVideoquality() != other.hasVideoquality()) return false;
        if (hasVideoquality()) {
          if (getVideoquality()
              != other.getVideoquality()) return false;
        }
        if (hasKeywords() != other.hasKeywords()) return false;
        if (hasKeywords()) {
          if (!getKeywords()
              .equals(other.getKeywords())) return false;
        }
        if (hasContentrating() != other.hasContentrating()) return false;
        if (hasContentrating()) {
          if (!getContentrating()
              .equals(other.getContentrating())) return false;
        }
        if (hasUserrating() != other.hasUserrating()) return false;
        if (hasUserrating()) {
          if (!getUserrating()
              .equals(other.getUserrating())) return false;
        }
        if (hasContext() != other.hasContext()) return false;
        if (hasContext()) {
          if (getContext()
              != other.getContext()) return false;
        }
        if (hasContext22() != other.hasContext22()) return false;
        if (hasContext22()) {
          if (!getContext22()
              .equals(other.getContext22())) return false;
        }
        if (hasLivestream() != other.hasLivestream()) return false;
        if (hasLivestream()) {
          if (getLivestream()
              != other.getLivestream()) return false;
        }
        if (hasSourcerelationship() != other.hasSourcerelationship()) return false;
        if (hasSourcerelationship()) {
          if (getSourcerelationship()
              != other.getSourcerelationship()) return false;
        }
        if (hasProducer() != other.hasProducer()) return false;
        if (hasProducer()) {
          if (!getProducer()
              .equals(other.getProducer())) return false;
        }
        if (hasLen() != other.hasLen()) return false;
        if (hasLen()) {
          if (getLen()
              != other.getLen()) return false;
        }
        if (hasQagmediarating() != other.hasQagmediarating()) return false;
        if (hasQagmediarating()) {
          if (getQagmediarating()
              != other.getQagmediarating()) return false;
        }
        if (hasEmbeddable() != other.hasEmbeddable()) return false;
        if (hasEmbeddable()) {
          if (getEmbeddable()
              != other.getEmbeddable()) return false;
        }
        if (hasLanguage() != other.hasLanguage()) return false;
        if (hasLanguage()) {
          if (!getLanguage()
              .equals(other.getLanguage())) return false;
        }
        if (hasLangb() != other.hasLangb()) return false;
        if (hasLangb()) {
          if (!getLangb()
              .equals(other.getLangb())) return false;
        }
        if (!getDataList()
            .equals(other.getDataList())) return false;
        if (hasNetwork() != other.hasNetwork()) return false;
        if (hasNetwork()) {
          if (!getNetwork()
              .equals(other.getNetwork())) return false;
        }
        if (hasChannel() != other.hasChannel()) return false;
        if (hasChannel()) {
          if (!getChannel()
              .equals(other.getChannel())) return false;
        }
        if (!unknownFields.equals(other.unknownFields)) return false;
        if (!getExtensionFields().equals(other.getExtensionFields()))
          return false;
        return true;
      }

      @java.lang.Override
      public int hashCode() {
        if (memoizedHashCode != 0) {
          return memoizedHashCode;
        }
        int hash = 41;
        hash = (19 * hash) + getDescriptor().hashCode();
        if (hasId()) {
          hash = (37 * hash) + ID_FIELD_NUMBER;
          hash = (53 * hash) + getId().hashCode();
        }
        if (hasEpisode()) {
          hash = (37 * hash) + EPISODE_FIELD_NUMBER;
          hash = (53 * hash) + getEpisode();
        }
        if (hasTitle()) {
          hash = (37 * hash) + TITLE_FIELD_NUMBER;
          hash = (53 * hash) + getTitle().hashCode();
        }
        if (hasSeries()) {
          hash = (37 * hash) + SERIES_FIELD_NUMBER;
          hash = (53 * hash) + getSeries().hashCode();
        }
        if (hasSeason()) {
          hash = (37 * hash) + SEASON_FIELD_NUMBER;
          hash = (53 * hash) + getSeason().hashCode();
        }
        if (hasArtist()) {
          hash = (37 * hash) + ARTIST_FIELD_NUMBER;
          hash = (53 * hash) + getArtist().hashCode();
        }
        if (hasGenre()) {
          hash = (37 * hash) + GENRE_FIELD_NUMBER;
          hash = (53 * hash) + getGenre().hashCode();
        }
        if (hasAlbum()) {
          hash = (37 * hash) + ALBUM_FIELD_NUMBER;
          hash = (53 * hash) + getAlbum().hashCode();
        }
        if (hasIsrc()) {
          hash = (37 * hash) + ISRC_FIELD_NUMBER;
          hash = (53 * hash) + getIsrc().hashCode();
        }
        if (hasUrl()) {
          hash = (37 * hash) + URL_FIELD_NUMBER;
          hash = (53 * hash) + getUrl().hashCode();
        }
        if (hasCattax()) {
          hash = (37 * hash) + CATTAX_FIELD_NUMBER;
          hash = (53 * hash) + getCattax();
        }
        if (getCatCount() > 0) {
          hash = (37 * hash) + CAT_FIELD_NUMBER;
          hash = (53 * hash) + getCatList().hashCode();
        }
        if (hasProdq()) {
          hash = (37 * hash) + PRODQ_FIELD_NUMBER;
          hash = (53 * hash) + getProdq();
        }
        if (hasVideoquality()) {
          hash = (37 * hash) + VIDEOQUALITY_FIELD_NUMBER;
          hash = (53 * hash) + getVideoquality();
        }
        if (hasKeywords()) {
          hash = (37 * hash) + KEYWORDS_FIELD_NUMBER;
          hash = (53 * hash) + getKeywords().hashCode();
        }
        if (hasContentrating()) {
          hash = (37 * hash) + CONTENTRATING_FIELD_NUMBER;
          hash = (53 * hash) + getContentrating().hashCode();
        }
        if (hasUserrating()) {
          hash = (37 * hash) + USERRATING_FIELD_NUMBER;
          hash = (53 * hash) + getUserrating().hashCode();
        }
        if (hasContext()) {
          hash = (37 * hash) + CONTEXT_FIELD_NUMBER;
          hash = (53 * hash) + getContext();
        }
        if (hasContext22()) {
          hash = (37 * hash) + CONTEXT_22_FIELD_NUMBER;
          hash = (53 * hash) + getContext22().hashCode();
        }
        if (hasLivestream()) {
          hash = (37 * hash) + LIVESTREAM_FIELD_NUMBER;
          hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
              getLivestream());
        }
        if (hasSourcerelationship()) {
          hash = (37 * hash) + SOURCERELATIONSHIP_FIELD_NUMBER;
          hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
              getSourcerelationship());
        }
        if (hasProducer()) {
          hash = (37 * hash) + PRODUCER_FIELD_NUMBER;
          hash = (53 * hash) + getProducer().hashCode();
        }
        if (hasLen()) {
          hash = (37 * hash) + LEN_FIELD_NUMBER;
          hash = (53 * hash) + getLen();
        }
        if (hasQagmediarating()) {
          hash = (37 * hash) + QAGMEDIARATING_FIELD_NUMBER;
          hash = (53 * hash) + getQagmediarating();
        }
        if (hasEmbeddable()) {
          hash = (37 * hash) + EMBEDDABLE_FIELD_NUMBER;
          hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
              getEmbeddable());
        }
        if (hasLanguage()) {
          hash = (37 * hash) + LANGUAGE_FIELD_NUMBER;
          hash = (53 * hash) + getLanguage().hashCode();
        }
        if (hasLangb()) {
          hash = (37 * hash) + LANGB_FIELD_NUMBER;
          hash = (53 * hash) + getLangb().hashCode();
        }
        if (getDataCount() > 0) {
          hash = (37 * hash) + DATA_FIELD_NUMBER;
          hash = (53 * hash) + getDataList().hashCode();
        }
        if (hasNetwork()) {
          hash = (37 * hash) + NETWORK_FIELD_NUMBER;
          hash = (53 * hash) + getNetwork().hashCode();
        }
        if (hasChannel()) {
          hash = (37 * hash) + CHANNEL_FIELD_NUMBER;
          hash = (53 * hash) + getChannel().hashCode();
        }
        hash = hashFields(hash, getExtensionFields());
        hash = (29 * hash) + unknownFields.hashCode();
        memoizedHashCode = hash;
        return hash;
      }

      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content parseFrom(
          java.nio.ByteBuffer data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content parseFrom(
          java.nio.ByteBuffer data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content parseFrom(
          com.google.protobuf.ByteString data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content parseFrom(
          com.google.protobuf.ByteString data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content parseFrom(byte[] data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content parseFrom(
          byte[] data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content parseFrom(java.io.InputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content parseDelimitedFrom(java.io.InputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseDelimitedWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content parseFrom(
          com.google.protobuf.CodedInputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content 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>
       * OpenRTB 2.0: This object describes the content in which the impression
       * will appear, which may be syndicated or non-syndicated content.
       * This object may be useful when syndicated content contains impressions and
       * does not necessarily match the publisher's general content.
       * The exchange might or might not have knowledge of the page where the
       * content is running, as a result of the syndication method.
       * For example might be a video impression embedded in an iframe on an
       * unknown web property or device.
       * </pre>
       *
       * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Content}
       */
      public static final class Builder extends
          com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content, Builder> implements
          // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.BidRequest.Content)
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.ContentOrBuilder {
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Content_descriptor;
        }

        @java.lang.Override
        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Content_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content.Builder.class);
        }

        // Construct using com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content.newBuilder()
        private Builder() {
          maybeForceBuilderInitialization();
        }

        private Builder(
            com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
          super(parent);
          maybeForceBuilderInitialization();
        }
        private void maybeForceBuilderInitialization() {
          if (com.google.protobuf.GeneratedMessageV3
                  .alwaysUseFieldBuilders) {
            getProducerFieldBuilder();
            getDataFieldBuilder();
            getNetworkFieldBuilder();
            getChannelFieldBuilder();
          }
        }
        @java.lang.Override
        public Builder clear() {
          super.clear();
          id_ = "";
          bitField0_ = (bitField0_ & ~0x00000001);
          episode_ = 0;
          bitField0_ = (bitField0_ & ~0x00000002);
          title_ = "";
          bitField0_ = (bitField0_ & ~0x00000004);
          series_ = "";
          bitField0_ = (bitField0_ & ~0x00000008);
          season_ = "";
          bitField0_ = (bitField0_ & ~0x00000010);
          artist_ = "";
          bitField0_ = (bitField0_ & ~0x00000020);
          genre_ = "";
          bitField0_ = (bitField0_ & ~0x00000040);
          album_ = "";
          bitField0_ = (bitField0_ & ~0x00000080);
          isrc_ = "";
          bitField0_ = (bitField0_ & ~0x00000100);
          url_ = "";
          bitField0_ = (bitField0_ & ~0x00000200);
          cattax_ = 1;
          bitField0_ = (bitField0_ & ~0x00000400);
          cat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
          bitField0_ = (bitField0_ & ~0x00000800);
          prodq_ = 0;
          bitField0_ = (bitField0_ & ~0x00001000);
          videoquality_ = 0;
          bitField0_ = (bitField0_ & ~0x00002000);
          keywords_ = "";
          bitField0_ = (bitField0_ & ~0x00004000);
          contentrating_ = "";
          bitField0_ = (bitField0_ & ~0x00008000);
          userrating_ = "";
          bitField0_ = (bitField0_ & ~0x00010000);
          context_ = 0;
          bitField0_ = (bitField0_ & ~0x00020000);
          context22_ = "";
          bitField0_ = (bitField0_ & ~0x00040000);
          livestream_ = false;
          bitField0_ = (bitField0_ & ~0x00080000);
          sourcerelationship_ = false;
          bitField0_ = (bitField0_ & ~0x00100000);
          if (producerBuilder_ == null) {
            producer_ = null;
          } else {
            producerBuilder_.clear();
          }
          bitField0_ = (bitField0_ & ~0x00200000);
          len_ = 0;
          bitField0_ = (bitField0_ & ~0x00400000);
          qagmediarating_ = 0;
          bitField0_ = (bitField0_ & ~0x00800000);
          embeddable_ = false;
          bitField0_ = (bitField0_ & ~0x01000000);
          language_ = "";
          bitField0_ = (bitField0_ & ~0x02000000);
          langb_ = "";
          bitField0_ = (bitField0_ & ~0x04000000);
          if (dataBuilder_ == null) {
            data_ = java.util.Collections.emptyList();
            bitField0_ = (bitField0_ & ~0x08000000);
          } else {
            dataBuilder_.clear();
          }
          if (networkBuilder_ == null) {
            network_ = null;
          } else {
            networkBuilder_.clear();
          }
          bitField0_ = (bitField0_ & ~0x10000000);
          if (channelBuilder_ == null) {
            channel_ = null;
          } else {
            channelBuilder_.clear();
          }
          bitField0_ = (bitField0_ & ~0x20000000);
          return this;
        }

        @java.lang.Override
        public com.google.protobuf.Descriptors.Descriptor
            getDescriptorForType() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Content_descriptor;
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content getDefaultInstanceForType() {
          return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content.getDefaultInstance();
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content build() {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content result = buildPartial();
          if (!result.isInitialized()) {
            throw newUninitializedMessageException(result);
          }
          return result;
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content buildPartial() {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content result = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content(this);
          int from_bitField0_ = bitField0_;
          int to_bitField0_ = 0;
          if (((from_bitField0_ & 0x00000001) != 0)) {
            to_bitField0_ |= 0x00000001;
          }
          result.id_ = id_;
          if (((from_bitField0_ & 0x00000002) != 0)) {
            result.episode_ = episode_;
            to_bitField0_ |= 0x00000002;
          }
          if (((from_bitField0_ & 0x00000004) != 0)) {
            to_bitField0_ |= 0x00000004;
          }
          result.title_ = title_;
          if (((from_bitField0_ & 0x00000008) != 0)) {
            to_bitField0_ |= 0x00000008;
          }
          result.series_ = series_;
          if (((from_bitField0_ & 0x00000010) != 0)) {
            to_bitField0_ |= 0x00000010;
          }
          result.season_ = season_;
          if (((from_bitField0_ & 0x00000020) != 0)) {
            to_bitField0_ |= 0x00000020;
          }
          result.artist_ = artist_;
          if (((from_bitField0_ & 0x00000040) != 0)) {
            to_bitField0_ |= 0x00000040;
          }
          result.genre_ = genre_;
          if (((from_bitField0_ & 0x00000080) != 0)) {
            to_bitField0_ |= 0x00000080;
          }
          result.album_ = album_;
          if (((from_bitField0_ & 0x00000100) != 0)) {
            to_bitField0_ |= 0x00000100;
          }
          result.isrc_ = isrc_;
          if (((from_bitField0_ & 0x00000200) != 0)) {
            to_bitField0_ |= 0x00000200;
          }
          result.url_ = url_;
          if (((from_bitField0_ & 0x00000400) != 0)) {
            to_bitField0_ |= 0x00000400;
          }
          result.cattax_ = cattax_;
          if (((bitField0_ & 0x00000800) != 0)) {
            cat_ = cat_.getUnmodifiableView();
            bitField0_ = (bitField0_ & ~0x00000800);
          }
          result.cat_ = cat_;
          if (((from_bitField0_ & 0x00001000) != 0)) {
            result.prodq_ = prodq_;
            to_bitField0_ |= 0x00000800;
          }
          if (((from_bitField0_ & 0x00002000) != 0)) {
            result.videoquality_ = videoquality_;
            to_bitField0_ |= 0x00001000;
          }
          if (((from_bitField0_ & 0x00004000) != 0)) {
            to_bitField0_ |= 0x00002000;
          }
          result.keywords_ = keywords_;
          if (((from_bitField0_ & 0x00008000) != 0)) {
            to_bitField0_ |= 0x00004000;
          }
          result.contentrating_ = contentrating_;
          if (((from_bitField0_ & 0x00010000) != 0)) {
            to_bitField0_ |= 0x00008000;
          }
          result.userrating_ = userrating_;
          if (((from_bitField0_ & 0x00020000) != 0)) {
            result.context_ = context_;
            to_bitField0_ |= 0x00010000;
          }
          if (((from_bitField0_ & 0x00040000) != 0)) {
            to_bitField0_ |= 0x00020000;
          }
          result.context22_ = context22_;
          if (((from_bitField0_ & 0x00080000) != 0)) {
            result.livestream_ = livestream_;
            to_bitField0_ |= 0x00040000;
          }
          if (((from_bitField0_ & 0x00100000) != 0)) {
            result.sourcerelationship_ = sourcerelationship_;
            to_bitField0_ |= 0x00080000;
          }
          if (((from_bitField0_ & 0x00200000) != 0)) {
            if (producerBuilder_ == null) {
              result.producer_ = producer_;
            } else {
              result.producer_ = producerBuilder_.build();
            }
            to_bitField0_ |= 0x00100000;
          }
          if (((from_bitField0_ & 0x00400000) != 0)) {
            result.len_ = len_;
            to_bitField0_ |= 0x00200000;
          }
          if (((from_bitField0_ & 0x00800000) != 0)) {
            result.qagmediarating_ = qagmediarating_;
            to_bitField0_ |= 0x00400000;
          }
          if (((from_bitField0_ & 0x01000000) != 0)) {
            result.embeddable_ = embeddable_;
            to_bitField0_ |= 0x00800000;
          }
          if (((from_bitField0_ & 0x02000000) != 0)) {
            to_bitField0_ |= 0x01000000;
          }
          result.language_ = language_;
          if (((from_bitField0_ & 0x04000000) != 0)) {
            to_bitField0_ |= 0x02000000;
          }
          result.langb_ = langb_;
          if (dataBuilder_ == null) {
            if (((bitField0_ & 0x08000000) != 0)) {
              data_ = java.util.Collections.unmodifiableList(data_);
              bitField0_ = (bitField0_ & ~0x08000000);
            }
            result.data_ = data_;
          } else {
            result.data_ = dataBuilder_.build();
          }
          if (((from_bitField0_ & 0x10000000) != 0)) {
            if (networkBuilder_ == null) {
              result.network_ = network_;
            } else {
              result.network_ = networkBuilder_.build();
            }
            to_bitField0_ |= 0x04000000;
          }
          if (((from_bitField0_ & 0x20000000) != 0)) {
            if (channelBuilder_ == null) {
              result.channel_ = channel_;
            } else {
              result.channel_ = channelBuilder_.build();
            }
            to_bitField0_ |= 0x08000000;
          }
          result.bitField0_ = to_bitField0_;
          onBuilt();
          return result;
        }

        @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 <Type> Builder setExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content, Type> extension,
            Type value) {
          return super.setExtension(extension, value);
        }
        @java.lang.Override
        public <Type> Builder setExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content, java.util.List<Type>> extension,
            int index, Type value) {
          return super.setExtension(extension, index, value);
        }
        @java.lang.Override
        public <Type> Builder addExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content, java.util.List<Type>> extension,
            Type value) {
          return super.addExtension(extension, value);
        }
        @java.lang.Override
        public <Type> Builder clearExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content, ?> extension) {
          return super.clearExtension(extension);
        }
        @java.lang.Override
        public Builder mergeFrom(com.google.protobuf.Message other) {
          if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content) {
            return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content)other);
          } else {
            super.mergeFrom(other);
            return this;
          }
        }

        public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content other) {
          if (other == com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content.getDefaultInstance()) return this;
          if (other.hasId()) {
            bitField0_ |= 0x00000001;
            id_ = other.id_;
            onChanged();
          }
          if (other.hasEpisode()) {
            setEpisode(other.getEpisode());
          }
          if (other.hasTitle()) {
            bitField0_ |= 0x00000004;
            title_ = other.title_;
            onChanged();
          }
          if (other.hasSeries()) {
            bitField0_ |= 0x00000008;
            series_ = other.series_;
            onChanged();
          }
          if (other.hasSeason()) {
            bitField0_ |= 0x00000010;
            season_ = other.season_;
            onChanged();
          }
          if (other.hasArtist()) {
            bitField0_ |= 0x00000020;
            artist_ = other.artist_;
            onChanged();
          }
          if (other.hasGenre()) {
            bitField0_ |= 0x00000040;
            genre_ = other.genre_;
            onChanged();
          }
          if (other.hasAlbum()) {
            bitField0_ |= 0x00000080;
            album_ = other.album_;
            onChanged();
          }
          if (other.hasIsrc()) {
            bitField0_ |= 0x00000100;
            isrc_ = other.isrc_;
            onChanged();
          }
          if (other.hasUrl()) {
            bitField0_ |= 0x00000200;
            url_ = other.url_;
            onChanged();
          }
          if (other.hasCattax()) {
            setCattax(other.getCattax());
          }
          if (!other.cat_.isEmpty()) {
            if (cat_.isEmpty()) {
              cat_ = other.cat_;
              bitField0_ = (bitField0_ & ~0x00000800);
            } else {
              ensureCatIsMutable();
              cat_.addAll(other.cat_);
            }
            onChanged();
          }
          if (other.hasProdq()) {
            setProdq(other.getProdq());
          }
          if (other.hasVideoquality()) {
            setVideoquality(other.getVideoquality());
          }
          if (other.hasKeywords()) {
            bitField0_ |= 0x00004000;
            keywords_ = other.keywords_;
            onChanged();
          }
          if (other.hasContentrating()) {
            bitField0_ |= 0x00008000;
            contentrating_ = other.contentrating_;
            onChanged();
          }
          if (other.hasUserrating()) {
            bitField0_ |= 0x00010000;
            userrating_ = other.userrating_;
            onChanged();
          }
          if (other.hasContext()) {
            setContext(other.getContext());
          }
          if (other.hasContext22()) {
            bitField0_ |= 0x00040000;
            context22_ = other.context22_;
            onChanged();
          }
          if (other.hasLivestream()) {
            setLivestream(other.getLivestream());
          }
          if (other.hasSourcerelationship()) {
            setSourcerelationship(other.getSourcerelationship());
          }
          if (other.hasProducer()) {
            mergeProducer(other.getProducer());
          }
          if (other.hasLen()) {
            setLen(other.getLen());
          }
          if (other.hasQagmediarating()) {
            setQagmediarating(other.getQagmediarating());
          }
          if (other.hasEmbeddable()) {
            setEmbeddable(other.getEmbeddable());
          }
          if (other.hasLanguage()) {
            bitField0_ |= 0x02000000;
            language_ = other.language_;
            onChanged();
          }
          if (other.hasLangb()) {
            bitField0_ |= 0x04000000;
            langb_ = other.langb_;
            onChanged();
          }
          if (dataBuilder_ == null) {
            if (!other.data_.isEmpty()) {
              if (data_.isEmpty()) {
                data_ = other.data_;
                bitField0_ = (bitField0_ & ~0x08000000);
              } else {
                ensureDataIsMutable();
                data_.addAll(other.data_);
              }
              onChanged();
            }
          } else {
            if (!other.data_.isEmpty()) {
              if (dataBuilder_.isEmpty()) {
                dataBuilder_.dispose();
                dataBuilder_ = null;
                data_ = other.data_;
                bitField0_ = (bitField0_ & ~0x08000000);
                dataBuilder_ = 
                  com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
                     getDataFieldBuilder() : null;
              } else {
                dataBuilder_.addAllMessages(other.data_);
              }
            }
          }
          if (other.hasNetwork()) {
            mergeNetwork(other.getNetwork());
          }
          if (other.hasChannel()) {
            mergeChannel(other.getChannel());
          }
          this.mergeExtensionFields(other);
          this.mergeUnknownFields(other.unknownFields);
          onChanged();
          return this;
        }

        @java.lang.Override
        public final boolean isInitialized() {
          if (hasProducer()) {
            if (!getProducer().isInitialized()) {
              return false;
            }
          }
          for (int i = 0; i < getDataCount(); i++) {
            if (!getData(i).isInitialized()) {
              return false;
            }
          }
          if (hasNetwork()) {
            if (!getNetwork().isInitialized()) {
              return false;
            }
          }
          if (hasChannel()) {
            if (!getChannel().isInitialized()) {
              return false;
            }
          }
          if (!extensionsAreInitialized()) {
            return false;
          }
          return true;
        }

        @java.lang.Override
        public Builder mergeFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws java.io.IOException {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content parsedMessage = null;
          try {
            parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content) e.getUnfinishedMessage();
            throw e.unwrapIOException();
          } finally {
            if (parsedMessage != null) {
              mergeFrom(parsedMessage);
            }
          }
          return this;
        }
        private int bitField0_;

        private java.lang.Object id_ = "";
        /**
         * <pre>
         * ID uniquely identifying the content.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @return Whether the id field is set.
         */
        public boolean hasId() {
          return ((bitField0_ & 0x00000001) != 0);
        }
        /**
         * <pre>
         * ID uniquely identifying the content.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @return The id.
         */
        public java.lang.String getId() {
          java.lang.Object ref = id_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              id_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * ID uniquely identifying the content.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @return The bytes for id.
         */
        public com.google.protobuf.ByteString
            getIdBytes() {
          java.lang.Object ref = id_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            id_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * ID uniquely identifying the content.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @param value The id to set.
         * @return This builder for chaining.
         */
        public Builder setId(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
          id_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * ID uniquely identifying the content.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @return This builder for chaining.
         */
        public Builder clearId() {
          bitField0_ = (bitField0_ & ~0x00000001);
          id_ = getDefaultInstance().getId();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * ID uniquely identifying the content.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @param value The bytes for id to set.
         * @return This builder for chaining.
         */
        public Builder setIdBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
          id_ = value;
          onChanged();
          return this;
        }

        private int episode_ ;
        /**
         * <pre>
         * Content episode number (typically applies to video content).
         * </pre>
         *
         * <code>optional int32 episode = 2;</code>
         * @return Whether the episode field is set.
         */
        @java.lang.Override
        public boolean hasEpisode() {
          return ((bitField0_ & 0x00000002) != 0);
        }
        /**
         * <pre>
         * Content episode number (typically applies to video content).
         * </pre>
         *
         * <code>optional int32 episode = 2;</code>
         * @return The episode.
         */
        @java.lang.Override
        public int getEpisode() {
          return episode_;
        }
        /**
         * <pre>
         * Content episode number (typically applies to video content).
         * </pre>
         *
         * <code>optional int32 episode = 2;</code>
         * @param value The episode to set.
         * @return This builder for chaining.
         */
        public Builder setEpisode(int value) {
          bitField0_ |= 0x00000002;
          episode_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Content episode number (typically applies to video content).
         * </pre>
         *
         * <code>optional int32 episode = 2;</code>
         * @return This builder for chaining.
         */
        public Builder clearEpisode() {
          bitField0_ = (bitField0_ & ~0x00000002);
          episode_ = 0;
          onChanged();
          return this;
        }

        private java.lang.Object title_ = "";
        /**
         * <pre>
         * Content title.
         * Video Examples: "Search Committee" (television), "A New Hope" (movie),
         * or "Endgame" (made for web).
         * Non-Video Example: "Why an Antarctic Glacier Is Melting So Quickly"
         * (Time magazine article).
         * </pre>
         *
         * <code>optional string title = 3;</code>
         * @return Whether the title field is set.
         */
        public boolean hasTitle() {
          return ((bitField0_ & 0x00000004) != 0);
        }
        /**
         * <pre>
         * Content title.
         * Video Examples: "Search Committee" (television), "A New Hope" (movie),
         * or "Endgame" (made for web).
         * Non-Video Example: "Why an Antarctic Glacier Is Melting So Quickly"
         * (Time magazine article).
         * </pre>
         *
         * <code>optional string title = 3;</code>
         * @return The title.
         */
        public java.lang.String getTitle() {
          java.lang.Object ref = title_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              title_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Content title.
         * Video Examples: "Search Committee" (television), "A New Hope" (movie),
         * or "Endgame" (made for web).
         * Non-Video Example: "Why an Antarctic Glacier Is Melting So Quickly"
         * (Time magazine article).
         * </pre>
         *
         * <code>optional string title = 3;</code>
         * @return The bytes for title.
         */
        public com.google.protobuf.ByteString
            getTitleBytes() {
          java.lang.Object ref = title_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            title_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Content title.
         * Video Examples: "Search Committee" (television), "A New Hope" (movie),
         * or "Endgame" (made for web).
         * Non-Video Example: "Why an Antarctic Glacier Is Melting So Quickly"
         * (Time magazine article).
         * </pre>
         *
         * <code>optional string title = 3;</code>
         * @param value The title to set.
         * @return This builder for chaining.
         */
        public Builder setTitle(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
          title_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Content title.
         * Video Examples: "Search Committee" (television), "A New Hope" (movie),
         * or "Endgame" (made for web).
         * Non-Video Example: "Why an Antarctic Glacier Is Melting So Quickly"
         * (Time magazine article).
         * </pre>
         *
         * <code>optional string title = 3;</code>
         * @return This builder for chaining.
         */
        public Builder clearTitle() {
          bitField0_ = (bitField0_ & ~0x00000004);
          title_ = getDefaultInstance().getTitle();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Content title.
         * Video Examples: "Search Committee" (television), "A New Hope" (movie),
         * or "Endgame" (made for web).
         * Non-Video Example: "Why an Antarctic Glacier Is Melting So Quickly"
         * (Time magazine article).
         * </pre>
         *
         * <code>optional string title = 3;</code>
         * @param value The bytes for title to set.
         * @return This builder for chaining.
         */
        public Builder setTitleBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
          title_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object series_ = "";
        /**
         * <pre>
         * Content series.
         * Video Examples: "The Office" (television), "Star Wars" (movie),
         * or "Arby 'N' The Chief" (made for web).
         * Non-Video Example: "Ecocentric" (Time Magazine blog).
         * </pre>
         *
         * <code>optional string series = 4;</code>
         * @return Whether the series field is set.
         */
        public boolean hasSeries() {
          return ((bitField0_ & 0x00000008) != 0);
        }
        /**
         * <pre>
         * Content series.
         * Video Examples: "The Office" (television), "Star Wars" (movie),
         * or "Arby 'N' The Chief" (made for web).
         * Non-Video Example: "Ecocentric" (Time Magazine blog).
         * </pre>
         *
         * <code>optional string series = 4;</code>
         * @return The series.
         */
        public java.lang.String getSeries() {
          java.lang.Object ref = series_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              series_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Content series.
         * Video Examples: "The Office" (television), "Star Wars" (movie),
         * or "Arby 'N' The Chief" (made for web).
         * Non-Video Example: "Ecocentric" (Time Magazine blog).
         * </pre>
         *
         * <code>optional string series = 4;</code>
         * @return The bytes for series.
         */
        public com.google.protobuf.ByteString
            getSeriesBytes() {
          java.lang.Object ref = series_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            series_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Content series.
         * Video Examples: "The Office" (television), "Star Wars" (movie),
         * or "Arby 'N' The Chief" (made for web).
         * Non-Video Example: "Ecocentric" (Time Magazine blog).
         * </pre>
         *
         * <code>optional string series = 4;</code>
         * @param value The series to set.
         * @return This builder for chaining.
         */
        public Builder setSeries(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
          series_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Content series.
         * Video Examples: "The Office" (television), "Star Wars" (movie),
         * or "Arby 'N' The Chief" (made for web).
         * Non-Video Example: "Ecocentric" (Time Magazine blog).
         * </pre>
         *
         * <code>optional string series = 4;</code>
         * @return This builder for chaining.
         */
        public Builder clearSeries() {
          bitField0_ = (bitField0_ & ~0x00000008);
          series_ = getDefaultInstance().getSeries();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Content series.
         * Video Examples: "The Office" (television), "Star Wars" (movie),
         * or "Arby 'N' The Chief" (made for web).
         * Non-Video Example: "Ecocentric" (Time Magazine blog).
         * </pre>
         *
         * <code>optional string series = 4;</code>
         * @param value The bytes for series to set.
         * @return This builder for chaining.
         */
        public Builder setSeriesBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
          series_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object season_ = "";
        /**
         * <pre>
         * Content season; typically for video content (e.g., "Season 3").
         * </pre>
         *
         * <code>optional string season = 5;</code>
         * @return Whether the season field is set.
         */
        public boolean hasSeason() {
          return ((bitField0_ & 0x00000010) != 0);
        }
        /**
         * <pre>
         * Content season; typically for video content (e.g., "Season 3").
         * </pre>
         *
         * <code>optional string season = 5;</code>
         * @return The season.
         */
        public java.lang.String getSeason() {
          java.lang.Object ref = season_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              season_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Content season; typically for video content (e.g., "Season 3").
         * </pre>
         *
         * <code>optional string season = 5;</code>
         * @return The bytes for season.
         */
        public com.google.protobuf.ByteString
            getSeasonBytes() {
          java.lang.Object ref = season_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            season_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Content season; typically for video content (e.g., "Season 3").
         * </pre>
         *
         * <code>optional string season = 5;</code>
         * @param value The season to set.
         * @return This builder for chaining.
         */
        public Builder setSeason(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
          season_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Content season; typically for video content (e.g., "Season 3").
         * </pre>
         *
         * <code>optional string season = 5;</code>
         * @return This builder for chaining.
         */
        public Builder clearSeason() {
          bitField0_ = (bitField0_ & ~0x00000010);
          season_ = getDefaultInstance().getSeason();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Content season; typically for video content (e.g., "Season 3").
         * </pre>
         *
         * <code>optional string season = 5;</code>
         * @param value The bytes for season to set.
         * @return This builder for chaining.
         */
        public Builder setSeasonBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
          season_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object artist_ = "";
        /**
         * <pre>
         * Artist credited with the content.
         * </pre>
         *
         * <code>optional string artist = 21;</code>
         * @return Whether the artist field is set.
         */
        public boolean hasArtist() {
          return ((bitField0_ & 0x00000020) != 0);
        }
        /**
         * <pre>
         * Artist credited with the content.
         * </pre>
         *
         * <code>optional string artist = 21;</code>
         * @return The artist.
         */
        public java.lang.String getArtist() {
          java.lang.Object ref = artist_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              artist_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Artist credited with the content.
         * </pre>
         *
         * <code>optional string artist = 21;</code>
         * @return The bytes for artist.
         */
        public com.google.protobuf.ByteString
            getArtistBytes() {
          java.lang.Object ref = artist_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            artist_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Artist credited with the content.
         * </pre>
         *
         * <code>optional string artist = 21;</code>
         * @param value The artist to set.
         * @return This builder for chaining.
         */
        public Builder setArtist(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000020;
          artist_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Artist credited with the content.
         * </pre>
         *
         * <code>optional string artist = 21;</code>
         * @return This builder for chaining.
         */
        public Builder clearArtist() {
          bitField0_ = (bitField0_ & ~0x00000020);
          artist_ = getDefaultInstance().getArtist();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Artist credited with the content.
         * </pre>
         *
         * <code>optional string artist = 21;</code>
         * @param value The bytes for artist to set.
         * @return This builder for chaining.
         */
        public Builder setArtistBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000020;
          artist_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object genre_ = "";
        /**
         * <pre>
         * Genre that best describes the content (e.g., rock, pop, etc).
         * </pre>
         *
         * <code>optional string genre = 22;</code>
         * @return Whether the genre field is set.
         */
        public boolean hasGenre() {
          return ((bitField0_ & 0x00000040) != 0);
        }
        /**
         * <pre>
         * Genre that best describes the content (e.g., rock, pop, etc).
         * </pre>
         *
         * <code>optional string genre = 22;</code>
         * @return The genre.
         */
        public java.lang.String getGenre() {
          java.lang.Object ref = genre_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              genre_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Genre that best describes the content (e.g., rock, pop, etc).
         * </pre>
         *
         * <code>optional string genre = 22;</code>
         * @return The bytes for genre.
         */
        public com.google.protobuf.ByteString
            getGenreBytes() {
          java.lang.Object ref = genre_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            genre_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Genre that best describes the content (e.g., rock, pop, etc).
         * </pre>
         *
         * <code>optional string genre = 22;</code>
         * @param value The genre to set.
         * @return This builder for chaining.
         */
        public Builder setGenre(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000040;
          genre_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Genre that best describes the content (e.g., rock, pop, etc).
         * </pre>
         *
         * <code>optional string genre = 22;</code>
         * @return This builder for chaining.
         */
        public Builder clearGenre() {
          bitField0_ = (bitField0_ & ~0x00000040);
          genre_ = getDefaultInstance().getGenre();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Genre that best describes the content (e.g., rock, pop, etc).
         * </pre>
         *
         * <code>optional string genre = 22;</code>
         * @param value The bytes for genre to set.
         * @return This builder for chaining.
         */
        public Builder setGenreBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000040;
          genre_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object album_ = "";
        /**
         * <pre>
         * Album to which the content belongs; typically for audio.
         * </pre>
         *
         * <code>optional string album = 23;</code>
         * @return Whether the album field is set.
         */
        public boolean hasAlbum() {
          return ((bitField0_ & 0x00000080) != 0);
        }
        /**
         * <pre>
         * Album to which the content belongs; typically for audio.
         * </pre>
         *
         * <code>optional string album = 23;</code>
         * @return The album.
         */
        public java.lang.String getAlbum() {
          java.lang.Object ref = album_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              album_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Album to which the content belongs; typically for audio.
         * </pre>
         *
         * <code>optional string album = 23;</code>
         * @return The bytes for album.
         */
        public com.google.protobuf.ByteString
            getAlbumBytes() {
          java.lang.Object ref = album_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            album_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Album to which the content belongs; typically for audio.
         * </pre>
         *
         * <code>optional string album = 23;</code>
         * @param value The album to set.
         * @return This builder for chaining.
         */
        public Builder setAlbum(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000080;
          album_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Album to which the content belongs; typically for audio.
         * </pre>
         *
         * <code>optional string album = 23;</code>
         * @return This builder for chaining.
         */
        public Builder clearAlbum() {
          bitField0_ = (bitField0_ & ~0x00000080);
          album_ = getDefaultInstance().getAlbum();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Album to which the content belongs; typically for audio.
         * </pre>
         *
         * <code>optional string album = 23;</code>
         * @param value The bytes for album to set.
         * @return This builder for chaining.
         */
        public Builder setAlbumBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000080;
          album_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object isrc_ = "";
        /**
         * <pre>
         * International Standard Recording Code conforming to ISO-3901.
         * </pre>
         *
         * <code>optional string isrc = 24;</code>
         * @return Whether the isrc field is set.
         */
        public boolean hasIsrc() {
          return ((bitField0_ & 0x00000100) != 0);
        }
        /**
         * <pre>
         * International Standard Recording Code conforming to ISO-3901.
         * </pre>
         *
         * <code>optional string isrc = 24;</code>
         * @return The isrc.
         */
        public java.lang.String getIsrc() {
          java.lang.Object ref = isrc_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              isrc_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * International Standard Recording Code conforming to ISO-3901.
         * </pre>
         *
         * <code>optional string isrc = 24;</code>
         * @return The bytes for isrc.
         */
        public com.google.protobuf.ByteString
            getIsrcBytes() {
          java.lang.Object ref = isrc_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            isrc_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * International Standard Recording Code conforming to ISO-3901.
         * </pre>
         *
         * <code>optional string isrc = 24;</code>
         * @param value The isrc to set.
         * @return This builder for chaining.
         */
        public Builder setIsrc(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000100;
          isrc_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * International Standard Recording Code conforming to ISO-3901.
         * </pre>
         *
         * <code>optional string isrc = 24;</code>
         * @return This builder for chaining.
         */
        public Builder clearIsrc() {
          bitField0_ = (bitField0_ & ~0x00000100);
          isrc_ = getDefaultInstance().getIsrc();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * International Standard Recording Code conforming to ISO-3901.
         * </pre>
         *
         * <code>optional string isrc = 24;</code>
         * @param value The bytes for isrc to set.
         * @return This builder for chaining.
         */
        public Builder setIsrcBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000100;
          isrc_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object url_ = "";
        /**
         * <pre>
         * URL of the content, for buy-side contextualization or review.
         * </pre>
         *
         * <code>optional string url = 6;</code>
         * @return Whether the url field is set.
         */
        public boolean hasUrl() {
          return ((bitField0_ & 0x00000200) != 0);
        }
        /**
         * <pre>
         * URL of the content, for buy-side contextualization or review.
         * </pre>
         *
         * <code>optional string url = 6;</code>
         * @return The url.
         */
        public java.lang.String getUrl() {
          java.lang.Object ref = url_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              url_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * URL of the content, for buy-side contextualization or review.
         * </pre>
         *
         * <code>optional string url = 6;</code>
         * @return The bytes for url.
         */
        public com.google.protobuf.ByteString
            getUrlBytes() {
          java.lang.Object ref = url_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            url_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * URL of the content, for buy-side contextualization or review.
         * </pre>
         *
         * <code>optional string url = 6;</code>
         * @param value The url to set.
         * @return This builder for chaining.
         */
        public Builder setUrl(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000200;
          url_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * URL of the content, for buy-side contextualization or review.
         * </pre>
         *
         * <code>optional string url = 6;</code>
         * @return This builder for chaining.
         */
        public Builder clearUrl() {
          bitField0_ = (bitField0_ & ~0x00000200);
          url_ = getDefaultInstance().getUrl();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * URL of the content, for buy-side contextualization or review.
         * </pre>
         *
         * <code>optional string url = 6;</code>
         * @param value The bytes for url to set.
         * @return This builder for chaining.
         */
        public Builder setUrlBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000200;
          url_ = value;
          onChanged();
          return this;
        }

        private int cattax_ = 1;
        /**
         * <pre>
         * The taxonomy in use.
         * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
         * </pre>
         *
         * <code>optional int32 cattax = 27 [default = 1];</code>
         * @return Whether the cattax field is set.
         */
        @java.lang.Override
        public boolean hasCattax() {
          return ((bitField0_ & 0x00000400) != 0);
        }
        /**
         * <pre>
         * The taxonomy in use.
         * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
         * </pre>
         *
         * <code>optional int32 cattax = 27 [default = 1];</code>
         * @return The cattax.
         */
        @java.lang.Override
        public int getCattax() {
          return cattax_;
        }
        /**
         * <pre>
         * The taxonomy in use.
         * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
         * </pre>
         *
         * <code>optional int32 cattax = 27 [default = 1];</code>
         * @param value The cattax to set.
         * @return This builder for chaining.
         */
        public Builder setCattax(int value) {
          bitField0_ |= 0x00000400;
          cattax_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * The taxonomy in use.
         * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
         * </pre>
         *
         * <code>optional int32 cattax = 27 [default = 1];</code>
         * @return This builder for chaining.
         */
        public Builder clearCattax() {
          bitField0_ = (bitField0_ & ~0x00000400);
          cattax_ = 1;
          onChanged();
          return this;
        }

        private com.google.protobuf.LazyStringList cat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        private void ensureCatIsMutable() {
          if (!((bitField0_ & 0x00000800) != 0)) {
            cat_ = new com.google.protobuf.LazyStringArrayList(cat_);
            bitField0_ |= 0x00000800;
           }
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the content.
         * </pre>
         *
         * <code>repeated string cat = 7;</code>
         * @return A list containing the cat.
         */
        public com.google.protobuf.ProtocolStringList
            getCatList() {
          return cat_.getUnmodifiableView();
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the content.
         * </pre>
         *
         * <code>repeated string cat = 7;</code>
         * @return The count of cat.
         */
        public int getCatCount() {
          return cat_.size();
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the content.
         * </pre>
         *
         * <code>repeated string cat = 7;</code>
         * @param index The index of the element to return.
         * @return The cat at the given index.
         */
        public java.lang.String getCat(int index) {
          return cat_.get(index);
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the content.
         * </pre>
         *
         * <code>repeated string cat = 7;</code>
         * @param index The index of the value to return.
         * @return The bytes of the cat at the given index.
         */
        public com.google.protobuf.ByteString
            getCatBytes(int index) {
          return cat_.getByteString(index);
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the content.
         * </pre>
         *
         * <code>repeated string cat = 7;</code>
         * @param index The index to set the value at.
         * @param value The cat to set.
         * @return This builder for chaining.
         */
        public Builder setCat(
            int index, java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  ensureCatIsMutable();
          cat_.set(index, value);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the content.
         * </pre>
         *
         * <code>repeated string cat = 7;</code>
         * @param value The cat to add.
         * @return This builder for chaining.
         */
        public Builder addCat(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  ensureCatIsMutable();
          cat_.add(value);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the content.
         * </pre>
         *
         * <code>repeated string cat = 7;</code>
         * @param values The cat to add.
         * @return This builder for chaining.
         */
        public Builder addAllCat(
            java.lang.Iterable<java.lang.String> values) {
          ensureCatIsMutable();
          com.google.protobuf.AbstractMessageLite.Builder.addAll(
              values, cat_);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the content.
         * </pre>
         *
         * <code>repeated string cat = 7;</code>
         * @return This builder for chaining.
         */
        public Builder clearCat() {
          cat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
          bitField0_ = (bitField0_ & ~0x00000800);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the content.
         * </pre>
         *
         * <code>repeated string cat = 7;</code>
         * @param value The bytes of the cat to add.
         * @return This builder for chaining.
         */
        public Builder addCatBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  ensureCatIsMutable();
          cat_.add(value);
          onChanged();
          return this;
        }

        private int prodq_ ;
        /**
         * <pre>
         * Production quality.
         * Refer to enum com.iabtechlab.adcom.v1.ProductionQuality for generic values.
         * </pre>
         *
         * <code>optional int32 prodq = 25;</code>
         * @return Whether the prodq field is set.
         */
        @java.lang.Override
        public boolean hasProdq() {
          return ((bitField0_ & 0x00001000) != 0);
        }
        /**
         * <pre>
         * Production quality.
         * Refer to enum com.iabtechlab.adcom.v1.ProductionQuality for generic values.
         * </pre>
         *
         * <code>optional int32 prodq = 25;</code>
         * @return The prodq.
         */
        @java.lang.Override
        public int getProdq() {
          return prodq_;
        }
        /**
         * <pre>
         * Production quality.
         * Refer to enum com.iabtechlab.adcom.v1.ProductionQuality for generic values.
         * </pre>
         *
         * <code>optional int32 prodq = 25;</code>
         * @param value The prodq to set.
         * @return This builder for chaining.
         */
        public Builder setProdq(int value) {
          bitField0_ |= 0x00001000;
          prodq_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Production quality.
         * Refer to enum com.iabtechlab.adcom.v1.ProductionQuality for generic values.
         * </pre>
         *
         * <code>optional int32 prodq = 25;</code>
         * @return This builder for chaining.
         */
        public Builder clearProdq() {
          bitField0_ = (bitField0_ & ~0x00001000);
          prodq_ = 0;
          onChanged();
          return this;
        }

        private int videoquality_ ;
        /**
         * <pre>
         * NOTE: Deprecated in favor of prodq.
         * Video quality per IAB's classification.
         * Refer to enum com.iabtechlab.adcom.v1.ProductionQuality for generic values.
         * </pre>
         *
         * <code>optional int32 videoquality = 8 [deprecated = true];</code>
         * @return Whether the videoquality field is set.
         */
        @java.lang.Override
        @java.lang.Deprecated public boolean hasVideoquality() {
          return ((bitField0_ & 0x00002000) != 0);
        }
        /**
         * <pre>
         * NOTE: Deprecated in favor of prodq.
         * Video quality per IAB's classification.
         * Refer to enum com.iabtechlab.adcom.v1.ProductionQuality for generic values.
         * </pre>
         *
         * <code>optional int32 videoquality = 8 [deprecated = true];</code>
         * @return The videoquality.
         */
        @java.lang.Override
        @java.lang.Deprecated public int getVideoquality() {
          return videoquality_;
        }
        /**
         * <pre>
         * NOTE: Deprecated in favor of prodq.
         * Video quality per IAB's classification.
         * Refer to enum com.iabtechlab.adcom.v1.ProductionQuality for generic values.
         * </pre>
         *
         * <code>optional int32 videoquality = 8 [deprecated = true];</code>
         * @param value The videoquality to set.
         * @return This builder for chaining.
         */
        @java.lang.Deprecated public Builder setVideoquality(int value) {
          bitField0_ |= 0x00002000;
          videoquality_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * NOTE: Deprecated in favor of prodq.
         * Video quality per IAB's classification.
         * Refer to enum com.iabtechlab.adcom.v1.ProductionQuality for generic values.
         * </pre>
         *
         * <code>optional int32 videoquality = 8 [deprecated = true];</code>
         * @return This builder for chaining.
         */
        @java.lang.Deprecated public Builder clearVideoquality() {
          bitField0_ = (bitField0_ & ~0x00002000);
          videoquality_ = 0;
          onChanged();
          return this;
        }

        private java.lang.Object keywords_ = "";
        /**
         * <pre>
         * Comma separated list of keywords describing the content.
         * Note: OpenRTB 2.2 allowed an array-of-strings as alternate implementation
         * but this was fixed in 2.3+ where it's definitely a single string with CSV
         * content again. Compatibility with some OpenRTB 2.2 exchanges that adopted
         * the alternate representation may require custom handling of the JSON.
         * </pre>
         *
         * <code>optional string keywords = 9;</code>
         * @return Whether the keywords field is set.
         */
        public boolean hasKeywords() {
          return ((bitField0_ & 0x00004000) != 0);
        }
        /**
         * <pre>
         * Comma separated list of keywords describing the content.
         * Note: OpenRTB 2.2 allowed an array-of-strings as alternate implementation
         * but this was fixed in 2.3+ where it's definitely a single string with CSV
         * content again. Compatibility with some OpenRTB 2.2 exchanges that adopted
         * the alternate representation may require custom handling of the JSON.
         * </pre>
         *
         * <code>optional string keywords = 9;</code>
         * @return The keywords.
         */
        public java.lang.String getKeywords() {
          java.lang.Object ref = keywords_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              keywords_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Comma separated list of keywords describing the content.
         * Note: OpenRTB 2.2 allowed an array-of-strings as alternate implementation
         * but this was fixed in 2.3+ where it's definitely a single string with CSV
         * content again. Compatibility with some OpenRTB 2.2 exchanges that adopted
         * the alternate representation may require custom handling of the JSON.
         * </pre>
         *
         * <code>optional string keywords = 9;</code>
         * @return The bytes for keywords.
         */
        public com.google.protobuf.ByteString
            getKeywordsBytes() {
          java.lang.Object ref = keywords_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            keywords_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Comma separated list of keywords describing the content.
         * Note: OpenRTB 2.2 allowed an array-of-strings as alternate implementation
         * but this was fixed in 2.3+ where it's definitely a single string with CSV
         * content again. Compatibility with some OpenRTB 2.2 exchanges that adopted
         * the alternate representation may require custom handling of the JSON.
         * </pre>
         *
         * <code>optional string keywords = 9;</code>
         * @param value The keywords to set.
         * @return This builder for chaining.
         */
        public Builder setKeywords(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00004000;
          keywords_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Comma separated list of keywords describing the content.
         * Note: OpenRTB 2.2 allowed an array-of-strings as alternate implementation
         * but this was fixed in 2.3+ where it's definitely a single string with CSV
         * content again. Compatibility with some OpenRTB 2.2 exchanges that adopted
         * the alternate representation may require custom handling of the JSON.
         * </pre>
         *
         * <code>optional string keywords = 9;</code>
         * @return This builder for chaining.
         */
        public Builder clearKeywords() {
          bitField0_ = (bitField0_ & ~0x00004000);
          keywords_ = getDefaultInstance().getKeywords();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Comma separated list of keywords describing the content.
         * Note: OpenRTB 2.2 allowed an array-of-strings as alternate implementation
         * but this was fixed in 2.3+ where it's definitely a single string with CSV
         * content again. Compatibility with some OpenRTB 2.2 exchanges that adopted
         * the alternate representation may require custom handling of the JSON.
         * </pre>
         *
         * <code>optional string keywords = 9;</code>
         * @param value The bytes for keywords to set.
         * @return This builder for chaining.
         */
        public Builder setKeywordsBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00004000;
          keywords_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object contentrating_ = "";
        /**
         * <pre>
         * Content rating (e.g., MPAA).
         * </pre>
         *
         * <code>optional string contentrating = 10;</code>
         * @return Whether the contentrating field is set.
         */
        public boolean hasContentrating() {
          return ((bitField0_ & 0x00008000) != 0);
        }
        /**
         * <pre>
         * Content rating (e.g., MPAA).
         * </pre>
         *
         * <code>optional string contentrating = 10;</code>
         * @return The contentrating.
         */
        public java.lang.String getContentrating() {
          java.lang.Object ref = contentrating_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              contentrating_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Content rating (e.g., MPAA).
         * </pre>
         *
         * <code>optional string contentrating = 10;</code>
         * @return The bytes for contentrating.
         */
        public com.google.protobuf.ByteString
            getContentratingBytes() {
          java.lang.Object ref = contentrating_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            contentrating_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Content rating (e.g., MPAA).
         * </pre>
         *
         * <code>optional string contentrating = 10;</code>
         * @param value The contentrating to set.
         * @return This builder for chaining.
         */
        public Builder setContentrating(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00008000;
          contentrating_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Content rating (e.g., MPAA).
         * </pre>
         *
         * <code>optional string contentrating = 10;</code>
         * @return This builder for chaining.
         */
        public Builder clearContentrating() {
          bitField0_ = (bitField0_ & ~0x00008000);
          contentrating_ = getDefaultInstance().getContentrating();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Content rating (e.g., MPAA).
         * </pre>
         *
         * <code>optional string contentrating = 10;</code>
         * @param value The bytes for contentrating to set.
         * @return This builder for chaining.
         */
        public Builder setContentratingBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00008000;
          contentrating_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object userrating_ = "";
        /**
         * <pre>
         * User rating of the content (e.g., number of stars, likes, etc.).
         * Refer to enum com.iabtechlab.adcom.v1.enums.ContentContext for generic values.
         * </pre>
         *
         * <code>optional string userrating = 11;</code>
         * @return Whether the userrating field is set.
         */
        public boolean hasUserrating() {
          return ((bitField0_ & 0x00010000) != 0);
        }
        /**
         * <pre>
         * User rating of the content (e.g., number of stars, likes, etc.).
         * Refer to enum com.iabtechlab.adcom.v1.enums.ContentContext for generic values.
         * </pre>
         *
         * <code>optional string userrating = 11;</code>
         * @return The userrating.
         */
        public java.lang.String getUserrating() {
          java.lang.Object ref = userrating_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              userrating_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * User rating of the content (e.g., number of stars, likes, etc.).
         * Refer to enum com.iabtechlab.adcom.v1.enums.ContentContext for generic values.
         * </pre>
         *
         * <code>optional string userrating = 11;</code>
         * @return The bytes for userrating.
         */
        public com.google.protobuf.ByteString
            getUserratingBytes() {
          java.lang.Object ref = userrating_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            userrating_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * User rating of the content (e.g., number of stars, likes, etc.).
         * Refer to enum com.iabtechlab.adcom.v1.enums.ContentContext for generic values.
         * </pre>
         *
         * <code>optional string userrating = 11;</code>
         * @param value The userrating to set.
         * @return This builder for chaining.
         */
        public Builder setUserrating(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00010000;
          userrating_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * User rating of the content (e.g., number of stars, likes, etc.).
         * Refer to enum com.iabtechlab.adcom.v1.enums.ContentContext for generic values.
         * </pre>
         *
         * <code>optional string userrating = 11;</code>
         * @return This builder for chaining.
         */
        public Builder clearUserrating() {
          bitField0_ = (bitField0_ & ~0x00010000);
          userrating_ = getDefaultInstance().getUserrating();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * User rating of the content (e.g., number of stars, likes, etc.).
         * Refer to enum com.iabtechlab.adcom.v1.enums.ContentContext for generic values.
         * </pre>
         *
         * <code>optional string userrating = 11;</code>
         * @param value The bytes for userrating to set.
         * @return This builder for chaining.
         */
        public Builder setUserratingBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00010000;
          userrating_ = value;
          onChanged();
          return this;
        }

        private int context_ ;
        /**
         * <pre>
         * Type of content (game, video, text, etc.).
         * </pre>
         *
         * <code>optional int32 context = 20;</code>
         * @return Whether the context field is set.
         */
        @java.lang.Override
        public boolean hasContext() {
          return ((bitField0_ & 0x00020000) != 0);
        }
        /**
         * <pre>
         * Type of content (game, video, text, etc.).
         * </pre>
         *
         * <code>optional int32 context = 20;</code>
         * @return The context.
         */
        @java.lang.Override
        public int getContext() {
          return context_;
        }
        /**
         * <pre>
         * Type of content (game, video, text, etc.).
         * </pre>
         *
         * <code>optional int32 context = 20;</code>
         * @param value The context to set.
         * @return This builder for chaining.
         */
        public Builder setContext(int value) {
          bitField0_ |= 0x00020000;
          context_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Type of content (game, video, text, etc.).
         * </pre>
         *
         * <code>optional int32 context = 20;</code>
         * @return This builder for chaining.
         */
        public Builder clearContext() {
          bitField0_ = (bitField0_ & ~0x00020000);
          context_ = 0;
          onChanged();
          return this;
        }

        private java.lang.Object context22_ = "";
        /**
         * <pre>
         * OpenRTB &lt;= 2.2 compatibility; use context for 2.3+.
         * </pre>
         *
         * <code>optional string context_22 = 12;</code>
         * @return Whether the context22 field is set.
         */
        public boolean hasContext22() {
          return ((bitField0_ & 0x00040000) != 0);
        }
        /**
         * <pre>
         * OpenRTB &lt;= 2.2 compatibility; use context for 2.3+.
         * </pre>
         *
         * <code>optional string context_22 = 12;</code>
         * @return The context22.
         */
        public java.lang.String getContext22() {
          java.lang.Object ref = context22_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              context22_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * OpenRTB &lt;= 2.2 compatibility; use context for 2.3+.
         * </pre>
         *
         * <code>optional string context_22 = 12;</code>
         * @return The bytes for context22.
         */
        public com.google.protobuf.ByteString
            getContext22Bytes() {
          java.lang.Object ref = context22_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            context22_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * OpenRTB &lt;= 2.2 compatibility; use context for 2.3+.
         * </pre>
         *
         * <code>optional string context_22 = 12;</code>
         * @param value The context22 to set.
         * @return This builder for chaining.
         */
        public Builder setContext22(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00040000;
          context22_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * OpenRTB &lt;= 2.2 compatibility; use context for 2.3+.
         * </pre>
         *
         * <code>optional string context_22 = 12;</code>
         * @return This builder for chaining.
         */
        public Builder clearContext22() {
          bitField0_ = (bitField0_ & ~0x00040000);
          context22_ = getDefaultInstance().getContext22();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * OpenRTB &lt;= 2.2 compatibility; use context for 2.3+.
         * </pre>
         *
         * <code>optional string context_22 = 12;</code>
         * @param value The bytes for context22 to set.
         * @return This builder for chaining.
         */
        public Builder setContext22Bytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00040000;
          context22_ = value;
          onChanged();
          return this;
        }

        private boolean livestream_ ;
        /**
         * <pre>
         * 0 = not live, 1 = content is live (e.g., stream, live blog).
         * </pre>
         *
         * <code>optional bool livestream = 13;</code>
         * @return Whether the livestream field is set.
         */
        @java.lang.Override
        public boolean hasLivestream() {
          return ((bitField0_ & 0x00080000) != 0);
        }
        /**
         * <pre>
         * 0 = not live, 1 = content is live (e.g., stream, live blog).
         * </pre>
         *
         * <code>optional bool livestream = 13;</code>
         * @return The livestream.
         */
        @java.lang.Override
        public boolean getLivestream() {
          return livestream_;
        }
        /**
         * <pre>
         * 0 = not live, 1 = content is live (e.g., stream, live blog).
         * </pre>
         *
         * <code>optional bool livestream = 13;</code>
         * @param value The livestream to set.
         * @return This builder for chaining.
         */
        public Builder setLivestream(boolean value) {
          bitField0_ |= 0x00080000;
          livestream_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * 0 = not live, 1 = content is live (e.g., stream, live blog).
         * </pre>
         *
         * <code>optional bool livestream = 13;</code>
         * @return This builder for chaining.
         */
        public Builder clearLivestream() {
          bitField0_ = (bitField0_ & ~0x00080000);
          livestream_ = false;
          onChanged();
          return this;
        }

        private boolean sourcerelationship_ ;
        /**
         * <pre>
         * 0 = indirect, 1 = direct.
         * </pre>
         *
         * <code>optional bool sourcerelationship = 14;</code>
         * @return Whether the sourcerelationship field is set.
         */
        @java.lang.Override
        public boolean hasSourcerelationship() {
          return ((bitField0_ & 0x00100000) != 0);
        }
        /**
         * <pre>
         * 0 = indirect, 1 = direct.
         * </pre>
         *
         * <code>optional bool sourcerelationship = 14;</code>
         * @return The sourcerelationship.
         */
        @java.lang.Override
        public boolean getSourcerelationship() {
          return sourcerelationship_;
        }
        /**
         * <pre>
         * 0 = indirect, 1 = direct.
         * </pre>
         *
         * <code>optional bool sourcerelationship = 14;</code>
         * @param value The sourcerelationship to set.
         * @return This builder for chaining.
         */
        public Builder setSourcerelationship(boolean value) {
          bitField0_ |= 0x00100000;
          sourcerelationship_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * 0 = indirect, 1 = direct.
         * </pre>
         *
         * <code>optional bool sourcerelationship = 14;</code>
         * @return This builder for chaining.
         */
        public Builder clearSourcerelationship() {
          bitField0_ = (bitField0_ & ~0x00100000);
          sourcerelationship_ = false;
          onChanged();
          return this;
        }

        private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer producer_;
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.ProducerOrBuilder> producerBuilder_;
        /**
         * <pre>
         * Details about the content Producer (Section 3.2.10).
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Producer producer = 15;</code>
         * @return Whether the producer field is set.
         */
        public boolean hasProducer() {
          return ((bitField0_ & 0x00200000) != 0);
        }
        /**
         * <pre>
         * Details about the content Producer (Section 3.2.10).
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Producer producer = 15;</code>
         * @return The producer.
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer getProducer() {
          if (producerBuilder_ == null) {
            return producer_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer.getDefaultInstance() : producer_;
          } else {
            return producerBuilder_.getMessage();
          }
        }
        /**
         * <pre>
         * Details about the content Producer (Section 3.2.10).
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Producer producer = 15;</code>
         */
        public Builder setProducer(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer value) {
          if (producerBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            producer_ = value;
            onChanged();
          } else {
            producerBuilder_.setMessage(value);
          }
          bitField0_ |= 0x00200000;
          return this;
        }
        /**
         * <pre>
         * Details about the content Producer (Section 3.2.10).
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Producer producer = 15;</code>
         */
        public Builder setProducer(
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer.Builder builderForValue) {
          if (producerBuilder_ == null) {
            producer_ = builderForValue.build();
            onChanged();
          } else {
            producerBuilder_.setMessage(builderForValue.build());
          }
          bitField0_ |= 0x00200000;
          return this;
        }
        /**
         * <pre>
         * Details about the content Producer (Section 3.2.10).
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Producer producer = 15;</code>
         */
        public Builder mergeProducer(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer value) {
          if (producerBuilder_ == null) {
            if (((bitField0_ & 0x00200000) != 0) &&
                producer_ != null &&
                producer_ != com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer.getDefaultInstance()) {
              producer_ =
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer.newBuilder(producer_).mergeFrom(value).buildPartial();
            } else {
              producer_ = value;
            }
            onChanged();
          } else {
            producerBuilder_.mergeFrom(value);
          }
          bitField0_ |= 0x00200000;
          return this;
        }
        /**
         * <pre>
         * Details about the content Producer (Section 3.2.10).
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Producer producer = 15;</code>
         */
        public Builder clearProducer() {
          if (producerBuilder_ == null) {
            producer_ = null;
            onChanged();
          } else {
            producerBuilder_.clear();
          }
          bitField0_ = (bitField0_ & ~0x00200000);
          return this;
        }
        /**
         * <pre>
         * Details about the content Producer (Section 3.2.10).
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Producer producer = 15;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer.Builder getProducerBuilder() {
          bitField0_ |= 0x00200000;
          onChanged();
          return getProducerFieldBuilder().getBuilder();
        }
        /**
         * <pre>
         * Details about the content Producer (Section 3.2.10).
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Producer producer = 15;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.ProducerOrBuilder getProducerOrBuilder() {
          if (producerBuilder_ != null) {
            return producerBuilder_.getMessageOrBuilder();
          } else {
            return producer_ == null ?
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer.getDefaultInstance() : producer_;
          }
        }
        /**
         * <pre>
         * Details about the content Producer (Section 3.2.10).
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Producer producer = 15;</code>
         */
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.ProducerOrBuilder> 
            getProducerFieldBuilder() {
          if (producerBuilder_ == null) {
            producerBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.ProducerOrBuilder>(
                    getProducer(),
                    getParentForChildren(),
                    isClean());
            producer_ = null;
          }
          return producerBuilder_;
        }

        private int len_ ;
        /**
         * <pre>
         * Length of content in seconds; appropriate for video or audio.
         * </pre>
         *
         * <code>optional int32 len = 16;</code>
         * @return Whether the len field is set.
         */
        @java.lang.Override
        public boolean hasLen() {
          return ((bitField0_ & 0x00400000) != 0);
        }
        /**
         * <pre>
         * Length of content in seconds; appropriate for video or audio.
         * </pre>
         *
         * <code>optional int32 len = 16;</code>
         * @return The len.
         */
        @java.lang.Override
        public int getLen() {
          return len_;
        }
        /**
         * <pre>
         * Length of content in seconds; appropriate for video or audio.
         * </pre>
         *
         * <code>optional int32 len = 16;</code>
         * @param value The len to set.
         * @return This builder for chaining.
         */
        public Builder setLen(int value) {
          bitField0_ |= 0x00400000;
          len_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Length of content in seconds; appropriate for video or audio.
         * </pre>
         *
         * <code>optional int32 len = 16;</code>
         * @return This builder for chaining.
         */
        public Builder clearLen() {
          bitField0_ = (bitField0_ & ~0x00400000);
          len_ = 0;
          onChanged();
          return this;
        }

        private int qagmediarating_ ;
        /**
         * <pre>
         * Media rating per QAG guidelines.
         * Refer to enum com.iabtechlab.adcom.v1.MediaRating for generic values.
         * </pre>
         *
         * <code>optional int32 qagmediarating = 17;</code>
         * @return Whether the qagmediarating field is set.
         */
        @java.lang.Override
        public boolean hasQagmediarating() {
          return ((bitField0_ & 0x00800000) != 0);
        }
        /**
         * <pre>
         * Media rating per QAG guidelines.
         * Refer to enum com.iabtechlab.adcom.v1.MediaRating for generic values.
         * </pre>
         *
         * <code>optional int32 qagmediarating = 17;</code>
         * @return The qagmediarating.
         */
        @java.lang.Override
        public int getQagmediarating() {
          return qagmediarating_;
        }
        /**
         * <pre>
         * Media rating per QAG guidelines.
         * Refer to enum com.iabtechlab.adcom.v1.MediaRating for generic values.
         * </pre>
         *
         * <code>optional int32 qagmediarating = 17;</code>
         * @param value The qagmediarating to set.
         * @return This builder for chaining.
         */
        public Builder setQagmediarating(int value) {
          bitField0_ |= 0x00800000;
          qagmediarating_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Media rating per QAG guidelines.
         * Refer to enum com.iabtechlab.adcom.v1.MediaRating for generic values.
         * </pre>
         *
         * <code>optional int32 qagmediarating = 17;</code>
         * @return This builder for chaining.
         */
        public Builder clearQagmediarating() {
          bitField0_ = (bitField0_ & ~0x00800000);
          qagmediarating_ = 0;
          onChanged();
          return this;
        }

        private boolean embeddable_ ;
        /**
         * <pre>
         * Indicator of whether or not the content is embeddable (e.g., an
         * embeddable video player), where 0 = no, 1 = yes.
         * </pre>
         *
         * <code>optional bool embeddable = 18;</code>
         * @return Whether the embeddable field is set.
         */
        @java.lang.Override
        public boolean hasEmbeddable() {
          return ((bitField0_ & 0x01000000) != 0);
        }
        /**
         * <pre>
         * Indicator of whether or not the content is embeddable (e.g., an
         * embeddable video player), where 0 = no, 1 = yes.
         * </pre>
         *
         * <code>optional bool embeddable = 18;</code>
         * @return The embeddable.
         */
        @java.lang.Override
        public boolean getEmbeddable() {
          return embeddable_;
        }
        /**
         * <pre>
         * Indicator of whether or not the content is embeddable (e.g., an
         * embeddable video player), where 0 = no, 1 = yes.
         * </pre>
         *
         * <code>optional bool embeddable = 18;</code>
         * @param value The embeddable to set.
         * @return This builder for chaining.
         */
        public Builder setEmbeddable(boolean value) {
          bitField0_ |= 0x01000000;
          embeddable_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Indicator of whether or not the content is embeddable (e.g., an
         * embeddable video player), where 0 = no, 1 = yes.
         * </pre>
         *
         * <code>optional bool embeddable = 18;</code>
         * @return This builder for chaining.
         */
        public Builder clearEmbeddable() {
          bitField0_ = (bitField0_ & ~0x01000000);
          embeddable_ = false;
          onChanged();
          return this;
        }

        private java.lang.Object language_ = "";
        /**
         * <pre>
         * Content language using ISO-639-1-alpha-2.
         * </pre>
         *
         * <code>optional string language = 19;</code>
         * @return Whether the language field is set.
         */
        public boolean hasLanguage() {
          return ((bitField0_ & 0x02000000) != 0);
        }
        /**
         * <pre>
         * Content language using ISO-639-1-alpha-2.
         * </pre>
         *
         * <code>optional string language = 19;</code>
         * @return The language.
         */
        public java.lang.String getLanguage() {
          java.lang.Object ref = language_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              language_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Content language using ISO-639-1-alpha-2.
         * </pre>
         *
         * <code>optional string language = 19;</code>
         * @return The bytes for language.
         */
        public com.google.protobuf.ByteString
            getLanguageBytes() {
          java.lang.Object ref = language_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            language_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Content language using ISO-639-1-alpha-2.
         * </pre>
         *
         * <code>optional string language = 19;</code>
         * @param value The language to set.
         * @return This builder for chaining.
         */
        public Builder setLanguage(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x02000000;
          language_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Content language using ISO-639-1-alpha-2.
         * </pre>
         *
         * <code>optional string language = 19;</code>
         * @return This builder for chaining.
         */
        public Builder clearLanguage() {
          bitField0_ = (bitField0_ & ~0x02000000);
          language_ = getDefaultInstance().getLanguage();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Content language using ISO-639-1-alpha-2.
         * </pre>
         *
         * <code>optional string language = 19;</code>
         * @param value The bytes for language to set.
         * @return This builder for chaining.
         */
        public Builder setLanguageBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x02000000;
          language_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object langb_ = "";
        /**
         * <pre>
         * Content language using IETF BCP 47.
         * Only one of language or langb should be present.
         * </pre>
         *
         * <code>optional string langb = 29;</code>
         * @return Whether the langb field is set.
         */
        public boolean hasLangb() {
          return ((bitField0_ & 0x04000000) != 0);
        }
        /**
         * <pre>
         * Content language using IETF BCP 47.
         * Only one of language or langb should be present.
         * </pre>
         *
         * <code>optional string langb = 29;</code>
         * @return The langb.
         */
        public java.lang.String getLangb() {
          java.lang.Object ref = langb_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              langb_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Content language using IETF BCP 47.
         * Only one of language or langb should be present.
         * </pre>
         *
         * <code>optional string langb = 29;</code>
         * @return The bytes for langb.
         */
        public com.google.protobuf.ByteString
            getLangbBytes() {
          java.lang.Object ref = langb_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            langb_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Content language using IETF BCP 47.
         * Only one of language or langb should be present.
         * </pre>
         *
         * <code>optional string langb = 29;</code>
         * @param value The langb to set.
         * @return This builder for chaining.
         */
        public Builder setLangb(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x04000000;
          langb_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Content language using IETF BCP 47.
         * Only one of language or langb should be present.
         * </pre>
         *
         * <code>optional string langb = 29;</code>
         * @return This builder for chaining.
         */
        public Builder clearLangb() {
          bitField0_ = (bitField0_ & ~0x04000000);
          langb_ = getDefaultInstance().getLangb();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Content language using IETF BCP 47.
         * Only one of language or langb should be present.
         * </pre>
         *
         * <code>optional string langb = 29;</code>
         * @param value The bytes for langb to set.
         * @return This builder for chaining.
         */
        public Builder setLangbBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x04000000;
          langb_ = value;
          onChanged();
          return this;
        }

        private java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data> data_ =
          java.util.Collections.emptyList();
        private void ensureDataIsMutable() {
          if (!((bitField0_ & 0x08000000) != 0)) {
            data_ = new java.util.ArrayList<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data>(data_);
            bitField0_ |= 0x08000000;
           }
        }

        private com.google.protobuf.RepeatedFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.DataOrBuilder> dataBuilder_;

        /**
         * <pre>
         * Additional content data. Each Data object represents a different
         * data source.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 28;</code>
         */
        public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data> getDataList() {
          if (dataBuilder_ == null) {
            return java.util.Collections.unmodifiableList(data_);
          } else {
            return dataBuilder_.getMessageList();
          }
        }
        /**
         * <pre>
         * Additional content data. Each Data object represents a different
         * data source.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 28;</code>
         */
        public int getDataCount() {
          if (dataBuilder_ == null) {
            return data_.size();
          } else {
            return dataBuilder_.getCount();
          }
        }
        /**
         * <pre>
         * Additional content data. Each Data object represents a different
         * data source.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 28;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data getData(int index) {
          if (dataBuilder_ == null) {
            return data_.get(index);
          } else {
            return dataBuilder_.getMessage(index);
          }
        }
        /**
         * <pre>
         * Additional content data. Each Data object represents a different
         * data source.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 28;</code>
         */
        public Builder setData(
            int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data value) {
          if (dataBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            ensureDataIsMutable();
            data_.set(index, value);
            onChanged();
          } else {
            dataBuilder_.setMessage(index, value);
          }
          return this;
        }
        /**
         * <pre>
         * Additional content data. Each Data object represents a different
         * data source.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 28;</code>
         */
        public Builder setData(
            int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Builder builderForValue) {
          if (dataBuilder_ == null) {
            ensureDataIsMutable();
            data_.set(index, builderForValue.build());
            onChanged();
          } else {
            dataBuilder_.setMessage(index, builderForValue.build());
          }
          return this;
        }
        /**
         * <pre>
         * Additional content data. Each Data object represents a different
         * data source.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 28;</code>
         */
        public Builder addData(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data value) {
          if (dataBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            ensureDataIsMutable();
            data_.add(value);
            onChanged();
          } else {
            dataBuilder_.addMessage(value);
          }
          return this;
        }
        /**
         * <pre>
         * Additional content data. Each Data object represents a different
         * data source.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 28;</code>
         */
        public Builder addData(
            int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data value) {
          if (dataBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            ensureDataIsMutable();
            data_.add(index, value);
            onChanged();
          } else {
            dataBuilder_.addMessage(index, value);
          }
          return this;
        }
        /**
         * <pre>
         * Additional content data. Each Data object represents a different
         * data source.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 28;</code>
         */
        public Builder addData(
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Builder builderForValue) {
          if (dataBuilder_ == null) {
            ensureDataIsMutable();
            data_.add(builderForValue.build());
            onChanged();
          } else {
            dataBuilder_.addMessage(builderForValue.build());
          }
          return this;
        }
        /**
         * <pre>
         * Additional content data. Each Data object represents a different
         * data source.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 28;</code>
         */
        public Builder addData(
            int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Builder builderForValue) {
          if (dataBuilder_ == null) {
            ensureDataIsMutable();
            data_.add(index, builderForValue.build());
            onChanged();
          } else {
            dataBuilder_.addMessage(index, builderForValue.build());
          }
          return this;
        }
        /**
         * <pre>
         * Additional content data. Each Data object represents a different
         * data source.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 28;</code>
         */
        public Builder addAllData(
            java.lang.Iterable<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data> values) {
          if (dataBuilder_ == null) {
            ensureDataIsMutable();
            com.google.protobuf.AbstractMessageLite.Builder.addAll(
                values, data_);
            onChanged();
          } else {
            dataBuilder_.addAllMessages(values);
          }
          return this;
        }
        /**
         * <pre>
         * Additional content data. Each Data object represents a different
         * data source.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 28;</code>
         */
        public Builder clearData() {
          if (dataBuilder_ == null) {
            data_ = java.util.Collections.emptyList();
            bitField0_ = (bitField0_ & ~0x08000000);
            onChanged();
          } else {
            dataBuilder_.clear();
          }
          return this;
        }
        /**
         * <pre>
         * Additional content data. Each Data object represents a different
         * data source.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 28;</code>
         */
        public Builder removeData(int index) {
          if (dataBuilder_ == null) {
            ensureDataIsMutable();
            data_.remove(index);
            onChanged();
          } else {
            dataBuilder_.remove(index);
          }
          return this;
        }
        /**
         * <pre>
         * Additional content data. Each Data object represents a different
         * data source.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 28;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Builder getDataBuilder(
            int index) {
          return getDataFieldBuilder().getBuilder(index);
        }
        /**
         * <pre>
         * Additional content data. Each Data object represents a different
         * data source.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 28;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.DataOrBuilder getDataOrBuilder(
            int index) {
          if (dataBuilder_ == null) {
            return data_.get(index);  } else {
            return dataBuilder_.getMessageOrBuilder(index);
          }
        }
        /**
         * <pre>
         * Additional content data. Each Data object represents a different
         * data source.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 28;</code>
         */
        public java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.DataOrBuilder> 
             getDataOrBuilderList() {
          if (dataBuilder_ != null) {
            return dataBuilder_.getMessageOrBuilderList();
          } else {
            return java.util.Collections.unmodifiableList(data_);
          }
        }
        /**
         * <pre>
         * Additional content data. Each Data object represents a different
         * data source.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 28;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Builder addDataBuilder() {
          return getDataFieldBuilder().addBuilder(
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.getDefaultInstance());
        }
        /**
         * <pre>
         * Additional content data. Each Data object represents a different
         * data source.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 28;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Builder addDataBuilder(
            int index) {
          return getDataFieldBuilder().addBuilder(
              index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.getDefaultInstance());
        }
        /**
         * <pre>
         * Additional content data. Each Data object represents a different
         * data source.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 28;</code>
         */
        public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Builder> 
             getDataBuilderList() {
          return getDataFieldBuilder().getBuilderList();
        }
        private com.google.protobuf.RepeatedFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.DataOrBuilder> 
            getDataFieldBuilder() {
          if (dataBuilder_ == null) {
            dataBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.DataOrBuilder>(
                    data_,
                    ((bitField0_ & 0x08000000) != 0),
                    getParentForChildren(),
                    isClean());
            data_ = null;
          }
          return dataBuilder_;
        }

        private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network network_;
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.NetworkOrBuilder> networkBuilder_;
        /**
         * <pre>
         * Details about the network the content is on.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Network network = 30;</code>
         * @return Whether the network field is set.
         */
        public boolean hasNetwork() {
          return ((bitField0_ & 0x10000000) != 0);
        }
        /**
         * <pre>
         * Details about the network the content is on.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Network network = 30;</code>
         * @return The network.
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network getNetwork() {
          if (networkBuilder_ == null) {
            return network_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network.getDefaultInstance() : network_;
          } else {
            return networkBuilder_.getMessage();
          }
        }
        /**
         * <pre>
         * Details about the network the content is on.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Network network = 30;</code>
         */
        public Builder setNetwork(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network value) {
          if (networkBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            network_ = value;
            onChanged();
          } else {
            networkBuilder_.setMessage(value);
          }
          bitField0_ |= 0x10000000;
          return this;
        }
        /**
         * <pre>
         * Details about the network the content is on.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Network network = 30;</code>
         */
        public Builder setNetwork(
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network.Builder builderForValue) {
          if (networkBuilder_ == null) {
            network_ = builderForValue.build();
            onChanged();
          } else {
            networkBuilder_.setMessage(builderForValue.build());
          }
          bitField0_ |= 0x10000000;
          return this;
        }
        /**
         * <pre>
         * Details about the network the content is on.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Network network = 30;</code>
         */
        public Builder mergeNetwork(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network value) {
          if (networkBuilder_ == null) {
            if (((bitField0_ & 0x10000000) != 0) &&
                network_ != null &&
                network_ != com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network.getDefaultInstance()) {
              network_ =
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network.newBuilder(network_).mergeFrom(value).buildPartial();
            } else {
              network_ = value;
            }
            onChanged();
          } else {
            networkBuilder_.mergeFrom(value);
          }
          bitField0_ |= 0x10000000;
          return this;
        }
        /**
         * <pre>
         * Details about the network the content is on.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Network network = 30;</code>
         */
        public Builder clearNetwork() {
          if (networkBuilder_ == null) {
            network_ = null;
            onChanged();
          } else {
            networkBuilder_.clear();
          }
          bitField0_ = (bitField0_ & ~0x10000000);
          return this;
        }
        /**
         * <pre>
         * Details about the network the content is on.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Network network = 30;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network.Builder getNetworkBuilder() {
          bitField0_ |= 0x10000000;
          onChanged();
          return getNetworkFieldBuilder().getBuilder();
        }
        /**
         * <pre>
         * Details about the network the content is on.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Network network = 30;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.NetworkOrBuilder getNetworkOrBuilder() {
          if (networkBuilder_ != null) {
            return networkBuilder_.getMessageOrBuilder();
          } else {
            return network_ == null ?
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network.getDefaultInstance() : network_;
          }
        }
        /**
         * <pre>
         * Details about the network the content is on.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Network network = 30;</code>
         */
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.NetworkOrBuilder> 
            getNetworkFieldBuilder() {
          if (networkBuilder_ == null) {
            networkBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.NetworkOrBuilder>(
                    getNetwork(),
                    getParentForChildren(),
                    isClean());
            network_ = null;
          }
          return networkBuilder_;
        }

        private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel channel_;
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.ChannelOrBuilder> channelBuilder_;
        /**
         * <pre>
         * Details about the channel the content is on.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Channel channel = 31;</code>
         * @return Whether the channel field is set.
         */
        public boolean hasChannel() {
          return ((bitField0_ & 0x20000000) != 0);
        }
        /**
         * <pre>
         * Details about the channel the content is on.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Channel channel = 31;</code>
         * @return The channel.
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel getChannel() {
          if (channelBuilder_ == null) {
            return channel_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel.getDefaultInstance() : channel_;
          } else {
            return channelBuilder_.getMessage();
          }
        }
        /**
         * <pre>
         * Details about the channel the content is on.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Channel channel = 31;</code>
         */
        public Builder setChannel(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel value) {
          if (channelBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            channel_ = value;
            onChanged();
          } else {
            channelBuilder_.setMessage(value);
          }
          bitField0_ |= 0x20000000;
          return this;
        }
        /**
         * <pre>
         * Details about the channel the content is on.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Channel channel = 31;</code>
         */
        public Builder setChannel(
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel.Builder builderForValue) {
          if (channelBuilder_ == null) {
            channel_ = builderForValue.build();
            onChanged();
          } else {
            channelBuilder_.setMessage(builderForValue.build());
          }
          bitField0_ |= 0x20000000;
          return this;
        }
        /**
         * <pre>
         * Details about the channel the content is on.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Channel channel = 31;</code>
         */
        public Builder mergeChannel(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel value) {
          if (channelBuilder_ == null) {
            if (((bitField0_ & 0x20000000) != 0) &&
                channel_ != null &&
                channel_ != com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel.getDefaultInstance()) {
              channel_ =
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel.newBuilder(channel_).mergeFrom(value).buildPartial();
            } else {
              channel_ = value;
            }
            onChanged();
          } else {
            channelBuilder_.mergeFrom(value);
          }
          bitField0_ |= 0x20000000;
          return this;
        }
        /**
         * <pre>
         * Details about the channel the content is on.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Channel channel = 31;</code>
         */
        public Builder clearChannel() {
          if (channelBuilder_ == null) {
            channel_ = null;
            onChanged();
          } else {
            channelBuilder_.clear();
          }
          bitField0_ = (bitField0_ & ~0x20000000);
          return this;
        }
        /**
         * <pre>
         * Details about the channel the content is on.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Channel channel = 31;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel.Builder getChannelBuilder() {
          bitField0_ |= 0x20000000;
          onChanged();
          return getChannelFieldBuilder().getBuilder();
        }
        /**
         * <pre>
         * Details about the channel the content is on.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Channel channel = 31;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.ChannelOrBuilder getChannelOrBuilder() {
          if (channelBuilder_ != null) {
            return channelBuilder_.getMessageOrBuilder();
          } else {
            return channel_ == null ?
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel.getDefaultInstance() : channel_;
          }
        }
        /**
         * <pre>
         * Details about the channel the content is on.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Channel channel = 31;</code>
         */
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.ChannelOrBuilder> 
            getChannelFieldBuilder() {
          if (channelBuilder_ == null) {
            channelBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.ChannelOrBuilder>(
                    getChannel(),
                    getParentForChildren(),
                    isClean());
            channel_ = null;
          }
          return channelBuilder_;
        }
        @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:com.iabtechlab.openrtb.v2.BidRequest.Content)
      }

      // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.BidRequest.Content)
      private static final com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content DEFAULT_INSTANCE;
      static {
        DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content();
      }

      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content getDefaultInstance() {
        return DEFAULT_INSTANCE;
      }

      @java.lang.Deprecated public static final com.google.protobuf.Parser<Content>
          PARSER = new com.google.protobuf.AbstractParser<Content>() {
        @java.lang.Override
        public Content parsePartialFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return new Content(input, extensionRegistry);
        }
      };

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

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

      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Content getDefaultInstanceForType() {
        return DEFAULT_INSTANCE;
      }

    }

    public interface ProducerOrBuilder extends
        // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.BidRequest.Producer)
        com.google.protobuf.GeneratedMessageV3.
            ExtendableMessageOrBuilder<Producer> {

      /**
       * <pre>
       * Content producer or originator ID. Useful if content is syndicated,
       * and may be posted on a site using embed tags.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return Whether the id field is set.
       */
      boolean hasId();
      /**
       * <pre>
       * Content producer or originator ID. Useful if content is syndicated,
       * and may be posted on a site using embed tags.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return The id.
       */
      java.lang.String getId();
      /**
       * <pre>
       * Content producer or originator ID. Useful if content is syndicated,
       * and may be posted on a site using embed tags.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return The bytes for id.
       */
      com.google.protobuf.ByteString
          getIdBytes();

      /**
       * <pre>
       * Content producer or originator name (e.g., "Warner Bros").
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return Whether the name field is set.
       */
      boolean hasName();
      /**
       * <pre>
       * Content producer or originator name (e.g., "Warner Bros").
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return The name.
       */
      java.lang.String getName();
      /**
       * <pre>
       * Content producer or originator name (e.g., "Warner Bros").
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return The bytes for name.
       */
      com.google.protobuf.ByteString
          getNameBytes();

      /**
       * <pre>
       * The taxonomy in use.
       * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
       * </pre>
       *
       * <code>optional int32 cattax = 5 [default = 1];</code>
       * @return Whether the cattax field is set.
       */
      boolean hasCattax();
      /**
       * <pre>
       * The taxonomy in use.
       * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
       * </pre>
       *
       * <code>optional int32 cattax = 5 [default = 1];</code>
       * @return The cattax.
       */
      int getCattax();

      /**
       * <pre>
       * Array of IAB content categories that describe the content producer.
       * </pre>
       *
       * <code>repeated string cat = 3;</code>
       * @return A list containing the cat.
       */
      java.util.List<java.lang.String>
          getCatList();
      /**
       * <pre>
       * Array of IAB content categories that describe the content producer.
       * </pre>
       *
       * <code>repeated string cat = 3;</code>
       * @return The count of cat.
       */
      int getCatCount();
      /**
       * <pre>
       * Array of IAB content categories that describe the content producer.
       * </pre>
       *
       * <code>repeated string cat = 3;</code>
       * @param index The index of the element to return.
       * @return The cat at the given index.
       */
      java.lang.String getCat(int index);
      /**
       * <pre>
       * Array of IAB content categories that describe the content producer.
       * </pre>
       *
       * <code>repeated string cat = 3;</code>
       * @param index The index of the value to return.
       * @return The bytes of the cat at the given index.
       */
      com.google.protobuf.ByteString
          getCatBytes(int index);

      /**
       * <pre>
       * Highest level domain of the content producer (e.g., "producer.com").
       * </pre>
       *
       * <code>optional string domain = 4;</code>
       * @return Whether the domain field is set.
       */
      boolean hasDomain();
      /**
       * <pre>
       * Highest level domain of the content producer (e.g., "producer.com").
       * </pre>
       *
       * <code>optional string domain = 4;</code>
       * @return The domain.
       */
      java.lang.String getDomain();
      /**
       * <pre>
       * Highest level domain of the content producer (e.g., "producer.com").
       * </pre>
       *
       * <code>optional string domain = 4;</code>
       * @return The bytes for domain.
       */
      com.google.protobuf.ByteString
          getDomainBytes();
    }
    /**
     * <pre>
     * OpenRTB 2.0: This object defines the producer of the content in which
     * the ad will be shown. This is particularly useful when the content is
     * syndicated and may be distributed through different publishers and thus
     * when the producer and publisher are not necessarily the same entity.
     * </pre>
     *
     * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Producer}
     */
    public static final class Producer extends
        com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
          Producer> implements
        // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.BidRequest.Producer)
        ProducerOrBuilder {
    private static final long serialVersionUID = 0L;
      // Use Producer.newBuilder() to construct.
      private Producer(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer, ?> builder) {
        super(builder);
      }
      private Producer() {
        id_ = "";
        name_ = "";
        cattax_ = 1;
        cat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        domain_ = "";
      }

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

      @java.lang.Override
      public final com.google.protobuf.UnknownFieldSet
      getUnknownFields() {
        return this.unknownFields;
      }
      private Producer(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        this();
        if (extensionRegistry == null) {
          throw new java.lang.NullPointerException();
        }
        int mutable_bitField0_ = 0;
        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
            com.google.protobuf.UnknownFieldSet.newBuilder();
        try {
          boolean done = false;
          while (!done) {
            int tag = input.readTag();
            switch (tag) {
              case 0:
                done = true;
                break;
              case 10: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000001;
                id_ = bs;
                break;
              }
              case 18: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000002;
                name_ = bs;
                break;
              }
              case 26: {
                com.google.protobuf.ByteString bs = input.readBytes();
                if (!((mutable_bitField0_ & 0x00000008) != 0)) {
                  cat_ = new com.google.protobuf.LazyStringArrayList();
                  mutable_bitField0_ |= 0x00000008;
                }
                cat_.add(bs);
                break;
              }
              case 34: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000008;
                domain_ = bs;
                break;
              }
              case 40: {
                bitField0_ |= 0x00000004;
                cattax_ = input.readInt32();
                break;
              }
              default: {
                if (!parseUnknownField(
                    input, unknownFields, extensionRegistry, tag)) {
                  done = true;
                }
                break;
              }
            }
          }
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          throw e.setUnfinishedMessage(this);
        } catch (java.io.IOException e) {
          throw new com.google.protobuf.InvalidProtocolBufferException(
              e).setUnfinishedMessage(this);
        } finally {
          if (((mutable_bitField0_ & 0x00000008) != 0)) {
            cat_ = cat_.getUnmodifiableView();
          }
          this.unknownFields = unknownFields.build();
          makeExtensionsImmutable();
        }
      }
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Producer_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Producer_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer.Builder.class);
      }

      private int bitField0_;
      public static final int ID_FIELD_NUMBER = 1;
      private volatile java.lang.Object id_;
      /**
       * <pre>
       * Content producer or originator ID. Useful if content is syndicated,
       * and may be posted on a site using embed tags.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return Whether the id field is set.
       */
      @java.lang.Override
      public boolean hasId() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <pre>
       * Content producer or originator ID. Useful if content is syndicated,
       * and may be posted on a site using embed tags.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return The id.
       */
      @java.lang.Override
      public java.lang.String getId() {
        java.lang.Object ref = id_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            id_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Content producer or originator ID. Useful if content is syndicated,
       * and may be posted on a site using embed tags.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return The bytes for id.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getIdBytes() {
        java.lang.Object ref = id_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          id_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int NAME_FIELD_NUMBER = 2;
      private volatile java.lang.Object name_;
      /**
       * <pre>
       * Content producer or originator name (e.g., "Warner Bros").
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return Whether the name field is set.
       */
      @java.lang.Override
      public boolean hasName() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <pre>
       * Content producer or originator name (e.g., "Warner Bros").
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return The name.
       */
      @java.lang.Override
      public java.lang.String getName() {
        java.lang.Object ref = name_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            name_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Content producer or originator name (e.g., "Warner Bros").
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return The bytes for name.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getNameBytes() {
        java.lang.Object ref = name_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          name_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int CATTAX_FIELD_NUMBER = 5;
      private int cattax_;
      /**
       * <pre>
       * The taxonomy in use.
       * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
       * </pre>
       *
       * <code>optional int32 cattax = 5 [default = 1];</code>
       * @return Whether the cattax field is set.
       */
      @java.lang.Override
      public boolean hasCattax() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <pre>
       * The taxonomy in use.
       * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
       * </pre>
       *
       * <code>optional int32 cattax = 5 [default = 1];</code>
       * @return The cattax.
       */
      @java.lang.Override
      public int getCattax() {
        return cattax_;
      }

      public static final int CAT_FIELD_NUMBER = 3;
      private com.google.protobuf.LazyStringList cat_;
      /**
       * <pre>
       * Array of IAB content categories that describe the content producer.
       * </pre>
       *
       * <code>repeated string cat = 3;</code>
       * @return A list containing the cat.
       */
      public com.google.protobuf.ProtocolStringList
          getCatList() {
        return cat_;
      }
      /**
       * <pre>
       * Array of IAB content categories that describe the content producer.
       * </pre>
       *
       * <code>repeated string cat = 3;</code>
       * @return The count of cat.
       */
      public int getCatCount() {
        return cat_.size();
      }
      /**
       * <pre>
       * Array of IAB content categories that describe the content producer.
       * </pre>
       *
       * <code>repeated string cat = 3;</code>
       * @param index The index of the element to return.
       * @return The cat at the given index.
       */
      public java.lang.String getCat(int index) {
        return cat_.get(index);
      }
      /**
       * <pre>
       * Array of IAB content categories that describe the content producer.
       * </pre>
       *
       * <code>repeated string cat = 3;</code>
       * @param index The index of the value to return.
       * @return The bytes of the cat at the given index.
       */
      public com.google.protobuf.ByteString
          getCatBytes(int index) {
        return cat_.getByteString(index);
      }

      public static final int DOMAIN_FIELD_NUMBER = 4;
      private volatile java.lang.Object domain_;
      /**
       * <pre>
       * Highest level domain of the content producer (e.g., "producer.com").
       * </pre>
       *
       * <code>optional string domain = 4;</code>
       * @return Whether the domain field is set.
       */
      @java.lang.Override
      public boolean hasDomain() {
        return ((bitField0_ & 0x00000008) != 0);
      }
      /**
       * <pre>
       * Highest level domain of the content producer (e.g., "producer.com").
       * </pre>
       *
       * <code>optional string domain = 4;</code>
       * @return The domain.
       */
      @java.lang.Override
      public java.lang.String getDomain() {
        java.lang.Object ref = domain_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            domain_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Highest level domain of the content producer (e.g., "producer.com").
       * </pre>
       *
       * <code>optional string domain = 4;</code>
       * @return The bytes for domain.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getDomainBytes() {
        java.lang.Object ref = domain_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          domain_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

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

        if (!extensionsAreInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
        memoizedIsInitialized = 1;
        return true;
      }

      @java.lang.Override
      public void writeTo(com.google.protobuf.CodedOutputStream output)
                          throws java.io.IOException {
        com.google.protobuf.GeneratedMessageV3
          .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer>.ExtensionWriter
            extensionWriter = newExtensionWriter();
        if (((bitField0_ & 0x00000001) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 1, id_);
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 2, name_);
        }
        for (int i = 0; i < cat_.size(); i++) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 3, cat_.getRaw(i));
        }
        if (((bitField0_ & 0x00000008) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 4, domain_);
        }
        if (((bitField0_ & 0x00000004) != 0)) {
          output.writeInt32(5, cattax_);
        }
        extensionWriter.writeUntil(10000, output);
        unknownFields.writeTo(output);
      }

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

        size = 0;
        if (((bitField0_ & 0x00000001) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, id_);
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, name_);
        }
        {
          int dataSize = 0;
          for (int i = 0; i < cat_.size(); i++) {
            dataSize += computeStringSizeNoTag(cat_.getRaw(i));
          }
          size += dataSize;
          size += 1 * getCatList().size();
        }
        if (((bitField0_ & 0x00000008) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, domain_);
        }
        if (((bitField0_ & 0x00000004) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeInt32Size(5, cattax_);
        }
        size += extensionsSerializedSize();
        size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer)) {
          return super.equals(obj);
        }
        com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer other = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer) obj;

        if (hasId() != other.hasId()) return false;
        if (hasId()) {
          if (!getId()
              .equals(other.getId())) return false;
        }
        if (hasName() != other.hasName()) return false;
        if (hasName()) {
          if (!getName()
              .equals(other.getName())) return false;
        }
        if (hasCattax() != other.hasCattax()) return false;
        if (hasCattax()) {
          if (getCattax()
              != other.getCattax()) return false;
        }
        if (!getCatList()
            .equals(other.getCatList())) return false;
        if (hasDomain() != other.hasDomain()) return false;
        if (hasDomain()) {
          if (!getDomain()
              .equals(other.getDomain())) return false;
        }
        if (!unknownFields.equals(other.unknownFields)) return false;
        if (!getExtensionFields().equals(other.getExtensionFields()))
          return false;
        return true;
      }

      @java.lang.Override
      public int hashCode() {
        if (memoizedHashCode != 0) {
          return memoizedHashCode;
        }
        int hash = 41;
        hash = (19 * hash) + getDescriptor().hashCode();
        if (hasId()) {
          hash = (37 * hash) + ID_FIELD_NUMBER;
          hash = (53 * hash) + getId().hashCode();
        }
        if (hasName()) {
          hash = (37 * hash) + NAME_FIELD_NUMBER;
          hash = (53 * hash) + getName().hashCode();
        }
        if (hasCattax()) {
          hash = (37 * hash) + CATTAX_FIELD_NUMBER;
          hash = (53 * hash) + getCattax();
        }
        if (getCatCount() > 0) {
          hash = (37 * hash) + CAT_FIELD_NUMBER;
          hash = (53 * hash) + getCatList().hashCode();
        }
        if (hasDomain()) {
          hash = (37 * hash) + DOMAIN_FIELD_NUMBER;
          hash = (53 * hash) + getDomain().hashCode();
        }
        hash = hashFields(hash, getExtensionFields());
        hash = (29 * hash) + unknownFields.hashCode();
        memoizedHashCode = hash;
        return hash;
      }

      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer parseFrom(
          java.nio.ByteBuffer data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer parseFrom(
          java.nio.ByteBuffer data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer parseFrom(
          com.google.protobuf.ByteString data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer parseFrom(
          com.google.protobuf.ByteString data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer parseFrom(byte[] data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer parseFrom(
          byte[] data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer parseFrom(java.io.InputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer parseDelimitedFrom(java.io.InputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseDelimitedWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer parseFrom(
          com.google.protobuf.CodedInputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer 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>
       * OpenRTB 2.0: This object defines the producer of the content in which
       * the ad will be shown. This is particularly useful when the content is
       * syndicated and may be distributed through different publishers and thus
       * when the producer and publisher are not necessarily the same entity.
       * </pre>
       *
       * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Producer}
       */
      public static final class Builder extends
          com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer, Builder> implements
          // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.BidRequest.Producer)
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.ProducerOrBuilder {
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Producer_descriptor;
        }

        @java.lang.Override
        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Producer_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer.Builder.class);
        }

        // Construct using com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer.newBuilder()
        private Builder() {
          maybeForceBuilderInitialization();
        }

        private Builder(
            com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
          super(parent);
          maybeForceBuilderInitialization();
        }
        private void maybeForceBuilderInitialization() {
          if (com.google.protobuf.GeneratedMessageV3
                  .alwaysUseFieldBuilders) {
          }
        }
        @java.lang.Override
        public Builder clear() {
          super.clear();
          id_ = "";
          bitField0_ = (bitField0_ & ~0x00000001);
          name_ = "";
          bitField0_ = (bitField0_ & ~0x00000002);
          cattax_ = 1;
          bitField0_ = (bitField0_ & ~0x00000004);
          cat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
          bitField0_ = (bitField0_ & ~0x00000008);
          domain_ = "";
          bitField0_ = (bitField0_ & ~0x00000010);
          return this;
        }

        @java.lang.Override
        public com.google.protobuf.Descriptors.Descriptor
            getDescriptorForType() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Producer_descriptor;
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer getDefaultInstanceForType() {
          return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer.getDefaultInstance();
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer build() {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer result = buildPartial();
          if (!result.isInitialized()) {
            throw newUninitializedMessageException(result);
          }
          return result;
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer buildPartial() {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer result = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer(this);
          int from_bitField0_ = bitField0_;
          int to_bitField0_ = 0;
          if (((from_bitField0_ & 0x00000001) != 0)) {
            to_bitField0_ |= 0x00000001;
          }
          result.id_ = id_;
          if (((from_bitField0_ & 0x00000002) != 0)) {
            to_bitField0_ |= 0x00000002;
          }
          result.name_ = name_;
          if (((from_bitField0_ & 0x00000004) != 0)) {
            to_bitField0_ |= 0x00000004;
          }
          result.cattax_ = cattax_;
          if (((bitField0_ & 0x00000008) != 0)) {
            cat_ = cat_.getUnmodifiableView();
            bitField0_ = (bitField0_ & ~0x00000008);
          }
          result.cat_ = cat_;
          if (((from_bitField0_ & 0x00000010) != 0)) {
            to_bitField0_ |= 0x00000008;
          }
          result.domain_ = domain_;
          result.bitField0_ = to_bitField0_;
          onBuilt();
          return result;
        }

        @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 <Type> Builder setExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer, Type> extension,
            Type value) {
          return super.setExtension(extension, value);
        }
        @java.lang.Override
        public <Type> Builder setExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer, java.util.List<Type>> extension,
            int index, Type value) {
          return super.setExtension(extension, index, value);
        }
        @java.lang.Override
        public <Type> Builder addExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer, java.util.List<Type>> extension,
            Type value) {
          return super.addExtension(extension, value);
        }
        @java.lang.Override
        public <Type> Builder clearExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer, ?> extension) {
          return super.clearExtension(extension);
        }
        @java.lang.Override
        public Builder mergeFrom(com.google.protobuf.Message other) {
          if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer) {
            return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer)other);
          } else {
            super.mergeFrom(other);
            return this;
          }
        }

        public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer other) {
          if (other == com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer.getDefaultInstance()) return this;
          if (other.hasId()) {
            bitField0_ |= 0x00000001;
            id_ = other.id_;
            onChanged();
          }
          if (other.hasName()) {
            bitField0_ |= 0x00000002;
            name_ = other.name_;
            onChanged();
          }
          if (other.hasCattax()) {
            setCattax(other.getCattax());
          }
          if (!other.cat_.isEmpty()) {
            if (cat_.isEmpty()) {
              cat_ = other.cat_;
              bitField0_ = (bitField0_ & ~0x00000008);
            } else {
              ensureCatIsMutable();
              cat_.addAll(other.cat_);
            }
            onChanged();
          }
          if (other.hasDomain()) {
            bitField0_ |= 0x00000010;
            domain_ = other.domain_;
            onChanged();
          }
          this.mergeExtensionFields(other);
          this.mergeUnknownFields(other.unknownFields);
          onChanged();
          return this;
        }

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

        @java.lang.Override
        public Builder mergeFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws java.io.IOException {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer parsedMessage = null;
          try {
            parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer) e.getUnfinishedMessage();
            throw e.unwrapIOException();
          } finally {
            if (parsedMessage != null) {
              mergeFrom(parsedMessage);
            }
          }
          return this;
        }
        private int bitField0_;

        private java.lang.Object id_ = "";
        /**
         * <pre>
         * Content producer or originator ID. Useful if content is syndicated,
         * and may be posted on a site using embed tags.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @return Whether the id field is set.
         */
        public boolean hasId() {
          return ((bitField0_ & 0x00000001) != 0);
        }
        /**
         * <pre>
         * Content producer or originator ID. Useful if content is syndicated,
         * and may be posted on a site using embed tags.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @return The id.
         */
        public java.lang.String getId() {
          java.lang.Object ref = id_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              id_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Content producer or originator ID. Useful if content is syndicated,
         * and may be posted on a site using embed tags.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @return The bytes for id.
         */
        public com.google.protobuf.ByteString
            getIdBytes() {
          java.lang.Object ref = id_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            id_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Content producer or originator ID. Useful if content is syndicated,
         * and may be posted on a site using embed tags.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @param value The id to set.
         * @return This builder for chaining.
         */
        public Builder setId(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
          id_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Content producer or originator ID. Useful if content is syndicated,
         * and may be posted on a site using embed tags.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @return This builder for chaining.
         */
        public Builder clearId() {
          bitField0_ = (bitField0_ & ~0x00000001);
          id_ = getDefaultInstance().getId();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Content producer or originator ID. Useful if content is syndicated,
         * and may be posted on a site using embed tags.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @param value The bytes for id to set.
         * @return This builder for chaining.
         */
        public Builder setIdBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
          id_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object name_ = "";
        /**
         * <pre>
         * Content producer or originator name (e.g., "Warner Bros").
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @return Whether the name field is set.
         */
        public boolean hasName() {
          return ((bitField0_ & 0x00000002) != 0);
        }
        /**
         * <pre>
         * Content producer or originator name (e.g., "Warner Bros").
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @return The name.
         */
        public java.lang.String getName() {
          java.lang.Object ref = name_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              name_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Content producer or originator name (e.g., "Warner Bros").
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @return The bytes for name.
         */
        public com.google.protobuf.ByteString
            getNameBytes() {
          java.lang.Object ref = name_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            name_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Content producer or originator name (e.g., "Warner Bros").
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @param value The name to set.
         * @return This builder for chaining.
         */
        public Builder setName(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
          name_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Content producer or originator name (e.g., "Warner Bros").
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @return This builder for chaining.
         */
        public Builder clearName() {
          bitField0_ = (bitField0_ & ~0x00000002);
          name_ = getDefaultInstance().getName();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Content producer or originator name (e.g., "Warner Bros").
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @param value The bytes for name to set.
         * @return This builder for chaining.
         */
        public Builder setNameBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
          name_ = value;
          onChanged();
          return this;
        }

        private int cattax_ = 1;
        /**
         * <pre>
         * The taxonomy in use.
         * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
         * </pre>
         *
         * <code>optional int32 cattax = 5 [default = 1];</code>
         * @return Whether the cattax field is set.
         */
        @java.lang.Override
        public boolean hasCattax() {
          return ((bitField0_ & 0x00000004) != 0);
        }
        /**
         * <pre>
         * The taxonomy in use.
         * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
         * </pre>
         *
         * <code>optional int32 cattax = 5 [default = 1];</code>
         * @return The cattax.
         */
        @java.lang.Override
        public int getCattax() {
          return cattax_;
        }
        /**
         * <pre>
         * The taxonomy in use.
         * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
         * </pre>
         *
         * <code>optional int32 cattax = 5 [default = 1];</code>
         * @param value The cattax to set.
         * @return This builder for chaining.
         */
        public Builder setCattax(int value) {
          bitField0_ |= 0x00000004;
          cattax_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * The taxonomy in use.
         * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
         * </pre>
         *
         * <code>optional int32 cattax = 5 [default = 1];</code>
         * @return This builder for chaining.
         */
        public Builder clearCattax() {
          bitField0_ = (bitField0_ & ~0x00000004);
          cattax_ = 1;
          onChanged();
          return this;
        }

        private com.google.protobuf.LazyStringList cat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        private void ensureCatIsMutable() {
          if (!((bitField0_ & 0x00000008) != 0)) {
            cat_ = new com.google.protobuf.LazyStringArrayList(cat_);
            bitField0_ |= 0x00000008;
           }
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the content producer.
         * </pre>
         *
         * <code>repeated string cat = 3;</code>
         * @return A list containing the cat.
         */
        public com.google.protobuf.ProtocolStringList
            getCatList() {
          return cat_.getUnmodifiableView();
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the content producer.
         * </pre>
         *
         * <code>repeated string cat = 3;</code>
         * @return The count of cat.
         */
        public int getCatCount() {
          return cat_.size();
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the content producer.
         * </pre>
         *
         * <code>repeated string cat = 3;</code>
         * @param index The index of the element to return.
         * @return The cat at the given index.
         */
        public java.lang.String getCat(int index) {
          return cat_.get(index);
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the content producer.
         * </pre>
         *
         * <code>repeated string cat = 3;</code>
         * @param index The index of the value to return.
         * @return The bytes of the cat at the given index.
         */
        public com.google.protobuf.ByteString
            getCatBytes(int index) {
          return cat_.getByteString(index);
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the content producer.
         * </pre>
         *
         * <code>repeated string cat = 3;</code>
         * @param index The index to set the value at.
         * @param value The cat to set.
         * @return This builder for chaining.
         */
        public Builder setCat(
            int index, java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  ensureCatIsMutable();
          cat_.set(index, value);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the content producer.
         * </pre>
         *
         * <code>repeated string cat = 3;</code>
         * @param value The cat to add.
         * @return This builder for chaining.
         */
        public Builder addCat(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  ensureCatIsMutable();
          cat_.add(value);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the content producer.
         * </pre>
         *
         * <code>repeated string cat = 3;</code>
         * @param values The cat to add.
         * @return This builder for chaining.
         */
        public Builder addAllCat(
            java.lang.Iterable<java.lang.String> values) {
          ensureCatIsMutable();
          com.google.protobuf.AbstractMessageLite.Builder.addAll(
              values, cat_);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the content producer.
         * </pre>
         *
         * <code>repeated string cat = 3;</code>
         * @return This builder for chaining.
         */
        public Builder clearCat() {
          cat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
          bitField0_ = (bitField0_ & ~0x00000008);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Array of IAB content categories that describe the content producer.
         * </pre>
         *
         * <code>repeated string cat = 3;</code>
         * @param value The bytes of the cat to add.
         * @return This builder for chaining.
         */
        public Builder addCatBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  ensureCatIsMutable();
          cat_.add(value);
          onChanged();
          return this;
        }

        private java.lang.Object domain_ = "";
        /**
         * <pre>
         * Highest level domain of the content producer (e.g., "producer.com").
         * </pre>
         *
         * <code>optional string domain = 4;</code>
         * @return Whether the domain field is set.
         */
        public boolean hasDomain() {
          return ((bitField0_ & 0x00000010) != 0);
        }
        /**
         * <pre>
         * Highest level domain of the content producer (e.g., "producer.com").
         * </pre>
         *
         * <code>optional string domain = 4;</code>
         * @return The domain.
         */
        public java.lang.String getDomain() {
          java.lang.Object ref = domain_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              domain_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Highest level domain of the content producer (e.g., "producer.com").
         * </pre>
         *
         * <code>optional string domain = 4;</code>
         * @return The bytes for domain.
         */
        public com.google.protobuf.ByteString
            getDomainBytes() {
          java.lang.Object ref = domain_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            domain_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Highest level domain of the content producer (e.g., "producer.com").
         * </pre>
         *
         * <code>optional string domain = 4;</code>
         * @param value The domain to set.
         * @return This builder for chaining.
         */
        public Builder setDomain(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
          domain_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Highest level domain of the content producer (e.g., "producer.com").
         * </pre>
         *
         * <code>optional string domain = 4;</code>
         * @return This builder for chaining.
         */
        public Builder clearDomain() {
          bitField0_ = (bitField0_ & ~0x00000010);
          domain_ = getDefaultInstance().getDomain();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Highest level domain of the content producer (e.g., "producer.com").
         * </pre>
         *
         * <code>optional string domain = 4;</code>
         * @param value The bytes for domain to set.
         * @return This builder for chaining.
         */
        public Builder setDomainBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
          domain_ = value;
          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:com.iabtechlab.openrtb.v2.BidRequest.Producer)
      }

      // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.BidRequest.Producer)
      private static final com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer DEFAULT_INSTANCE;
      static {
        DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer();
      }

      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer getDefaultInstance() {
        return DEFAULT_INSTANCE;
      }

      @java.lang.Deprecated public static final com.google.protobuf.Parser<Producer>
          PARSER = new com.google.protobuf.AbstractParser<Producer>() {
        @java.lang.Override
        public Producer parsePartialFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return new Producer(input, extensionRegistry);
        }
      };

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

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

      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Producer getDefaultInstanceForType() {
        return DEFAULT_INSTANCE;
      }

    }

    public interface NetworkOrBuilder extends
        // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.BidRequest.Network)
        com.google.protobuf.GeneratedMessageV3.
            ExtendableMessageOrBuilder<Network> {

      /**
       * <pre>
       * A unique identifier assigned by the publisher. This may not be a unique
       * identifier across all supply sources.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return Whether the id field is set.
       */
      boolean hasId();
      /**
       * <pre>
       * A unique identifier assigned by the publisher. This may not be a unique
       * identifier across all supply sources.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return The id.
       */
      java.lang.String getId();
      /**
       * <pre>
       * A unique identifier assigned by the publisher. This may not be a unique
       * identifier across all supply sources.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return The bytes for id.
       */
      com.google.protobuf.ByteString
          getIdBytes();

      /**
       * <pre>
       * Network the content is on (e.g., a TV network like "ABC").
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return Whether the name field is set.
       */
      boolean hasName();
      /**
       * <pre>
       * Network the content is on (e.g., a TV network like "ABC").
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return The name.
       */
      java.lang.String getName();
      /**
       * <pre>
       * Network the content is on (e.g., a TV network like "ABC").
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return The bytes for name.
       */
      com.google.protobuf.ByteString
          getNameBytes();

      /**
       * <pre>
       * The primary domain of the network (e.g. "abc.com" in the case of the
       * network ABC). It is recommended to include the top private domain (PSL+1)
       * for DSP targeting normalization purposes.
       * </pre>
       *
       * <code>optional string domain = 3;</code>
       * @return Whether the domain field is set.
       */
      boolean hasDomain();
      /**
       * <pre>
       * The primary domain of the network (e.g. "abc.com" in the case of the
       * network ABC). It is recommended to include the top private domain (PSL+1)
       * for DSP targeting normalization purposes.
       * </pre>
       *
       * <code>optional string domain = 3;</code>
       * @return The domain.
       */
      java.lang.String getDomain();
      /**
       * <pre>
       * The primary domain of the network (e.g. "abc.com" in the case of the
       * network ABC). It is recommended to include the top private domain (PSL+1)
       * for DSP targeting normalization purposes.
       * </pre>
       *
       * <code>optional string domain = 3;</code>
       * @return The bytes for domain.
       */
      com.google.protobuf.ByteString
          getDomainBytes();
    }
    /**
     * <pre>
     * This object describes the network an ad will be displayed on. A Network is
     * defined as the parent entity of the Channel object’s entity for the
     * purposes of organizing Channels. Examples are companies that own and/or
     * license a collection of content channels (Viacom, Discovery, CBS,
     * WarnerMedia, Turner and others), or studio that creates such content and
     * self-distributes content. Name is a human-readable field while domain and
     * id can be used for reporting and targeting purposes.
     * </pre>
     *
     * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Network}
     */
    public static final class Network extends
        com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
          Network> implements
        // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.BidRequest.Network)
        NetworkOrBuilder {
    private static final long serialVersionUID = 0L;
      // Use Network.newBuilder() to construct.
      private Network(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network, ?> builder) {
        super(builder);
      }
      private Network() {
        id_ = "";
        name_ = "";
        domain_ = "";
      }

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

      @java.lang.Override
      public final com.google.protobuf.UnknownFieldSet
      getUnknownFields() {
        return this.unknownFields;
      }
      private Network(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        this();
        if (extensionRegistry == null) {
          throw new java.lang.NullPointerException();
        }
        int mutable_bitField0_ = 0;
        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
            com.google.protobuf.UnknownFieldSet.newBuilder();
        try {
          boolean done = false;
          while (!done) {
            int tag = input.readTag();
            switch (tag) {
              case 0:
                done = true;
                break;
              case 10: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000001;
                id_ = bs;
                break;
              }
              case 18: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000002;
                name_ = bs;
                break;
              }
              case 26: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000004;
                domain_ = bs;
                break;
              }
              default: {
                if (!parseUnknownField(
                    input, unknownFields, extensionRegistry, tag)) {
                  done = true;
                }
                break;
              }
            }
          }
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          throw e.setUnfinishedMessage(this);
        } catch (java.io.IOException e) {
          throw new com.google.protobuf.InvalidProtocolBufferException(
              e).setUnfinishedMessage(this);
        } finally {
          this.unknownFields = unknownFields.build();
          makeExtensionsImmutable();
        }
      }
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Network_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Network_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network.Builder.class);
      }

      private int bitField0_;
      public static final int ID_FIELD_NUMBER = 1;
      private volatile java.lang.Object id_;
      /**
       * <pre>
       * A unique identifier assigned by the publisher. This may not be a unique
       * identifier across all supply sources.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return Whether the id field is set.
       */
      @java.lang.Override
      public boolean hasId() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <pre>
       * A unique identifier assigned by the publisher. This may not be a unique
       * identifier across all supply sources.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return The id.
       */
      @java.lang.Override
      public java.lang.String getId() {
        java.lang.Object ref = id_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            id_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * A unique identifier assigned by the publisher. This may not be a unique
       * identifier across all supply sources.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return The bytes for id.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getIdBytes() {
        java.lang.Object ref = id_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          id_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int NAME_FIELD_NUMBER = 2;
      private volatile java.lang.Object name_;
      /**
       * <pre>
       * Network the content is on (e.g., a TV network like "ABC").
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return Whether the name field is set.
       */
      @java.lang.Override
      public boolean hasName() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <pre>
       * Network the content is on (e.g., a TV network like "ABC").
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return The name.
       */
      @java.lang.Override
      public java.lang.String getName() {
        java.lang.Object ref = name_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            name_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Network the content is on (e.g., a TV network like "ABC").
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return The bytes for name.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getNameBytes() {
        java.lang.Object ref = name_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          name_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int DOMAIN_FIELD_NUMBER = 3;
      private volatile java.lang.Object domain_;
      /**
       * <pre>
       * The primary domain of the network (e.g. "abc.com" in the case of the
       * network ABC). It is recommended to include the top private domain (PSL+1)
       * for DSP targeting normalization purposes.
       * </pre>
       *
       * <code>optional string domain = 3;</code>
       * @return Whether the domain field is set.
       */
      @java.lang.Override
      public boolean hasDomain() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <pre>
       * The primary domain of the network (e.g. "abc.com" in the case of the
       * network ABC). It is recommended to include the top private domain (PSL+1)
       * for DSP targeting normalization purposes.
       * </pre>
       *
       * <code>optional string domain = 3;</code>
       * @return The domain.
       */
      @java.lang.Override
      public java.lang.String getDomain() {
        java.lang.Object ref = domain_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            domain_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * The primary domain of the network (e.g. "abc.com" in the case of the
       * network ABC). It is recommended to include the top private domain (PSL+1)
       * for DSP targeting normalization purposes.
       * </pre>
       *
       * <code>optional string domain = 3;</code>
       * @return The bytes for domain.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getDomainBytes() {
        java.lang.Object ref = domain_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          domain_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

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

        if (!extensionsAreInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
        memoizedIsInitialized = 1;
        return true;
      }

      @java.lang.Override
      public void writeTo(com.google.protobuf.CodedOutputStream output)
                          throws java.io.IOException {
        com.google.protobuf.GeneratedMessageV3
          .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network>.ExtensionWriter
            extensionWriter = newExtensionWriter();
        if (((bitField0_ & 0x00000001) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 1, id_);
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 2, name_);
        }
        if (((bitField0_ & 0x00000004) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 3, domain_);
        }
        extensionWriter.writeUntil(10000, output);
        unknownFields.writeTo(output);
      }

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

        size = 0;
        if (((bitField0_ & 0x00000001) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, id_);
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, name_);
        }
        if (((bitField0_ & 0x00000004) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, domain_);
        }
        size += extensionsSerializedSize();
        size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network)) {
          return super.equals(obj);
        }
        com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network other = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network) obj;

        if (hasId() != other.hasId()) return false;
        if (hasId()) {
          if (!getId()
              .equals(other.getId())) return false;
        }
        if (hasName() != other.hasName()) return false;
        if (hasName()) {
          if (!getName()
              .equals(other.getName())) return false;
        }
        if (hasDomain() != other.hasDomain()) return false;
        if (hasDomain()) {
          if (!getDomain()
              .equals(other.getDomain())) return false;
        }
        if (!unknownFields.equals(other.unknownFields)) return false;
        if (!getExtensionFields().equals(other.getExtensionFields()))
          return false;
        return true;
      }

      @java.lang.Override
      public int hashCode() {
        if (memoizedHashCode != 0) {
          return memoizedHashCode;
        }
        int hash = 41;
        hash = (19 * hash) + getDescriptor().hashCode();
        if (hasId()) {
          hash = (37 * hash) + ID_FIELD_NUMBER;
          hash = (53 * hash) + getId().hashCode();
        }
        if (hasName()) {
          hash = (37 * hash) + NAME_FIELD_NUMBER;
          hash = (53 * hash) + getName().hashCode();
        }
        if (hasDomain()) {
          hash = (37 * hash) + DOMAIN_FIELD_NUMBER;
          hash = (53 * hash) + getDomain().hashCode();
        }
        hash = hashFields(hash, getExtensionFields());
        hash = (29 * hash) + unknownFields.hashCode();
        memoizedHashCode = hash;
        return hash;
      }

      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network parseFrom(
          java.nio.ByteBuffer data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network parseFrom(
          java.nio.ByteBuffer data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network parseFrom(
          com.google.protobuf.ByteString data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network parseFrom(
          com.google.protobuf.ByteString data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network parseFrom(byte[] data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network parseFrom(
          byte[] data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network parseFrom(java.io.InputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network parseDelimitedFrom(java.io.InputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseDelimitedWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network parseFrom(
          com.google.protobuf.CodedInputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network 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>
       * This object describes the network an ad will be displayed on. A Network is
       * defined as the parent entity of the Channel object’s entity for the
       * purposes of organizing Channels. Examples are companies that own and/or
       * license a collection of content channels (Viacom, Discovery, CBS,
       * WarnerMedia, Turner and others), or studio that creates such content and
       * self-distributes content. Name is a human-readable field while domain and
       * id can be used for reporting and targeting purposes.
       * </pre>
       *
       * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Network}
       */
      public static final class Builder extends
          com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network, Builder> implements
          // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.BidRequest.Network)
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.NetworkOrBuilder {
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Network_descriptor;
        }

        @java.lang.Override
        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Network_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network.Builder.class);
        }

        // Construct using com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network.newBuilder()
        private Builder() {
          maybeForceBuilderInitialization();
        }

        private Builder(
            com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
          super(parent);
          maybeForceBuilderInitialization();
        }
        private void maybeForceBuilderInitialization() {
          if (com.google.protobuf.GeneratedMessageV3
                  .alwaysUseFieldBuilders) {
          }
        }
        @java.lang.Override
        public Builder clear() {
          super.clear();
          id_ = "";
          bitField0_ = (bitField0_ & ~0x00000001);
          name_ = "";
          bitField0_ = (bitField0_ & ~0x00000002);
          domain_ = "";
          bitField0_ = (bitField0_ & ~0x00000004);
          return this;
        }

        @java.lang.Override
        public com.google.protobuf.Descriptors.Descriptor
            getDescriptorForType() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Network_descriptor;
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network getDefaultInstanceForType() {
          return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network.getDefaultInstance();
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network build() {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network result = buildPartial();
          if (!result.isInitialized()) {
            throw newUninitializedMessageException(result);
          }
          return result;
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network buildPartial() {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network result = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network(this);
          int from_bitField0_ = bitField0_;
          int to_bitField0_ = 0;
          if (((from_bitField0_ & 0x00000001) != 0)) {
            to_bitField0_ |= 0x00000001;
          }
          result.id_ = id_;
          if (((from_bitField0_ & 0x00000002) != 0)) {
            to_bitField0_ |= 0x00000002;
          }
          result.name_ = name_;
          if (((from_bitField0_ & 0x00000004) != 0)) {
            to_bitField0_ |= 0x00000004;
          }
          result.domain_ = domain_;
          result.bitField0_ = to_bitField0_;
          onBuilt();
          return result;
        }

        @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 <Type> Builder setExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network, Type> extension,
            Type value) {
          return super.setExtension(extension, value);
        }
        @java.lang.Override
        public <Type> Builder setExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network, java.util.List<Type>> extension,
            int index, Type value) {
          return super.setExtension(extension, index, value);
        }
        @java.lang.Override
        public <Type> Builder addExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network, java.util.List<Type>> extension,
            Type value) {
          return super.addExtension(extension, value);
        }
        @java.lang.Override
        public <Type> Builder clearExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network, ?> extension) {
          return super.clearExtension(extension);
        }
        @java.lang.Override
        public Builder mergeFrom(com.google.protobuf.Message other) {
          if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network) {
            return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network)other);
          } else {
            super.mergeFrom(other);
            return this;
          }
        }

        public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network other) {
          if (other == com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network.getDefaultInstance()) return this;
          if (other.hasId()) {
            bitField0_ |= 0x00000001;
            id_ = other.id_;
            onChanged();
          }
          if (other.hasName()) {
            bitField0_ |= 0x00000002;
            name_ = other.name_;
            onChanged();
          }
          if (other.hasDomain()) {
            bitField0_ |= 0x00000004;
            domain_ = other.domain_;
            onChanged();
          }
          this.mergeExtensionFields(other);
          this.mergeUnknownFields(other.unknownFields);
          onChanged();
          return this;
        }

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

        @java.lang.Override
        public Builder mergeFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws java.io.IOException {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network parsedMessage = null;
          try {
            parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network) e.getUnfinishedMessage();
            throw e.unwrapIOException();
          } finally {
            if (parsedMessage != null) {
              mergeFrom(parsedMessage);
            }
          }
          return this;
        }
        private int bitField0_;

        private java.lang.Object id_ = "";
        /**
         * <pre>
         * A unique identifier assigned by the publisher. This may not be a unique
         * identifier across all supply sources.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @return Whether the id field is set.
         */
        public boolean hasId() {
          return ((bitField0_ & 0x00000001) != 0);
        }
        /**
         * <pre>
         * A unique identifier assigned by the publisher. This may not be a unique
         * identifier across all supply sources.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @return The id.
         */
        public java.lang.String getId() {
          java.lang.Object ref = id_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              id_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * A unique identifier assigned by the publisher. This may not be a unique
         * identifier across all supply sources.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @return The bytes for id.
         */
        public com.google.protobuf.ByteString
            getIdBytes() {
          java.lang.Object ref = id_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            id_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * A unique identifier assigned by the publisher. This may not be a unique
         * identifier across all supply sources.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @param value The id to set.
         * @return This builder for chaining.
         */
        public Builder setId(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
          id_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * A unique identifier assigned by the publisher. This may not be a unique
         * identifier across all supply sources.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @return This builder for chaining.
         */
        public Builder clearId() {
          bitField0_ = (bitField0_ & ~0x00000001);
          id_ = getDefaultInstance().getId();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * A unique identifier assigned by the publisher. This may not be a unique
         * identifier across all supply sources.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @param value The bytes for id to set.
         * @return This builder for chaining.
         */
        public Builder setIdBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
          id_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object name_ = "";
        /**
         * <pre>
         * Network the content is on (e.g., a TV network like "ABC").
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @return Whether the name field is set.
         */
        public boolean hasName() {
          return ((bitField0_ & 0x00000002) != 0);
        }
        /**
         * <pre>
         * Network the content is on (e.g., a TV network like "ABC").
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @return The name.
         */
        public java.lang.String getName() {
          java.lang.Object ref = name_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              name_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Network the content is on (e.g., a TV network like "ABC").
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @return The bytes for name.
         */
        public com.google.protobuf.ByteString
            getNameBytes() {
          java.lang.Object ref = name_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            name_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Network the content is on (e.g., a TV network like "ABC").
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @param value The name to set.
         * @return This builder for chaining.
         */
        public Builder setName(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
          name_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Network the content is on (e.g., a TV network like "ABC").
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @return This builder for chaining.
         */
        public Builder clearName() {
          bitField0_ = (bitField0_ & ~0x00000002);
          name_ = getDefaultInstance().getName();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Network the content is on (e.g., a TV network like "ABC").
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @param value The bytes for name to set.
         * @return This builder for chaining.
         */
        public Builder setNameBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
          name_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object domain_ = "";
        /**
         * <pre>
         * The primary domain of the network (e.g. "abc.com" in the case of the
         * network ABC). It is recommended to include the top private domain (PSL+1)
         * for DSP targeting normalization purposes.
         * </pre>
         *
         * <code>optional string domain = 3;</code>
         * @return Whether the domain field is set.
         */
        public boolean hasDomain() {
          return ((bitField0_ & 0x00000004) != 0);
        }
        /**
         * <pre>
         * The primary domain of the network (e.g. "abc.com" in the case of the
         * network ABC). It is recommended to include the top private domain (PSL+1)
         * for DSP targeting normalization purposes.
         * </pre>
         *
         * <code>optional string domain = 3;</code>
         * @return The domain.
         */
        public java.lang.String getDomain() {
          java.lang.Object ref = domain_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              domain_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * The primary domain of the network (e.g. "abc.com" in the case of the
         * network ABC). It is recommended to include the top private domain (PSL+1)
         * for DSP targeting normalization purposes.
         * </pre>
         *
         * <code>optional string domain = 3;</code>
         * @return The bytes for domain.
         */
        public com.google.protobuf.ByteString
            getDomainBytes() {
          java.lang.Object ref = domain_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            domain_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * The primary domain of the network (e.g. "abc.com" in the case of the
         * network ABC). It is recommended to include the top private domain (PSL+1)
         * for DSP targeting normalization purposes.
         * </pre>
         *
         * <code>optional string domain = 3;</code>
         * @param value The domain to set.
         * @return This builder for chaining.
         */
        public Builder setDomain(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
          domain_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * The primary domain of the network (e.g. "abc.com" in the case of the
         * network ABC). It is recommended to include the top private domain (PSL+1)
         * for DSP targeting normalization purposes.
         * </pre>
         *
         * <code>optional string domain = 3;</code>
         * @return This builder for chaining.
         */
        public Builder clearDomain() {
          bitField0_ = (bitField0_ & ~0x00000004);
          domain_ = getDefaultInstance().getDomain();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * The primary domain of the network (e.g. "abc.com" in the case of the
         * network ABC). It is recommended to include the top private domain (PSL+1)
         * for DSP targeting normalization purposes.
         * </pre>
         *
         * <code>optional string domain = 3;</code>
         * @param value The bytes for domain to set.
         * @return This builder for chaining.
         */
        public Builder setDomainBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
          domain_ = value;
          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:com.iabtechlab.openrtb.v2.BidRequest.Network)
      }

      // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.BidRequest.Network)
      private static final com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network DEFAULT_INSTANCE;
      static {
        DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network();
      }

      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network getDefaultInstance() {
        return DEFAULT_INSTANCE;
      }

      @java.lang.Deprecated public static final com.google.protobuf.Parser<Network>
          PARSER = new com.google.protobuf.AbstractParser<Network>() {
        @java.lang.Override
        public Network parsePartialFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return new Network(input, extensionRegistry);
        }
      };

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

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

      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Network getDefaultInstanceForType() {
        return DEFAULT_INSTANCE;
      }

    }

    public interface ChannelOrBuilder extends
        // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.BidRequest.Channel)
        com.google.protobuf.GeneratedMessageV3.
            ExtendableMessageOrBuilder<Channel> {

      /**
       * <pre>
       * A unique identifier assigned by the publisher. This may not be a unique
       * identifier across all supply sources.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return Whether the id field is set.
       */
      boolean hasId();
      /**
       * <pre>
       * A unique identifier assigned by the publisher. This may not be a unique
       * identifier across all supply sources.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return The id.
       */
      java.lang.String getId();
      /**
       * <pre>
       * A unique identifier assigned by the publisher. This may not be a unique
       * identifier across all supply sources.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return The bytes for id.
       */
      com.google.protobuf.ByteString
          getIdBytes();

      /**
       * <pre>
       * Channel the content is on (e.g., a TV channel like "WABC-TV").
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return Whether the name field is set.
       */
      boolean hasName();
      /**
       * <pre>
       * Channel the content is on (e.g., a TV channel like "WABC-TV").
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return The name.
       */
      java.lang.String getName();
      /**
       * <pre>
       * Channel the content is on (e.g., a TV channel like "WABC-TV").
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return The bytes for name.
       */
      com.google.protobuf.ByteString
          getNameBytes();

      /**
       * <pre>
       * The primary domain of the channel (e.g. "abc7ny.com" in the case of the
       * local channel WABC-TV). It is recommended to include the top private
       * domain (PSL+1) for DSP targeting normalization purposes.
       * </pre>
       *
       * <code>optional string domain = 3;</code>
       * @return Whether the domain field is set.
       */
      boolean hasDomain();
      /**
       * <pre>
       * The primary domain of the channel (e.g. "abc7ny.com" in the case of the
       * local channel WABC-TV). It is recommended to include the top private
       * domain (PSL+1) for DSP targeting normalization purposes.
       * </pre>
       *
       * <code>optional string domain = 3;</code>
       * @return The domain.
       */
      java.lang.String getDomain();
      /**
       * <pre>
       * The primary domain of the channel (e.g. "abc7ny.com" in the case of the
       * local channel WABC-TV). It is recommended to include the top private
       * domain (PSL+1) for DSP targeting normalization purposes.
       * </pre>
       *
       * <code>optional string domain = 3;</code>
       * @return The bytes for domain.
       */
      com.google.protobuf.ByteString
          getDomainBytes();
    }
    /**
     * <pre>
     * This object describes the channel an ad will be displayed on. A Channel is
     * defined as the entity that curates a content library, or stream within a
     * a brand name for viewers. Examples are specific view selectable ‘channels’
     * within linear and streaming television (MTV, HGTV, CNN, BBC One, etc) or a
     * specific stream of audio content commonly called ‘stations.’ Name is a
     * human-readable field while domain and id can be used for reporting and
     * targeting purposes.
     * </pre>
     *
     * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Channel}
     */
    public static final class Channel extends
        com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
          Channel> implements
        // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.BidRequest.Channel)
        ChannelOrBuilder {
    private static final long serialVersionUID = 0L;
      // Use Channel.newBuilder() to construct.
      private Channel(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel, ?> builder) {
        super(builder);
      }
      private Channel() {
        id_ = "";
        name_ = "";
        domain_ = "";
      }

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

      @java.lang.Override
      public final com.google.protobuf.UnknownFieldSet
      getUnknownFields() {
        return this.unknownFields;
      }
      private Channel(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        this();
        if (extensionRegistry == null) {
          throw new java.lang.NullPointerException();
        }
        int mutable_bitField0_ = 0;
        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
            com.google.protobuf.UnknownFieldSet.newBuilder();
        try {
          boolean done = false;
          while (!done) {
            int tag = input.readTag();
            switch (tag) {
              case 0:
                done = true;
                break;
              case 10: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000001;
                id_ = bs;
                break;
              }
              case 18: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000002;
                name_ = bs;
                break;
              }
              case 26: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000004;
                domain_ = bs;
                break;
              }
              default: {
                if (!parseUnknownField(
                    input, unknownFields, extensionRegistry, tag)) {
                  done = true;
                }
                break;
              }
            }
          }
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          throw e.setUnfinishedMessage(this);
        } catch (java.io.IOException e) {
          throw new com.google.protobuf.InvalidProtocolBufferException(
              e).setUnfinishedMessage(this);
        } finally {
          this.unknownFields = unknownFields.build();
          makeExtensionsImmutable();
        }
      }
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Channel_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Channel_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel.Builder.class);
      }

      private int bitField0_;
      public static final int ID_FIELD_NUMBER = 1;
      private volatile java.lang.Object id_;
      /**
       * <pre>
       * A unique identifier assigned by the publisher. This may not be a unique
       * identifier across all supply sources.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return Whether the id field is set.
       */
      @java.lang.Override
      public boolean hasId() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <pre>
       * A unique identifier assigned by the publisher. This may not be a unique
       * identifier across all supply sources.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return The id.
       */
      @java.lang.Override
      public java.lang.String getId() {
        java.lang.Object ref = id_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            id_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * A unique identifier assigned by the publisher. This may not be a unique
       * identifier across all supply sources.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return The bytes for id.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getIdBytes() {
        java.lang.Object ref = id_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          id_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int NAME_FIELD_NUMBER = 2;
      private volatile java.lang.Object name_;
      /**
       * <pre>
       * Channel the content is on (e.g., a TV channel like "WABC-TV").
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return Whether the name field is set.
       */
      @java.lang.Override
      public boolean hasName() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <pre>
       * Channel the content is on (e.g., a TV channel like "WABC-TV").
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return The name.
       */
      @java.lang.Override
      public java.lang.String getName() {
        java.lang.Object ref = name_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            name_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Channel the content is on (e.g., a TV channel like "WABC-TV").
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return The bytes for name.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getNameBytes() {
        java.lang.Object ref = name_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          name_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int DOMAIN_FIELD_NUMBER = 3;
      private volatile java.lang.Object domain_;
      /**
       * <pre>
       * The primary domain of the channel (e.g. "abc7ny.com" in the case of the
       * local channel WABC-TV). It is recommended to include the top private
       * domain (PSL+1) for DSP targeting normalization purposes.
       * </pre>
       *
       * <code>optional string domain = 3;</code>
       * @return Whether the domain field is set.
       */
      @java.lang.Override
      public boolean hasDomain() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <pre>
       * The primary domain of the channel (e.g. "abc7ny.com" in the case of the
       * local channel WABC-TV). It is recommended to include the top private
       * domain (PSL+1) for DSP targeting normalization purposes.
       * </pre>
       *
       * <code>optional string domain = 3;</code>
       * @return The domain.
       */
      @java.lang.Override
      public java.lang.String getDomain() {
        java.lang.Object ref = domain_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            domain_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * The primary domain of the channel (e.g. "abc7ny.com" in the case of the
       * local channel WABC-TV). It is recommended to include the top private
       * domain (PSL+1) for DSP targeting normalization purposes.
       * </pre>
       *
       * <code>optional string domain = 3;</code>
       * @return The bytes for domain.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getDomainBytes() {
        java.lang.Object ref = domain_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          domain_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

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

        if (!extensionsAreInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
        memoizedIsInitialized = 1;
        return true;
      }

      @java.lang.Override
      public void writeTo(com.google.protobuf.CodedOutputStream output)
                          throws java.io.IOException {
        com.google.protobuf.GeneratedMessageV3
          .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel>.ExtensionWriter
            extensionWriter = newExtensionWriter();
        if (((bitField0_ & 0x00000001) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 1, id_);
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 2, name_);
        }
        if (((bitField0_ & 0x00000004) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 3, domain_);
        }
        extensionWriter.writeUntil(10000, output);
        unknownFields.writeTo(output);
      }

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

        size = 0;
        if (((bitField0_ & 0x00000001) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, id_);
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, name_);
        }
        if (((bitField0_ & 0x00000004) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, domain_);
        }
        size += extensionsSerializedSize();
        size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel)) {
          return super.equals(obj);
        }
        com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel other = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel) obj;

        if (hasId() != other.hasId()) return false;
        if (hasId()) {
          if (!getId()
              .equals(other.getId())) return false;
        }
        if (hasName() != other.hasName()) return false;
        if (hasName()) {
          if (!getName()
              .equals(other.getName())) return false;
        }
        if (hasDomain() != other.hasDomain()) return false;
        if (hasDomain()) {
          if (!getDomain()
              .equals(other.getDomain())) return false;
        }
        if (!unknownFields.equals(other.unknownFields)) return false;
        if (!getExtensionFields().equals(other.getExtensionFields()))
          return false;
        return true;
      }

      @java.lang.Override
      public int hashCode() {
        if (memoizedHashCode != 0) {
          return memoizedHashCode;
        }
        int hash = 41;
        hash = (19 * hash) + getDescriptor().hashCode();
        if (hasId()) {
          hash = (37 * hash) + ID_FIELD_NUMBER;
          hash = (53 * hash) + getId().hashCode();
        }
        if (hasName()) {
          hash = (37 * hash) + NAME_FIELD_NUMBER;
          hash = (53 * hash) + getName().hashCode();
        }
        if (hasDomain()) {
          hash = (37 * hash) + DOMAIN_FIELD_NUMBER;
          hash = (53 * hash) + getDomain().hashCode();
        }
        hash = hashFields(hash, getExtensionFields());
        hash = (29 * hash) + unknownFields.hashCode();
        memoizedHashCode = hash;
        return hash;
      }

      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel parseFrom(
          java.nio.ByteBuffer data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel parseFrom(
          java.nio.ByteBuffer data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel parseFrom(
          com.google.protobuf.ByteString data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel parseFrom(
          com.google.protobuf.ByteString data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel parseFrom(byte[] data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel parseFrom(
          byte[] data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel parseFrom(java.io.InputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel parseDelimitedFrom(java.io.InputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseDelimitedWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel parseFrom(
          com.google.protobuf.CodedInputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel 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>
       * This object describes the channel an ad will be displayed on. A Channel is
       * defined as the entity that curates a content library, or stream within a
       * a brand name for viewers. Examples are specific view selectable ‘channels’
       * within linear and streaming television (MTV, HGTV, CNN, BBC One, etc) or a
       * specific stream of audio content commonly called ‘stations.’ Name is a
       * human-readable field while domain and id can be used for reporting and
       * targeting purposes.
       * </pre>
       *
       * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Channel}
       */
      public static final class Builder extends
          com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel, Builder> implements
          // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.BidRequest.Channel)
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.ChannelOrBuilder {
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Channel_descriptor;
        }

        @java.lang.Override
        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Channel_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel.Builder.class);
        }

        // Construct using com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel.newBuilder()
        private Builder() {
          maybeForceBuilderInitialization();
        }

        private Builder(
            com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
          super(parent);
          maybeForceBuilderInitialization();
        }
        private void maybeForceBuilderInitialization() {
          if (com.google.protobuf.GeneratedMessageV3
                  .alwaysUseFieldBuilders) {
          }
        }
        @java.lang.Override
        public Builder clear() {
          super.clear();
          id_ = "";
          bitField0_ = (bitField0_ & ~0x00000001);
          name_ = "";
          bitField0_ = (bitField0_ & ~0x00000002);
          domain_ = "";
          bitField0_ = (bitField0_ & ~0x00000004);
          return this;
        }

        @java.lang.Override
        public com.google.protobuf.Descriptors.Descriptor
            getDescriptorForType() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Channel_descriptor;
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel getDefaultInstanceForType() {
          return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel.getDefaultInstance();
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel build() {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel result = buildPartial();
          if (!result.isInitialized()) {
            throw newUninitializedMessageException(result);
          }
          return result;
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel buildPartial() {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel result = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel(this);
          int from_bitField0_ = bitField0_;
          int to_bitField0_ = 0;
          if (((from_bitField0_ & 0x00000001) != 0)) {
            to_bitField0_ |= 0x00000001;
          }
          result.id_ = id_;
          if (((from_bitField0_ & 0x00000002) != 0)) {
            to_bitField0_ |= 0x00000002;
          }
          result.name_ = name_;
          if (((from_bitField0_ & 0x00000004) != 0)) {
            to_bitField0_ |= 0x00000004;
          }
          result.domain_ = domain_;
          result.bitField0_ = to_bitField0_;
          onBuilt();
          return result;
        }

        @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 <Type> Builder setExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel, Type> extension,
            Type value) {
          return super.setExtension(extension, value);
        }
        @java.lang.Override
        public <Type> Builder setExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel, java.util.List<Type>> extension,
            int index, Type value) {
          return super.setExtension(extension, index, value);
        }
        @java.lang.Override
        public <Type> Builder addExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel, java.util.List<Type>> extension,
            Type value) {
          return super.addExtension(extension, value);
        }
        @java.lang.Override
        public <Type> Builder clearExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel, ?> extension) {
          return super.clearExtension(extension);
        }
        @java.lang.Override
        public Builder mergeFrom(com.google.protobuf.Message other) {
          if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel) {
            return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel)other);
          } else {
            super.mergeFrom(other);
            return this;
          }
        }

        public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel other) {
          if (other == com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel.getDefaultInstance()) return this;
          if (other.hasId()) {
            bitField0_ |= 0x00000001;
            id_ = other.id_;
            onChanged();
          }
          if (other.hasName()) {
            bitField0_ |= 0x00000002;
            name_ = other.name_;
            onChanged();
          }
          if (other.hasDomain()) {
            bitField0_ |= 0x00000004;
            domain_ = other.domain_;
            onChanged();
          }
          this.mergeExtensionFields(other);
          this.mergeUnknownFields(other.unknownFields);
          onChanged();
          return this;
        }

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

        @java.lang.Override
        public Builder mergeFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws java.io.IOException {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel parsedMessage = null;
          try {
            parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel) e.getUnfinishedMessage();
            throw e.unwrapIOException();
          } finally {
            if (parsedMessage != null) {
              mergeFrom(parsedMessage);
            }
          }
          return this;
        }
        private int bitField0_;

        private java.lang.Object id_ = "";
        /**
         * <pre>
         * A unique identifier assigned by the publisher. This may not be a unique
         * identifier across all supply sources.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @return Whether the id field is set.
         */
        public boolean hasId() {
          return ((bitField0_ & 0x00000001) != 0);
        }
        /**
         * <pre>
         * A unique identifier assigned by the publisher. This may not be a unique
         * identifier across all supply sources.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @return The id.
         */
        public java.lang.String getId() {
          java.lang.Object ref = id_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              id_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * A unique identifier assigned by the publisher. This may not be a unique
         * identifier across all supply sources.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @return The bytes for id.
         */
        public com.google.protobuf.ByteString
            getIdBytes() {
          java.lang.Object ref = id_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            id_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * A unique identifier assigned by the publisher. This may not be a unique
         * identifier across all supply sources.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @param value The id to set.
         * @return This builder for chaining.
         */
        public Builder setId(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
          id_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * A unique identifier assigned by the publisher. This may not be a unique
         * identifier across all supply sources.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @return This builder for chaining.
         */
        public Builder clearId() {
          bitField0_ = (bitField0_ & ~0x00000001);
          id_ = getDefaultInstance().getId();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * A unique identifier assigned by the publisher. This may not be a unique
         * identifier across all supply sources.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @param value The bytes for id to set.
         * @return This builder for chaining.
         */
        public Builder setIdBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
          id_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object name_ = "";
        /**
         * <pre>
         * Channel the content is on (e.g., a TV channel like "WABC-TV").
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @return Whether the name field is set.
         */
        public boolean hasName() {
          return ((bitField0_ & 0x00000002) != 0);
        }
        /**
         * <pre>
         * Channel the content is on (e.g., a TV channel like "WABC-TV").
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @return The name.
         */
        public java.lang.String getName() {
          java.lang.Object ref = name_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              name_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Channel the content is on (e.g., a TV channel like "WABC-TV").
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @return The bytes for name.
         */
        public com.google.protobuf.ByteString
            getNameBytes() {
          java.lang.Object ref = name_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            name_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Channel the content is on (e.g., a TV channel like "WABC-TV").
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @param value The name to set.
         * @return This builder for chaining.
         */
        public Builder setName(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
          name_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Channel the content is on (e.g., a TV channel like "WABC-TV").
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @return This builder for chaining.
         */
        public Builder clearName() {
          bitField0_ = (bitField0_ & ~0x00000002);
          name_ = getDefaultInstance().getName();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Channel the content is on (e.g., a TV channel like "WABC-TV").
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @param value The bytes for name to set.
         * @return This builder for chaining.
         */
        public Builder setNameBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
          name_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object domain_ = "";
        /**
         * <pre>
         * The primary domain of the channel (e.g. "abc7ny.com" in the case of the
         * local channel WABC-TV). It is recommended to include the top private
         * domain (PSL+1) for DSP targeting normalization purposes.
         * </pre>
         *
         * <code>optional string domain = 3;</code>
         * @return Whether the domain field is set.
         */
        public boolean hasDomain() {
          return ((bitField0_ & 0x00000004) != 0);
        }
        /**
         * <pre>
         * The primary domain of the channel (e.g. "abc7ny.com" in the case of the
         * local channel WABC-TV). It is recommended to include the top private
         * domain (PSL+1) for DSP targeting normalization purposes.
         * </pre>
         *
         * <code>optional string domain = 3;</code>
         * @return The domain.
         */
        public java.lang.String getDomain() {
          java.lang.Object ref = domain_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              domain_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * The primary domain of the channel (e.g. "abc7ny.com" in the case of the
         * local channel WABC-TV). It is recommended to include the top private
         * domain (PSL+1) for DSP targeting normalization purposes.
         * </pre>
         *
         * <code>optional string domain = 3;</code>
         * @return The bytes for domain.
         */
        public com.google.protobuf.ByteString
            getDomainBytes() {
          java.lang.Object ref = domain_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            domain_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * The primary domain of the channel (e.g. "abc7ny.com" in the case of the
         * local channel WABC-TV). It is recommended to include the top private
         * domain (PSL+1) for DSP targeting normalization purposes.
         * </pre>
         *
         * <code>optional string domain = 3;</code>
         * @param value The domain to set.
         * @return This builder for chaining.
         */
        public Builder setDomain(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
          domain_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * The primary domain of the channel (e.g. "abc7ny.com" in the case of the
         * local channel WABC-TV). It is recommended to include the top private
         * domain (PSL+1) for DSP targeting normalization purposes.
         * </pre>
         *
         * <code>optional string domain = 3;</code>
         * @return This builder for chaining.
         */
        public Builder clearDomain() {
          bitField0_ = (bitField0_ & ~0x00000004);
          domain_ = getDefaultInstance().getDomain();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * The primary domain of the channel (e.g. "abc7ny.com" in the case of the
         * local channel WABC-TV). It is recommended to include the top private
         * domain (PSL+1) for DSP targeting normalization purposes.
         * </pre>
         *
         * <code>optional string domain = 3;</code>
         * @param value The bytes for domain to set.
         * @return This builder for chaining.
         */
        public Builder setDomainBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
          domain_ = value;
          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:com.iabtechlab.openrtb.v2.BidRequest.Channel)
      }

      // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.BidRequest.Channel)
      private static final com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel DEFAULT_INSTANCE;
      static {
        DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel();
      }

      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel getDefaultInstance() {
        return DEFAULT_INSTANCE;
      }

      @java.lang.Deprecated public static final com.google.protobuf.Parser<Channel>
          PARSER = new com.google.protobuf.AbstractParser<Channel>() {
        @java.lang.Override
        public Channel parsePartialFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return new Channel(input, extensionRegistry);
        }
      };

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

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

      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Channel getDefaultInstanceForType() {
        return DEFAULT_INSTANCE;
      }

    }

    public interface DeviceOrBuilder extends
        // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.BidRequest.Device)
        com.google.protobuf.GeneratedMessageV3.
            ExtendableMessageOrBuilder<Device> {

      /**
       * <pre>
       * Standard "Do Not Track" flag as set in the header by the browser,
       * where 0 = tracking is unrestricted, 1 = do not track.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional bool dnt = 1;</code>
       * @return Whether the dnt field is set.
       */
      boolean hasDnt();
      /**
       * <pre>
       * Standard "Do Not Track" flag as set in the header by the browser,
       * where 0 = tracking is unrestricted, 1 = do not track.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional bool dnt = 1;</code>
       * @return The dnt.
       */
      boolean getDnt();

      /**
       * <pre>
       * Browser user agent string. Certain data may be redacted or replaced.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional string ua = 2;</code>
       * @return Whether the ua field is set.
       */
      boolean hasUa();
      /**
       * <pre>
       * Browser user agent string. Certain data may be redacted or replaced.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional string ua = 2;</code>
       * @return The ua.
       */
      java.lang.String getUa();
      /**
       * <pre>
       * Browser user agent string. Certain data may be redacted or replaced.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional string ua = 2;</code>
       * @return The bytes for ua.
       */
      com.google.protobuf.ByteString
          getUaBytes();

      /**
       * <pre>
       * IPv4 address closest to device.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional string ip = 3;</code>
       * @return Whether the ip field is set.
       */
      boolean hasIp();
      /**
       * <pre>
       * IPv4 address closest to device.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional string ip = 3;</code>
       * @return The ip.
       */
      java.lang.String getIp();
      /**
       * <pre>
       * IPv4 address closest to device.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional string ip = 3;</code>
       * @return The bytes for ip.
       */
      com.google.protobuf.ByteString
          getIpBytes();

      /**
       * <pre>
       * Location of the device assumed to be the user's current location defined
       * by a Geo object (Section 3.2.12).
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Geo geo = 4;</code>
       * @return Whether the geo field is set.
       */
      boolean hasGeo();
      /**
       * <pre>
       * Location of the device assumed to be the user's current location defined
       * by a Geo object (Section 3.2.12).
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Geo geo = 4;</code>
       * @return The geo.
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo getGeo();
      /**
       * <pre>
       * Location of the device assumed to be the user's current location defined
       * by a Geo object (Section 3.2.12).
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Geo geo = 4;</code>
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.GeoOrBuilder getGeoOrBuilder();

      /**
       * <pre>
       * Hardware device ID (e.g., IMEI); hashed via SHA1.
       * </pre>
       *
       * <code>optional string didsha1 = 5;</code>
       * @return Whether the didsha1 field is set.
       */
      boolean hasDidsha1();
      /**
       * <pre>
       * Hardware device ID (e.g., IMEI); hashed via SHA1.
       * </pre>
       *
       * <code>optional string didsha1 = 5;</code>
       * @return The didsha1.
       */
      java.lang.String getDidsha1();
      /**
       * <pre>
       * Hardware device ID (e.g., IMEI); hashed via SHA1.
       * </pre>
       *
       * <code>optional string didsha1 = 5;</code>
       * @return The bytes for didsha1.
       */
      com.google.protobuf.ByteString
          getDidsha1Bytes();

      /**
       * <pre>
       * Hardware device ID (e.g., IMEI); hashed via MD5.
       * </pre>
       *
       * <code>optional string didmd5 = 6;</code>
       * @return Whether the didmd5 field is set.
       */
      boolean hasDidmd5();
      /**
       * <pre>
       * Hardware device ID (e.g., IMEI); hashed via MD5.
       * </pre>
       *
       * <code>optional string didmd5 = 6;</code>
       * @return The didmd5.
       */
      java.lang.String getDidmd5();
      /**
       * <pre>
       * Hardware device ID (e.g., IMEI); hashed via MD5.
       * </pre>
       *
       * <code>optional string didmd5 = 6;</code>
       * @return The bytes for didmd5.
       */
      com.google.protobuf.ByteString
          getDidmd5Bytes();

      /**
       * <pre>
       * Platform device ID (e.g., Android ID); hashed via SHA1.
       * </pre>
       *
       * <code>optional string dpidsha1 = 7;</code>
       * @return Whether the dpidsha1 field is set.
       */
      boolean hasDpidsha1();
      /**
       * <pre>
       * Platform device ID (e.g., Android ID); hashed via SHA1.
       * </pre>
       *
       * <code>optional string dpidsha1 = 7;</code>
       * @return The dpidsha1.
       */
      java.lang.String getDpidsha1();
      /**
       * <pre>
       * Platform device ID (e.g., Android ID); hashed via SHA1.
       * </pre>
       *
       * <code>optional string dpidsha1 = 7;</code>
       * @return The bytes for dpidsha1.
       */
      com.google.protobuf.ByteString
          getDpidsha1Bytes();

      /**
       * <pre>
       * Platform device ID (e.g., Android ID); hashed via MD5.
       * </pre>
       *
       * <code>optional string dpidmd5 = 8;</code>
       * @return Whether the dpidmd5 field is set.
       */
      boolean hasDpidmd5();
      /**
       * <pre>
       * Platform device ID (e.g., Android ID); hashed via MD5.
       * </pre>
       *
       * <code>optional string dpidmd5 = 8;</code>
       * @return The dpidmd5.
       */
      java.lang.String getDpidmd5();
      /**
       * <pre>
       * Platform device ID (e.g., Android ID); hashed via MD5.
       * </pre>
       *
       * <code>optional string dpidmd5 = 8;</code>
       * @return The bytes for dpidmd5.
       */
      com.google.protobuf.ByteString
          getDpidmd5Bytes();

      /**
       * <pre>
       * IPv6 address closest to device.
       * </pre>
       *
       * <code>optional string ipv6 = 9;</code>
       * @return Whether the ipv6 field is set.
       */
      boolean hasIpv6();
      /**
       * <pre>
       * IPv6 address closest to device.
       * </pre>
       *
       * <code>optional string ipv6 = 9;</code>
       * @return The ipv6.
       */
      java.lang.String getIpv6();
      /**
       * <pre>
       * IPv6 address closest to device.
       * </pre>
       *
       * <code>optional string ipv6 = 9;</code>
       * @return The bytes for ipv6.
       */
      com.google.protobuf.ByteString
          getIpv6Bytes();

      /**
       * <pre>
       * Carrier or ISP (e.g., "VERIZON") using exchange curated string
       * names which should be published to bidders a priori.
       * </pre>
       *
       * <code>optional string carrier = 10;</code>
       * @return Whether the carrier field is set.
       */
      boolean hasCarrier();
      /**
       * <pre>
       * Carrier or ISP (e.g., "VERIZON") using exchange curated string
       * names which should be published to bidders a priori.
       * </pre>
       *
       * <code>optional string carrier = 10;</code>
       * @return The carrier.
       */
      java.lang.String getCarrier();
      /**
       * <pre>
       * Carrier or ISP (e.g., "VERIZON") using exchange curated string
       * names which should be published to bidders a priori.
       * </pre>
       *
       * <code>optional string carrier = 10;</code>
       * @return The bytes for carrier.
       */
      com.google.protobuf.ByteString
          getCarrierBytes();

      /**
       * <pre>
       * Browser language using ISO-639-1-alpha-2.
       * </pre>
       *
       * <code>optional string language = 11;</code>
       * @return Whether the language field is set.
       */
      boolean hasLanguage();
      /**
       * <pre>
       * Browser language using ISO-639-1-alpha-2.
       * </pre>
       *
       * <code>optional string language = 11;</code>
       * @return The language.
       */
      java.lang.String getLanguage();
      /**
       * <pre>
       * Browser language using ISO-639-1-alpha-2.
       * </pre>
       *
       * <code>optional string language = 11;</code>
       * @return The bytes for language.
       */
      com.google.protobuf.ByteString
          getLanguageBytes();

      /**
       * <pre>
       * Browser language using IETF BCP 47. Only one of language or langb should be present.
       * </pre>
       *
       * <code>optional string langb = 32;</code>
       * @return Whether the langb field is set.
       */
      boolean hasLangb();
      /**
       * <pre>
       * Browser language using IETF BCP 47. Only one of language or langb should be present.
       * </pre>
       *
       * <code>optional string langb = 32;</code>
       * @return The langb.
       */
      java.lang.String getLangb();
      /**
       * <pre>
       * Browser language using IETF BCP 47. Only one of language or langb should be present.
       * </pre>
       *
       * <code>optional string langb = 32;</code>
       * @return The bytes for langb.
       */
      com.google.protobuf.ByteString
          getLangbBytes();

      /**
       * <pre>
       * Device make (e.g., "Apple").
       * </pre>
       *
       * <code>optional string make = 12;</code>
       * @return Whether the make field is set.
       */
      boolean hasMake();
      /**
       * <pre>
       * Device make (e.g., "Apple").
       * </pre>
       *
       * <code>optional string make = 12;</code>
       * @return The make.
       */
      java.lang.String getMake();
      /**
       * <pre>
       * Device make (e.g., "Apple").
       * </pre>
       *
       * <code>optional string make = 12;</code>
       * @return The bytes for make.
       */
      com.google.protobuf.ByteString
          getMakeBytes();

      /**
       * <pre>
       * Device model (e.g., "iPhone").
       * </pre>
       *
       * <code>optional string model = 13;</code>
       * @return Whether the model field is set.
       */
      boolean hasModel();
      /**
       * <pre>
       * Device model (e.g., "iPhone").
       * </pre>
       *
       * <code>optional string model = 13;</code>
       * @return The model.
       */
      java.lang.String getModel();
      /**
       * <pre>
       * Device model (e.g., "iPhone").
       * </pre>
       *
       * <code>optional string model = 13;</code>
       * @return The bytes for model.
       */
      com.google.protobuf.ByteString
          getModelBytes();

      /**
       * <pre>
       * Device operating system (e.g., "iOS").
       * </pre>
       *
       * <code>optional string os = 14;</code>
       * @return Whether the os field is set.
       */
      boolean hasOs();
      /**
       * <pre>
       * Device operating system (e.g., "iOS").
       * </pre>
       *
       * <code>optional string os = 14;</code>
       * @return The os.
       */
      java.lang.String getOs();
      /**
       * <pre>
       * Device operating system (e.g., "iOS").
       * </pre>
       *
       * <code>optional string os = 14;</code>
       * @return The bytes for os.
       */
      com.google.protobuf.ByteString
          getOsBytes();

      /**
       * <pre>
       * Device operating system version (e.g., "3.1.2").
       * </pre>
       *
       * <code>optional string osv = 15;</code>
       * @return Whether the osv field is set.
       */
      boolean hasOsv();
      /**
       * <pre>
       * Device operating system version (e.g., "3.1.2").
       * </pre>
       *
       * <code>optional string osv = 15;</code>
       * @return The osv.
       */
      java.lang.String getOsv();
      /**
       * <pre>
       * Device operating system version (e.g., "3.1.2").
       * </pre>
       *
       * <code>optional string osv = 15;</code>
       * @return The bytes for osv.
       */
      com.google.protobuf.ByteString
          getOsvBytes();

      /**
       * <pre>
       * Hardware version of the device (e.g., "5S" for iPhone 5S).
       * </pre>
       *
       * <code>optional string hwv = 24;</code>
       * @return Whether the hwv field is set.
       */
      boolean hasHwv();
      /**
       * <pre>
       * Hardware version of the device (e.g., "5S" for iPhone 5S).
       * </pre>
       *
       * <code>optional string hwv = 24;</code>
       * @return The hwv.
       */
      java.lang.String getHwv();
      /**
       * <pre>
       * Hardware version of the device (e.g., "5S" for iPhone 5S).
       * </pre>
       *
       * <code>optional string hwv = 24;</code>
       * @return The bytes for hwv.
       */
      com.google.protobuf.ByteString
          getHwvBytes();

      /**
       * <pre>
       * Physical width of the screen in pixels.
       * </pre>
       *
       * <code>optional int32 w = 25;</code>
       * @return Whether the w field is set.
       */
      boolean hasW();
      /**
       * <pre>
       * Physical width of the screen in pixels.
       * </pre>
       *
       * <code>optional int32 w = 25;</code>
       * @return The w.
       */
      int getW();

      /**
       * <pre>
       * Physical height of the screen in pixels.
       * </pre>
       *
       * <code>optional int32 h = 26;</code>
       * @return Whether the h field is set.
       */
      boolean hasH();
      /**
       * <pre>
       * Physical height of the screen in pixels.
       * </pre>
       *
       * <code>optional int32 h = 26;</code>
       * @return The h.
       */
      int getH();

      /**
       * <pre>
       * Screen size as pixels per linear inch.
       * </pre>
       *
       * <code>optional int32 ppi = 27;</code>
       * @return Whether the ppi field is set.
       */
      boolean hasPpi();
      /**
       * <pre>
       * Screen size as pixels per linear inch.
       * </pre>
       *
       * <code>optional int32 ppi = 27;</code>
       * @return The ppi.
       */
      int getPpi();

      /**
       * <pre>
       * The ratio of physical pixels to device independent pixels.
       * </pre>
       *
       * <code>optional double pxratio = 28;</code>
       * @return Whether the pxratio field is set.
       */
      boolean hasPxratio();
      /**
       * <pre>
       * The ratio of physical pixels to device independent pixels.
       * </pre>
       *
       * <code>optional double pxratio = 28;</code>
       * @return The pxratio.
       */
      double getPxratio();

      /**
       * <pre>
       * Support for JavaScript, where 0 = no, 1 = yes.
       * </pre>
       *
       * <code>optional bool js = 16;</code>
       * @return Whether the js field is set.
       */
      boolean hasJs();
      /**
       * <pre>
       * Support for JavaScript, where 0 = no, 1 = yes.
       * </pre>
       *
       * <code>optional bool js = 16;</code>
       * @return The js.
       */
      boolean getJs();

      /**
       * <pre>
       * Indicates if the geolocation API will be available to JavaScript
       * code running in the banner, where 0 = no, 1 = yes.
       * </pre>
       *
       * <code>optional bool geofetch = 29;</code>
       * @return Whether the geofetch field is set.
       */
      boolean hasGeofetch();
      /**
       * <pre>
       * Indicates if the geolocation API will be available to JavaScript
       * code running in the banner, where 0 = no, 1 = yes.
       * </pre>
       *
       * <code>optional bool geofetch = 29;</code>
       * @return The geofetch.
       */
      boolean getGeofetch();

      /**
       * <pre>
       * Network connection type.
       * Refer to enum com.iabtechlab.adcom.v1.enums.ConnectionType for generic values.
       * </pre>
       *
       * <code>optional int32 connectiontype = 17;</code>
       * @return Whether the connectiontype field is set.
       */
      boolean hasConnectiontype();
      /**
       * <pre>
       * Network connection type.
       * Refer to enum com.iabtechlab.adcom.v1.enums.ConnectionType for generic values.
       * </pre>
       *
       * <code>optional int32 connectiontype = 17;</code>
       * @return The connectiontype.
       */
      int getConnectiontype();

      /**
       * <pre>
       * The general type of device.
       * Refer to enum com.iabtechlab.adcom.v1.enums.DeviceType for generic values.
       * </pre>
       *
       * <code>optional int32 devicetype = 18;</code>
       * @return Whether the devicetype field is set.
       */
      boolean hasDevicetype();
      /**
       * <pre>
       * The general type of device.
       * Refer to enum com.iabtechlab.adcom.v1.enums.DeviceType for generic values.
       * </pre>
       *
       * <code>optional int32 devicetype = 18;</code>
       * @return The devicetype.
       */
      int getDevicetype();

      /**
       * <pre>
       * Version of Flash supported by the browser.
       * </pre>
       *
       * <code>optional string flashver = 19;</code>
       * @return Whether the flashver field is set.
       */
      boolean hasFlashver();
      /**
       * <pre>
       * Version of Flash supported by the browser.
       * </pre>
       *
       * <code>optional string flashver = 19;</code>
       * @return The flashver.
       */
      java.lang.String getFlashver();
      /**
       * <pre>
       * Version of Flash supported by the browser.
       * </pre>
       *
       * <code>optional string flashver = 19;</code>
       * @return The bytes for flashver.
       */
      com.google.protobuf.ByteString
          getFlashverBytes();

      /**
       * <pre>
       * ID sanctioned for advertiser use in the clear (i.e., not hashed).
       * </pre>
       *
       * <code>optional string ifa = 20;</code>
       * @return Whether the ifa field is set.
       */
      boolean hasIfa();
      /**
       * <pre>
       * ID sanctioned for advertiser use in the clear (i.e., not hashed).
       * </pre>
       *
       * <code>optional string ifa = 20;</code>
       * @return The ifa.
       */
      java.lang.String getIfa();
      /**
       * <pre>
       * ID sanctioned for advertiser use in the clear (i.e., not hashed).
       * </pre>
       *
       * <code>optional string ifa = 20;</code>
       * @return The bytes for ifa.
       */
      com.google.protobuf.ByteString
          getIfaBytes();

      /**
       * <pre>
       * MAC address of the device; hashed via SHA1.
       * </pre>
       *
       * <code>optional string macsha1 = 21;</code>
       * @return Whether the macsha1 field is set.
       */
      boolean hasMacsha1();
      /**
       * <pre>
       * MAC address of the device; hashed via SHA1.
       * </pre>
       *
       * <code>optional string macsha1 = 21;</code>
       * @return The macsha1.
       */
      java.lang.String getMacsha1();
      /**
       * <pre>
       * MAC address of the device; hashed via SHA1.
       * </pre>
       *
       * <code>optional string macsha1 = 21;</code>
       * @return The bytes for macsha1.
       */
      com.google.protobuf.ByteString
          getMacsha1Bytes();

      /**
       * <pre>
       * MAC address of the device; hashed via MD5.
       * </pre>
       *
       * <code>optional string macmd5 = 22;</code>
       * @return Whether the macmd5 field is set.
       */
      boolean hasMacmd5();
      /**
       * <pre>
       * MAC address of the device; hashed via MD5.
       * </pre>
       *
       * <code>optional string macmd5 = 22;</code>
       * @return The macmd5.
       */
      java.lang.String getMacmd5();
      /**
       * <pre>
       * MAC address of the device; hashed via MD5.
       * </pre>
       *
       * <code>optional string macmd5 = 22;</code>
       * @return The bytes for macmd5.
       */
      com.google.protobuf.ByteString
          getMacmd5Bytes();

      /**
       * <pre>
       * "Limit Ad Tracking" signal commercially endorsed (e.g., iOS, Android),
       * where 0 = tracking is unrestricted, 1 = tracking must be limited per
       * commercial guidelines.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional bool lmt = 23;</code>
       * @return Whether the lmt field is set.
       */
      boolean hasLmt();
      /**
       * <pre>
       * "Limit Ad Tracking" signal commercially endorsed (e.g., iOS, Android),
       * where 0 = tracking is unrestricted, 1 = tracking must be limited per
       * commercial guidelines.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional bool lmt = 23;</code>
       * @return The lmt.
       */
      boolean getLmt();

      /**
       * <pre>
       * Mobile carrier as the concatenated MCC-MNC code (e.g.,
       * "310-005" identifies Verizon Wireless CDMA in the USA).
       * Refer to https://en.wikipedia.org/wiki/Mobile_country_code
       * for further examples. Note that the dash between the MCC
       * and MNC parts is required to remove parsing ambiguity.
       * </pre>
       *
       * <code>optional string mccmnc = 30;</code>
       * @return Whether the mccmnc field is set.
       */
      boolean hasMccmnc();
      /**
       * <pre>
       * Mobile carrier as the concatenated MCC-MNC code (e.g.,
       * "310-005" identifies Verizon Wireless CDMA in the USA).
       * Refer to https://en.wikipedia.org/wiki/Mobile_country_code
       * for further examples. Note that the dash between the MCC
       * and MNC parts is required to remove parsing ambiguity.
       * </pre>
       *
       * <code>optional string mccmnc = 30;</code>
       * @return The mccmnc.
       */
      java.lang.String getMccmnc();
      /**
       * <pre>
       * Mobile carrier as the concatenated MCC-MNC code (e.g.,
       * "310-005" identifies Verizon Wireless CDMA in the USA).
       * Refer to https://en.wikipedia.org/wiki/Mobile_country_code
       * for further examples. Note that the dash between the MCC
       * and MNC parts is required to remove parsing ambiguity.
       * </pre>
       *
       * <code>optional string mccmnc = 30;</code>
       * @return The bytes for mccmnc.
       */
      com.google.protobuf.ByteString
          getMccmncBytes();

      /**
       * <pre>
       * Structured user agent information defined by a UserAgent object (Section 3.2.29)
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.UserAgent sua = 31;</code>
       * @return Whether the sua field is set.
       */
      boolean hasSua();
      /**
       * <pre>
       * Structured user agent information defined by a UserAgent object (Section 3.2.29)
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.UserAgent sua = 31;</code>
       * @return The sua.
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent getSua();
      /**
       * <pre>
       * Structured user agent information defined by a UserAgent object (Section 3.2.29)
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.UserAgent sua = 31;</code>
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgentOrBuilder getSuaOrBuilder();
    }
    /**
     * <pre>
     * OpenRTB 2.0: This object provides information pertaining to the device
     * through which the user is interacting. Device information includes its
     * hardware, platform, location, and carrier data. The device can refer to a
     * mobile handset, a desktop computer, set top box, or other digital device.
     * </pre>
     *
     * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Device}
     */
    public static final class Device extends
        com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
          Device> implements
        // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.BidRequest.Device)
        DeviceOrBuilder {
    private static final long serialVersionUID = 0L;
      // Use Device.newBuilder() to construct.
      private Device(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device, ?> builder) {
        super(builder);
      }
      private Device() {
        ua_ = "";
        ip_ = "";
        didsha1_ = "";
        didmd5_ = "";
        dpidsha1_ = "";
        dpidmd5_ = "";
        ipv6_ = "";
        carrier_ = "";
        language_ = "";
        langb_ = "";
        make_ = "";
        model_ = "";
        os_ = "";
        osv_ = "";
        hwv_ = "";
        flashver_ = "";
        ifa_ = "";
        macsha1_ = "";
        macmd5_ = "";
        mccmnc_ = "";
      }

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

      @java.lang.Override
      public final com.google.protobuf.UnknownFieldSet
      getUnknownFields() {
        return this.unknownFields;
      }
      private Device(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        this();
        if (extensionRegistry == null) {
          throw new java.lang.NullPointerException();
        }
        int mutable_bitField0_ = 0;
        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
            com.google.protobuf.UnknownFieldSet.newBuilder();
        try {
          boolean done = false;
          while (!done) {
            int tag = input.readTag();
            switch (tag) {
              case 0:
                done = true;
                break;
              case 8: {
                bitField0_ |= 0x00000001;
                dnt_ = input.readBool();
                break;
              }
              case 18: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000002;
                ua_ = bs;
                break;
              }
              case 26: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000004;
                ip_ = bs;
                break;
              }
              case 34: {
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo.Builder subBuilder = null;
                if (((bitField0_ & 0x00000008) != 0)) {
                  subBuilder = geo_.toBuilder();
                }
                geo_ = input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo.PARSER, extensionRegistry);
                if (subBuilder != null) {
                  subBuilder.mergeFrom(geo_);
                  geo_ = subBuilder.buildPartial();
                }
                bitField0_ |= 0x00000008;
                break;
              }
              case 42: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000010;
                didsha1_ = bs;
                break;
              }
              case 50: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000020;
                didmd5_ = bs;
                break;
              }
              case 58: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000040;
                dpidsha1_ = bs;
                break;
              }
              case 66: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000080;
                dpidmd5_ = bs;
                break;
              }
              case 74: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000100;
                ipv6_ = bs;
                break;
              }
              case 82: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000200;
                carrier_ = bs;
                break;
              }
              case 90: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000400;
                language_ = bs;
                break;
              }
              case 98: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00001000;
                make_ = bs;
                break;
              }
              case 106: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00002000;
                model_ = bs;
                break;
              }
              case 114: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00004000;
                os_ = bs;
                break;
              }
              case 122: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00008000;
                osv_ = bs;
                break;
              }
              case 128: {
                bitField0_ |= 0x00200000;
                js_ = input.readBool();
                break;
              }
              case 136: {
                bitField0_ |= 0x00800000;
                connectiontype_ = input.readInt32();
                break;
              }
              case 144: {
                bitField0_ |= 0x01000000;
                devicetype_ = input.readInt32();
                break;
              }
              case 154: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x02000000;
                flashver_ = bs;
                break;
              }
              case 162: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x04000000;
                ifa_ = bs;
                break;
              }
              case 170: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x08000000;
                macsha1_ = bs;
                break;
              }
              case 178: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x10000000;
                macmd5_ = bs;
                break;
              }
              case 184: {
                bitField0_ |= 0x20000000;
                lmt_ = input.readBool();
                break;
              }
              case 194: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00010000;
                hwv_ = bs;
                break;
              }
              case 200: {
                bitField0_ |= 0x00020000;
                w_ = input.readInt32();
                break;
              }
              case 208: {
                bitField0_ |= 0x00040000;
                h_ = input.readInt32();
                break;
              }
              case 216: {
                bitField0_ |= 0x00080000;
                ppi_ = input.readInt32();
                break;
              }
              case 225: {
                bitField0_ |= 0x00100000;
                pxratio_ = input.readDouble();
                break;
              }
              case 232: {
                bitField0_ |= 0x00400000;
                geofetch_ = input.readBool();
                break;
              }
              case 242: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x40000000;
                mccmnc_ = bs;
                break;
              }
              case 250: {
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent.Builder subBuilder = null;
                if (((bitField0_ & 0x80000000) != 0)) {
                  subBuilder = sua_.toBuilder();
                }
                sua_ = input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent.PARSER, extensionRegistry);
                if (subBuilder != null) {
                  subBuilder.mergeFrom(sua_);
                  sua_ = subBuilder.buildPartial();
                }
                bitField0_ |= 0x80000000;
                break;
              }
              case 258: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000800;
                langb_ = bs;
                break;
              }
              default: {
                if (!parseUnknownField(
                    input, unknownFields, extensionRegistry, tag)) {
                  done = true;
                }
                break;
              }
            }
          }
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          throw e.setUnfinishedMessage(this);
        } catch (java.io.IOException e) {
          throw new com.google.protobuf.InvalidProtocolBufferException(
              e).setUnfinishedMessage(this);
        } finally {
          this.unknownFields = unknownFields.build();
          makeExtensionsImmutable();
        }
      }
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Device_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Device_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device.Builder.class);
      }

      private int bitField0_;
      public static final int DNT_FIELD_NUMBER = 1;
      private boolean dnt_;
      /**
       * <pre>
       * Standard "Do Not Track" flag as set in the header by the browser,
       * where 0 = tracking is unrestricted, 1 = do not track.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional bool dnt = 1;</code>
       * @return Whether the dnt field is set.
       */
      @java.lang.Override
      public boolean hasDnt() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <pre>
       * Standard "Do Not Track" flag as set in the header by the browser,
       * where 0 = tracking is unrestricted, 1 = do not track.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional bool dnt = 1;</code>
       * @return The dnt.
       */
      @java.lang.Override
      public boolean getDnt() {
        return dnt_;
      }

      public static final int UA_FIELD_NUMBER = 2;
      private volatile java.lang.Object ua_;
      /**
       * <pre>
       * Browser user agent string. Certain data may be redacted or replaced.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional string ua = 2;</code>
       * @return Whether the ua field is set.
       */
      @java.lang.Override
      public boolean hasUa() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <pre>
       * Browser user agent string. Certain data may be redacted or replaced.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional string ua = 2;</code>
       * @return The ua.
       */
      @java.lang.Override
      public java.lang.String getUa() {
        java.lang.Object ref = ua_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            ua_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Browser user agent string. Certain data may be redacted or replaced.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional string ua = 2;</code>
       * @return The bytes for ua.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getUaBytes() {
        java.lang.Object ref = ua_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          ua_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int IP_FIELD_NUMBER = 3;
      private volatile java.lang.Object ip_;
      /**
       * <pre>
       * IPv4 address closest to device.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional string ip = 3;</code>
       * @return Whether the ip field is set.
       */
      @java.lang.Override
      public boolean hasIp() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <pre>
       * IPv4 address closest to device.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional string ip = 3;</code>
       * @return The ip.
       */
      @java.lang.Override
      public java.lang.String getIp() {
        java.lang.Object ref = ip_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            ip_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * IPv4 address closest to device.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional string ip = 3;</code>
       * @return The bytes for ip.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getIpBytes() {
        java.lang.Object ref = ip_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          ip_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int GEO_FIELD_NUMBER = 4;
      private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo geo_;
      /**
       * <pre>
       * Location of the device assumed to be the user's current location defined
       * by a Geo object (Section 3.2.12).
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Geo geo = 4;</code>
       * @return Whether the geo field is set.
       */
      @java.lang.Override
      public boolean hasGeo() {
        return ((bitField0_ & 0x00000008) != 0);
      }
      /**
       * <pre>
       * Location of the device assumed to be the user's current location defined
       * by a Geo object (Section 3.2.12).
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Geo geo = 4;</code>
       * @return The geo.
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo getGeo() {
        return geo_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo.getDefaultInstance() : geo_;
      }
      /**
       * <pre>
       * Location of the device assumed to be the user's current location defined
       * by a Geo object (Section 3.2.12).
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Geo geo = 4;</code>
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.GeoOrBuilder getGeoOrBuilder() {
        return geo_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo.getDefaultInstance() : geo_;
      }

      public static final int DIDSHA1_FIELD_NUMBER = 5;
      private volatile java.lang.Object didsha1_;
      /**
       * <pre>
       * Hardware device ID (e.g., IMEI); hashed via SHA1.
       * </pre>
       *
       * <code>optional string didsha1 = 5;</code>
       * @return Whether the didsha1 field is set.
       */
      @java.lang.Override
      public boolean hasDidsha1() {
        return ((bitField0_ & 0x00000010) != 0);
      }
      /**
       * <pre>
       * Hardware device ID (e.g., IMEI); hashed via SHA1.
       * </pre>
       *
       * <code>optional string didsha1 = 5;</code>
       * @return The didsha1.
       */
      @java.lang.Override
      public java.lang.String getDidsha1() {
        java.lang.Object ref = didsha1_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            didsha1_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Hardware device ID (e.g., IMEI); hashed via SHA1.
       * </pre>
       *
       * <code>optional string didsha1 = 5;</code>
       * @return The bytes for didsha1.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getDidsha1Bytes() {
        java.lang.Object ref = didsha1_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          didsha1_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int DIDMD5_FIELD_NUMBER = 6;
      private volatile java.lang.Object didmd5_;
      /**
       * <pre>
       * Hardware device ID (e.g., IMEI); hashed via MD5.
       * </pre>
       *
       * <code>optional string didmd5 = 6;</code>
       * @return Whether the didmd5 field is set.
       */
      @java.lang.Override
      public boolean hasDidmd5() {
        return ((bitField0_ & 0x00000020) != 0);
      }
      /**
       * <pre>
       * Hardware device ID (e.g., IMEI); hashed via MD5.
       * </pre>
       *
       * <code>optional string didmd5 = 6;</code>
       * @return The didmd5.
       */
      @java.lang.Override
      public java.lang.String getDidmd5() {
        java.lang.Object ref = didmd5_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            didmd5_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Hardware device ID (e.g., IMEI); hashed via MD5.
       * </pre>
       *
       * <code>optional string didmd5 = 6;</code>
       * @return The bytes for didmd5.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getDidmd5Bytes() {
        java.lang.Object ref = didmd5_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          didmd5_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int DPIDSHA1_FIELD_NUMBER = 7;
      private volatile java.lang.Object dpidsha1_;
      /**
       * <pre>
       * Platform device ID (e.g., Android ID); hashed via SHA1.
       * </pre>
       *
       * <code>optional string dpidsha1 = 7;</code>
       * @return Whether the dpidsha1 field is set.
       */
      @java.lang.Override
      public boolean hasDpidsha1() {
        return ((bitField0_ & 0x00000040) != 0);
      }
      /**
       * <pre>
       * Platform device ID (e.g., Android ID); hashed via SHA1.
       * </pre>
       *
       * <code>optional string dpidsha1 = 7;</code>
       * @return The dpidsha1.
       */
      @java.lang.Override
      public java.lang.String getDpidsha1() {
        java.lang.Object ref = dpidsha1_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            dpidsha1_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Platform device ID (e.g., Android ID); hashed via SHA1.
       * </pre>
       *
       * <code>optional string dpidsha1 = 7;</code>
       * @return The bytes for dpidsha1.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getDpidsha1Bytes() {
        java.lang.Object ref = dpidsha1_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          dpidsha1_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int DPIDMD5_FIELD_NUMBER = 8;
      private volatile java.lang.Object dpidmd5_;
      /**
       * <pre>
       * Platform device ID (e.g., Android ID); hashed via MD5.
       * </pre>
       *
       * <code>optional string dpidmd5 = 8;</code>
       * @return Whether the dpidmd5 field is set.
       */
      @java.lang.Override
      public boolean hasDpidmd5() {
        return ((bitField0_ & 0x00000080) != 0);
      }
      /**
       * <pre>
       * Platform device ID (e.g., Android ID); hashed via MD5.
       * </pre>
       *
       * <code>optional string dpidmd5 = 8;</code>
       * @return The dpidmd5.
       */
      @java.lang.Override
      public java.lang.String getDpidmd5() {
        java.lang.Object ref = dpidmd5_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            dpidmd5_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Platform device ID (e.g., Android ID); hashed via MD5.
       * </pre>
       *
       * <code>optional string dpidmd5 = 8;</code>
       * @return The bytes for dpidmd5.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getDpidmd5Bytes() {
        java.lang.Object ref = dpidmd5_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          dpidmd5_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int IPV6_FIELD_NUMBER = 9;
      private volatile java.lang.Object ipv6_;
      /**
       * <pre>
       * IPv6 address closest to device.
       * </pre>
       *
       * <code>optional string ipv6 = 9;</code>
       * @return Whether the ipv6 field is set.
       */
      @java.lang.Override
      public boolean hasIpv6() {
        return ((bitField0_ & 0x00000100) != 0);
      }
      /**
       * <pre>
       * IPv6 address closest to device.
       * </pre>
       *
       * <code>optional string ipv6 = 9;</code>
       * @return The ipv6.
       */
      @java.lang.Override
      public java.lang.String getIpv6() {
        java.lang.Object ref = ipv6_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            ipv6_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * IPv6 address closest to device.
       * </pre>
       *
       * <code>optional string ipv6 = 9;</code>
       * @return The bytes for ipv6.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getIpv6Bytes() {
        java.lang.Object ref = ipv6_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          ipv6_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int CARRIER_FIELD_NUMBER = 10;
      private volatile java.lang.Object carrier_;
      /**
       * <pre>
       * Carrier or ISP (e.g., "VERIZON") using exchange curated string
       * names which should be published to bidders a priori.
       * </pre>
       *
       * <code>optional string carrier = 10;</code>
       * @return Whether the carrier field is set.
       */
      @java.lang.Override
      public boolean hasCarrier() {
        return ((bitField0_ & 0x00000200) != 0);
      }
      /**
       * <pre>
       * Carrier or ISP (e.g., "VERIZON") using exchange curated string
       * names which should be published to bidders a priori.
       * </pre>
       *
       * <code>optional string carrier = 10;</code>
       * @return The carrier.
       */
      @java.lang.Override
      public java.lang.String getCarrier() {
        java.lang.Object ref = carrier_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            carrier_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Carrier or ISP (e.g., "VERIZON") using exchange curated string
       * names which should be published to bidders a priori.
       * </pre>
       *
       * <code>optional string carrier = 10;</code>
       * @return The bytes for carrier.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getCarrierBytes() {
        java.lang.Object ref = carrier_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          carrier_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int LANGUAGE_FIELD_NUMBER = 11;
      private volatile java.lang.Object language_;
      /**
       * <pre>
       * Browser language using ISO-639-1-alpha-2.
       * </pre>
       *
       * <code>optional string language = 11;</code>
       * @return Whether the language field is set.
       */
      @java.lang.Override
      public boolean hasLanguage() {
        return ((bitField0_ & 0x00000400) != 0);
      }
      /**
       * <pre>
       * Browser language using ISO-639-1-alpha-2.
       * </pre>
       *
       * <code>optional string language = 11;</code>
       * @return The language.
       */
      @java.lang.Override
      public java.lang.String getLanguage() {
        java.lang.Object ref = language_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            language_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Browser language using ISO-639-1-alpha-2.
       * </pre>
       *
       * <code>optional string language = 11;</code>
       * @return The bytes for language.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getLanguageBytes() {
        java.lang.Object ref = language_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          language_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int LANGB_FIELD_NUMBER = 32;
      private volatile java.lang.Object langb_;
      /**
       * <pre>
       * Browser language using IETF BCP 47. Only one of language or langb should be present.
       * </pre>
       *
       * <code>optional string langb = 32;</code>
       * @return Whether the langb field is set.
       */
      @java.lang.Override
      public boolean hasLangb() {
        return ((bitField0_ & 0x00000800) != 0);
      }
      /**
       * <pre>
       * Browser language using IETF BCP 47. Only one of language or langb should be present.
       * </pre>
       *
       * <code>optional string langb = 32;</code>
       * @return The langb.
       */
      @java.lang.Override
      public java.lang.String getLangb() {
        java.lang.Object ref = langb_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            langb_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Browser language using IETF BCP 47. Only one of language or langb should be present.
       * </pre>
       *
       * <code>optional string langb = 32;</code>
       * @return The bytes for langb.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getLangbBytes() {
        java.lang.Object ref = langb_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          langb_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int MAKE_FIELD_NUMBER = 12;
      private volatile java.lang.Object make_;
      /**
       * <pre>
       * Device make (e.g., "Apple").
       * </pre>
       *
       * <code>optional string make = 12;</code>
       * @return Whether the make field is set.
       */
      @java.lang.Override
      public boolean hasMake() {
        return ((bitField0_ & 0x00001000) != 0);
      }
      /**
       * <pre>
       * Device make (e.g., "Apple").
       * </pre>
       *
       * <code>optional string make = 12;</code>
       * @return The make.
       */
      @java.lang.Override
      public java.lang.String getMake() {
        java.lang.Object ref = make_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            make_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Device make (e.g., "Apple").
       * </pre>
       *
       * <code>optional string make = 12;</code>
       * @return The bytes for make.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getMakeBytes() {
        java.lang.Object ref = make_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          make_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int MODEL_FIELD_NUMBER = 13;
      private volatile java.lang.Object model_;
      /**
       * <pre>
       * Device model (e.g., "iPhone").
       * </pre>
       *
       * <code>optional string model = 13;</code>
       * @return Whether the model field is set.
       */
      @java.lang.Override
      public boolean hasModel() {
        return ((bitField0_ & 0x00002000) != 0);
      }
      /**
       * <pre>
       * Device model (e.g., "iPhone").
       * </pre>
       *
       * <code>optional string model = 13;</code>
       * @return The model.
       */
      @java.lang.Override
      public java.lang.String getModel() {
        java.lang.Object ref = model_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            model_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Device model (e.g., "iPhone").
       * </pre>
       *
       * <code>optional string model = 13;</code>
       * @return The bytes for model.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getModelBytes() {
        java.lang.Object ref = model_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          model_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int OS_FIELD_NUMBER = 14;
      private volatile java.lang.Object os_;
      /**
       * <pre>
       * Device operating system (e.g., "iOS").
       * </pre>
       *
       * <code>optional string os = 14;</code>
       * @return Whether the os field is set.
       */
      @java.lang.Override
      public boolean hasOs() {
        return ((bitField0_ & 0x00004000) != 0);
      }
      /**
       * <pre>
       * Device operating system (e.g., "iOS").
       * </pre>
       *
       * <code>optional string os = 14;</code>
       * @return The os.
       */
      @java.lang.Override
      public java.lang.String getOs() {
        java.lang.Object ref = os_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            os_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Device operating system (e.g., "iOS").
       * </pre>
       *
       * <code>optional string os = 14;</code>
       * @return The bytes for os.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getOsBytes() {
        java.lang.Object ref = os_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          os_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int OSV_FIELD_NUMBER = 15;
      private volatile java.lang.Object osv_;
      /**
       * <pre>
       * Device operating system version (e.g., "3.1.2").
       * </pre>
       *
       * <code>optional string osv = 15;</code>
       * @return Whether the osv field is set.
       */
      @java.lang.Override
      public boolean hasOsv() {
        return ((bitField0_ & 0x00008000) != 0);
      }
      /**
       * <pre>
       * Device operating system version (e.g., "3.1.2").
       * </pre>
       *
       * <code>optional string osv = 15;</code>
       * @return The osv.
       */
      @java.lang.Override
      public java.lang.String getOsv() {
        java.lang.Object ref = osv_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            osv_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Device operating system version (e.g., "3.1.2").
       * </pre>
       *
       * <code>optional string osv = 15;</code>
       * @return The bytes for osv.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getOsvBytes() {
        java.lang.Object ref = osv_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          osv_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int HWV_FIELD_NUMBER = 24;
      private volatile java.lang.Object hwv_;
      /**
       * <pre>
       * Hardware version of the device (e.g., "5S" for iPhone 5S).
       * </pre>
       *
       * <code>optional string hwv = 24;</code>
       * @return Whether the hwv field is set.
       */
      @java.lang.Override
      public boolean hasHwv() {
        return ((bitField0_ & 0x00010000) != 0);
      }
      /**
       * <pre>
       * Hardware version of the device (e.g., "5S" for iPhone 5S).
       * </pre>
       *
       * <code>optional string hwv = 24;</code>
       * @return The hwv.
       */
      @java.lang.Override
      public java.lang.String getHwv() {
        java.lang.Object ref = hwv_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            hwv_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Hardware version of the device (e.g., "5S" for iPhone 5S).
       * </pre>
       *
       * <code>optional string hwv = 24;</code>
       * @return The bytes for hwv.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getHwvBytes() {
        java.lang.Object ref = hwv_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          hwv_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int W_FIELD_NUMBER = 25;
      private int w_;
      /**
       * <pre>
       * Physical width of the screen in pixels.
       * </pre>
       *
       * <code>optional int32 w = 25;</code>
       * @return Whether the w field is set.
       */
      @java.lang.Override
      public boolean hasW() {
        return ((bitField0_ & 0x00020000) != 0);
      }
      /**
       * <pre>
       * Physical width of the screen in pixels.
       * </pre>
       *
       * <code>optional int32 w = 25;</code>
       * @return The w.
       */
      @java.lang.Override
      public int getW() {
        return w_;
      }

      public static final int H_FIELD_NUMBER = 26;
      private int h_;
      /**
       * <pre>
       * Physical height of the screen in pixels.
       * </pre>
       *
       * <code>optional int32 h = 26;</code>
       * @return Whether the h field is set.
       */
      @java.lang.Override
      public boolean hasH() {
        return ((bitField0_ & 0x00040000) != 0);
      }
      /**
       * <pre>
       * Physical height of the screen in pixels.
       * </pre>
       *
       * <code>optional int32 h = 26;</code>
       * @return The h.
       */
      @java.lang.Override
      public int getH() {
        return h_;
      }

      public static final int PPI_FIELD_NUMBER = 27;
      private int ppi_;
      /**
       * <pre>
       * Screen size as pixels per linear inch.
       * </pre>
       *
       * <code>optional int32 ppi = 27;</code>
       * @return Whether the ppi field is set.
       */
      @java.lang.Override
      public boolean hasPpi() {
        return ((bitField0_ & 0x00080000) != 0);
      }
      /**
       * <pre>
       * Screen size as pixels per linear inch.
       * </pre>
       *
       * <code>optional int32 ppi = 27;</code>
       * @return The ppi.
       */
      @java.lang.Override
      public int getPpi() {
        return ppi_;
      }

      public static final int PXRATIO_FIELD_NUMBER = 28;
      private double pxratio_;
      /**
       * <pre>
       * The ratio of physical pixels to device independent pixels.
       * </pre>
       *
       * <code>optional double pxratio = 28;</code>
       * @return Whether the pxratio field is set.
       */
      @java.lang.Override
      public boolean hasPxratio() {
        return ((bitField0_ & 0x00100000) != 0);
      }
      /**
       * <pre>
       * The ratio of physical pixels to device independent pixels.
       * </pre>
       *
       * <code>optional double pxratio = 28;</code>
       * @return The pxratio.
       */
      @java.lang.Override
      public double getPxratio() {
        return pxratio_;
      }

      public static final int JS_FIELD_NUMBER = 16;
      private boolean js_;
      /**
       * <pre>
       * Support for JavaScript, where 0 = no, 1 = yes.
       * </pre>
       *
       * <code>optional bool js = 16;</code>
       * @return Whether the js field is set.
       */
      @java.lang.Override
      public boolean hasJs() {
        return ((bitField0_ & 0x00200000) != 0);
      }
      /**
       * <pre>
       * Support for JavaScript, where 0 = no, 1 = yes.
       * </pre>
       *
       * <code>optional bool js = 16;</code>
       * @return The js.
       */
      @java.lang.Override
      public boolean getJs() {
        return js_;
      }

      public static final int GEOFETCH_FIELD_NUMBER = 29;
      private boolean geofetch_;
      /**
       * <pre>
       * Indicates if the geolocation API will be available to JavaScript
       * code running in the banner, where 0 = no, 1 = yes.
       * </pre>
       *
       * <code>optional bool geofetch = 29;</code>
       * @return Whether the geofetch field is set.
       */
      @java.lang.Override
      public boolean hasGeofetch() {
        return ((bitField0_ & 0x00400000) != 0);
      }
      /**
       * <pre>
       * Indicates if the geolocation API will be available to JavaScript
       * code running in the banner, where 0 = no, 1 = yes.
       * </pre>
       *
       * <code>optional bool geofetch = 29;</code>
       * @return The geofetch.
       */
      @java.lang.Override
      public boolean getGeofetch() {
        return geofetch_;
      }

      public static final int CONNECTIONTYPE_FIELD_NUMBER = 17;
      private int connectiontype_;
      /**
       * <pre>
       * Network connection type.
       * Refer to enum com.iabtechlab.adcom.v1.enums.ConnectionType for generic values.
       * </pre>
       *
       * <code>optional int32 connectiontype = 17;</code>
       * @return Whether the connectiontype field is set.
       */
      @java.lang.Override
      public boolean hasConnectiontype() {
        return ((bitField0_ & 0x00800000) != 0);
      }
      /**
       * <pre>
       * Network connection type.
       * Refer to enum com.iabtechlab.adcom.v1.enums.ConnectionType for generic values.
       * </pre>
       *
       * <code>optional int32 connectiontype = 17;</code>
       * @return The connectiontype.
       */
      @java.lang.Override
      public int getConnectiontype() {
        return connectiontype_;
      }

      public static final int DEVICETYPE_FIELD_NUMBER = 18;
      private int devicetype_;
      /**
       * <pre>
       * The general type of device.
       * Refer to enum com.iabtechlab.adcom.v1.enums.DeviceType for generic values.
       * </pre>
       *
       * <code>optional int32 devicetype = 18;</code>
       * @return Whether the devicetype field is set.
       */
      @java.lang.Override
      public boolean hasDevicetype() {
        return ((bitField0_ & 0x01000000) != 0);
      }
      /**
       * <pre>
       * The general type of device.
       * Refer to enum com.iabtechlab.adcom.v1.enums.DeviceType for generic values.
       * </pre>
       *
       * <code>optional int32 devicetype = 18;</code>
       * @return The devicetype.
       */
      @java.lang.Override
      public int getDevicetype() {
        return devicetype_;
      }

      public static final int FLASHVER_FIELD_NUMBER = 19;
      private volatile java.lang.Object flashver_;
      /**
       * <pre>
       * Version of Flash supported by the browser.
       * </pre>
       *
       * <code>optional string flashver = 19;</code>
       * @return Whether the flashver field is set.
       */
      @java.lang.Override
      public boolean hasFlashver() {
        return ((bitField0_ & 0x02000000) != 0);
      }
      /**
       * <pre>
       * Version of Flash supported by the browser.
       * </pre>
       *
       * <code>optional string flashver = 19;</code>
       * @return The flashver.
       */
      @java.lang.Override
      public java.lang.String getFlashver() {
        java.lang.Object ref = flashver_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            flashver_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Version of Flash supported by the browser.
       * </pre>
       *
       * <code>optional string flashver = 19;</code>
       * @return The bytes for flashver.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getFlashverBytes() {
        java.lang.Object ref = flashver_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          flashver_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int IFA_FIELD_NUMBER = 20;
      private volatile java.lang.Object ifa_;
      /**
       * <pre>
       * ID sanctioned for advertiser use in the clear (i.e., not hashed).
       * </pre>
       *
       * <code>optional string ifa = 20;</code>
       * @return Whether the ifa field is set.
       */
      @java.lang.Override
      public boolean hasIfa() {
        return ((bitField0_ & 0x04000000) != 0);
      }
      /**
       * <pre>
       * ID sanctioned for advertiser use in the clear (i.e., not hashed).
       * </pre>
       *
       * <code>optional string ifa = 20;</code>
       * @return The ifa.
       */
      @java.lang.Override
      public java.lang.String getIfa() {
        java.lang.Object ref = ifa_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            ifa_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * ID sanctioned for advertiser use in the clear (i.e., not hashed).
       * </pre>
       *
       * <code>optional string ifa = 20;</code>
       * @return The bytes for ifa.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getIfaBytes() {
        java.lang.Object ref = ifa_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          ifa_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int MACSHA1_FIELD_NUMBER = 21;
      private volatile java.lang.Object macsha1_;
      /**
       * <pre>
       * MAC address of the device; hashed via SHA1.
       * </pre>
       *
       * <code>optional string macsha1 = 21;</code>
       * @return Whether the macsha1 field is set.
       */
      @java.lang.Override
      public boolean hasMacsha1() {
        return ((bitField0_ & 0x08000000) != 0);
      }
      /**
       * <pre>
       * MAC address of the device; hashed via SHA1.
       * </pre>
       *
       * <code>optional string macsha1 = 21;</code>
       * @return The macsha1.
       */
      @java.lang.Override
      public java.lang.String getMacsha1() {
        java.lang.Object ref = macsha1_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            macsha1_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * MAC address of the device; hashed via SHA1.
       * </pre>
       *
       * <code>optional string macsha1 = 21;</code>
       * @return The bytes for macsha1.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getMacsha1Bytes() {
        java.lang.Object ref = macsha1_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          macsha1_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int MACMD5_FIELD_NUMBER = 22;
      private volatile java.lang.Object macmd5_;
      /**
       * <pre>
       * MAC address of the device; hashed via MD5.
       * </pre>
       *
       * <code>optional string macmd5 = 22;</code>
       * @return Whether the macmd5 field is set.
       */
      @java.lang.Override
      public boolean hasMacmd5() {
        return ((bitField0_ & 0x10000000) != 0);
      }
      /**
       * <pre>
       * MAC address of the device; hashed via MD5.
       * </pre>
       *
       * <code>optional string macmd5 = 22;</code>
       * @return The macmd5.
       */
      @java.lang.Override
      public java.lang.String getMacmd5() {
        java.lang.Object ref = macmd5_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            macmd5_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * MAC address of the device; hashed via MD5.
       * </pre>
       *
       * <code>optional string macmd5 = 22;</code>
       * @return The bytes for macmd5.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getMacmd5Bytes() {
        java.lang.Object ref = macmd5_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          macmd5_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int LMT_FIELD_NUMBER = 23;
      private boolean lmt_;
      /**
       * <pre>
       * "Limit Ad Tracking" signal commercially endorsed (e.g., iOS, Android),
       * where 0 = tracking is unrestricted, 1 = tracking must be limited per
       * commercial guidelines.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional bool lmt = 23;</code>
       * @return Whether the lmt field is set.
       */
      @java.lang.Override
      public boolean hasLmt() {
        return ((bitField0_ & 0x20000000) != 0);
      }
      /**
       * <pre>
       * "Limit Ad Tracking" signal commercially endorsed (e.g., iOS, Android),
       * where 0 = tracking is unrestricted, 1 = tracking must be limited per
       * commercial guidelines.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional bool lmt = 23;</code>
       * @return The lmt.
       */
      @java.lang.Override
      public boolean getLmt() {
        return lmt_;
      }

      public static final int MCCMNC_FIELD_NUMBER = 30;
      private volatile java.lang.Object mccmnc_;
      /**
       * <pre>
       * Mobile carrier as the concatenated MCC-MNC code (e.g.,
       * "310-005" identifies Verizon Wireless CDMA in the USA).
       * Refer to https://en.wikipedia.org/wiki/Mobile_country_code
       * for further examples. Note that the dash between the MCC
       * and MNC parts is required to remove parsing ambiguity.
       * </pre>
       *
       * <code>optional string mccmnc = 30;</code>
       * @return Whether the mccmnc field is set.
       */
      @java.lang.Override
      public boolean hasMccmnc() {
        return ((bitField0_ & 0x40000000) != 0);
      }
      /**
       * <pre>
       * Mobile carrier as the concatenated MCC-MNC code (e.g.,
       * "310-005" identifies Verizon Wireless CDMA in the USA).
       * Refer to https://en.wikipedia.org/wiki/Mobile_country_code
       * for further examples. Note that the dash between the MCC
       * and MNC parts is required to remove parsing ambiguity.
       * </pre>
       *
       * <code>optional string mccmnc = 30;</code>
       * @return The mccmnc.
       */
      @java.lang.Override
      public java.lang.String getMccmnc() {
        java.lang.Object ref = mccmnc_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            mccmnc_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Mobile carrier as the concatenated MCC-MNC code (e.g.,
       * "310-005" identifies Verizon Wireless CDMA in the USA).
       * Refer to https://en.wikipedia.org/wiki/Mobile_country_code
       * for further examples. Note that the dash between the MCC
       * and MNC parts is required to remove parsing ambiguity.
       * </pre>
       *
       * <code>optional string mccmnc = 30;</code>
       * @return The bytes for mccmnc.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getMccmncBytes() {
        java.lang.Object ref = mccmnc_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          mccmnc_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int SUA_FIELD_NUMBER = 31;
      private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent sua_;
      /**
       * <pre>
       * Structured user agent information defined by a UserAgent object (Section 3.2.29)
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.UserAgent sua = 31;</code>
       * @return Whether the sua field is set.
       */
      @java.lang.Override
      public boolean hasSua() {
        return ((bitField0_ & 0x80000000) != 0);
      }
      /**
       * <pre>
       * Structured user agent information defined by a UserAgent object (Section 3.2.29)
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.UserAgent sua = 31;</code>
       * @return The sua.
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent getSua() {
        return sua_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent.getDefaultInstance() : sua_;
      }
      /**
       * <pre>
       * Structured user agent information defined by a UserAgent object (Section 3.2.29)
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.UserAgent sua = 31;</code>
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgentOrBuilder getSuaOrBuilder() {
        return sua_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent.getDefaultInstance() : sua_;
      }

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

        if (hasGeo()) {
          if (!getGeo().isInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
        }
        if (hasSua()) {
          if (!getSua().isInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
        }
        if (!extensionsAreInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
        memoizedIsInitialized = 1;
        return true;
      }

      @java.lang.Override
      public void writeTo(com.google.protobuf.CodedOutputStream output)
                          throws java.io.IOException {
        com.google.protobuf.GeneratedMessageV3
          .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device>.ExtensionWriter
            extensionWriter = newExtensionWriter();
        if (((bitField0_ & 0x00000001) != 0)) {
          output.writeBool(1, dnt_);
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 2, ua_);
        }
        if (((bitField0_ & 0x00000004) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 3, ip_);
        }
        if (((bitField0_ & 0x00000008) != 0)) {
          output.writeMessage(4, getGeo());
        }
        if (((bitField0_ & 0x00000010) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 5, didsha1_);
        }
        if (((bitField0_ & 0x00000020) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 6, didmd5_);
        }
        if (((bitField0_ & 0x00000040) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 7, dpidsha1_);
        }
        if (((bitField0_ & 0x00000080) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 8, dpidmd5_);
        }
        if (((bitField0_ & 0x00000100) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 9, ipv6_);
        }
        if (((bitField0_ & 0x00000200) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 10, carrier_);
        }
        if (((bitField0_ & 0x00000400) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 11, language_);
        }
        if (((bitField0_ & 0x00001000) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 12, make_);
        }
        if (((bitField0_ & 0x00002000) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 13, model_);
        }
        if (((bitField0_ & 0x00004000) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 14, os_);
        }
        if (((bitField0_ & 0x00008000) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 15, osv_);
        }
        if (((bitField0_ & 0x00200000) != 0)) {
          output.writeBool(16, js_);
        }
        if (((bitField0_ & 0x00800000) != 0)) {
          output.writeInt32(17, connectiontype_);
        }
        if (((bitField0_ & 0x01000000) != 0)) {
          output.writeInt32(18, devicetype_);
        }
        if (((bitField0_ & 0x02000000) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 19, flashver_);
        }
        if (((bitField0_ & 0x04000000) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 20, ifa_);
        }
        if (((bitField0_ & 0x08000000) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 21, macsha1_);
        }
        if (((bitField0_ & 0x10000000) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 22, macmd5_);
        }
        if (((bitField0_ & 0x20000000) != 0)) {
          output.writeBool(23, lmt_);
        }
        if (((bitField0_ & 0x00010000) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 24, hwv_);
        }
        if (((bitField0_ & 0x00020000) != 0)) {
          output.writeInt32(25, w_);
        }
        if (((bitField0_ & 0x00040000) != 0)) {
          output.writeInt32(26, h_);
        }
        if (((bitField0_ & 0x00080000) != 0)) {
          output.writeInt32(27, ppi_);
        }
        if (((bitField0_ & 0x00100000) != 0)) {
          output.writeDouble(28, pxratio_);
        }
        if (((bitField0_ & 0x00400000) != 0)) {
          output.writeBool(29, geofetch_);
        }
        if (((bitField0_ & 0x40000000) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 30, mccmnc_);
        }
        if (((bitField0_ & 0x80000000) != 0)) {
          output.writeMessage(31, getSua());
        }
        if (((bitField0_ & 0x00000800) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 32, langb_);
        }
        extensionWriter.writeUntil(10000, output);
        unknownFields.writeTo(output);
      }

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

        size = 0;
        if (((bitField0_ & 0x00000001) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeBoolSize(1, dnt_);
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, ua_);
        }
        if (((bitField0_ & 0x00000004) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, ip_);
        }
        if (((bitField0_ & 0x00000008) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeMessageSize(4, getGeo());
        }
        if (((bitField0_ & 0x00000010) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(5, didsha1_);
        }
        if (((bitField0_ & 0x00000020) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(6, didmd5_);
        }
        if (((bitField0_ & 0x00000040) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(7, dpidsha1_);
        }
        if (((bitField0_ & 0x00000080) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(8, dpidmd5_);
        }
        if (((bitField0_ & 0x00000100) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(9, ipv6_);
        }
        if (((bitField0_ & 0x00000200) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(10, carrier_);
        }
        if (((bitField0_ & 0x00000400) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(11, language_);
        }
        if (((bitField0_ & 0x00001000) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(12, make_);
        }
        if (((bitField0_ & 0x00002000) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(13, model_);
        }
        if (((bitField0_ & 0x00004000) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(14, os_);
        }
        if (((bitField0_ & 0x00008000) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(15, osv_);
        }
        if (((bitField0_ & 0x00200000) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeBoolSize(16, js_);
        }
        if (((bitField0_ & 0x00800000) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeInt32Size(17, connectiontype_);
        }
        if (((bitField0_ & 0x01000000) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeInt32Size(18, devicetype_);
        }
        if (((bitField0_ & 0x02000000) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(19, flashver_);
        }
        if (((bitField0_ & 0x04000000) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(20, ifa_);
        }
        if (((bitField0_ & 0x08000000) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(21, macsha1_);
        }
        if (((bitField0_ & 0x10000000) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(22, macmd5_);
        }
        if (((bitField0_ & 0x20000000) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeBoolSize(23, lmt_);
        }
        if (((bitField0_ & 0x00010000) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(24, hwv_);
        }
        if (((bitField0_ & 0x00020000) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeInt32Size(25, w_);
        }
        if (((bitField0_ & 0x00040000) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeInt32Size(26, h_);
        }
        if (((bitField0_ & 0x00080000) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeInt32Size(27, ppi_);
        }
        if (((bitField0_ & 0x00100000) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeDoubleSize(28, pxratio_);
        }
        if (((bitField0_ & 0x00400000) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeBoolSize(29, geofetch_);
        }
        if (((bitField0_ & 0x40000000) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(30, mccmnc_);
        }
        if (((bitField0_ & 0x80000000) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeMessageSize(31, getSua());
        }
        if (((bitField0_ & 0x00000800) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(32, langb_);
        }
        size += extensionsSerializedSize();
        size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device)) {
          return super.equals(obj);
        }
        com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device other = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device) obj;

        if (hasDnt() != other.hasDnt()) return false;
        if (hasDnt()) {
          if (getDnt()
              != other.getDnt()) return false;
        }
        if (hasUa() != other.hasUa()) return false;
        if (hasUa()) {
          if (!getUa()
              .equals(other.getUa())) return false;
        }
        if (hasIp() != other.hasIp()) return false;
        if (hasIp()) {
          if (!getIp()
              .equals(other.getIp())) return false;
        }
        if (hasGeo() != other.hasGeo()) return false;
        if (hasGeo()) {
          if (!getGeo()
              .equals(other.getGeo())) return false;
        }
        if (hasDidsha1() != other.hasDidsha1()) return false;
        if (hasDidsha1()) {
          if (!getDidsha1()
              .equals(other.getDidsha1())) return false;
        }
        if (hasDidmd5() != other.hasDidmd5()) return false;
        if (hasDidmd5()) {
          if (!getDidmd5()
              .equals(other.getDidmd5())) return false;
        }
        if (hasDpidsha1() != other.hasDpidsha1()) return false;
        if (hasDpidsha1()) {
          if (!getDpidsha1()
              .equals(other.getDpidsha1())) return false;
        }
        if (hasDpidmd5() != other.hasDpidmd5()) return false;
        if (hasDpidmd5()) {
          if (!getDpidmd5()
              .equals(other.getDpidmd5())) return false;
        }
        if (hasIpv6() != other.hasIpv6()) return false;
        if (hasIpv6()) {
          if (!getIpv6()
              .equals(other.getIpv6())) return false;
        }
        if (hasCarrier() != other.hasCarrier()) return false;
        if (hasCarrier()) {
          if (!getCarrier()
              .equals(other.getCarrier())) return false;
        }
        if (hasLanguage() != other.hasLanguage()) return false;
        if (hasLanguage()) {
          if (!getLanguage()
              .equals(other.getLanguage())) return false;
        }
        if (hasLangb() != other.hasLangb()) return false;
        if (hasLangb()) {
          if (!getLangb()
              .equals(other.getLangb())) return false;
        }
        if (hasMake() != other.hasMake()) return false;
        if (hasMake()) {
          if (!getMake()
              .equals(other.getMake())) return false;
        }
        if (hasModel() != other.hasModel()) return false;
        if (hasModel()) {
          if (!getModel()
              .equals(other.getModel())) return false;
        }
        if (hasOs() != other.hasOs()) return false;
        if (hasOs()) {
          if (!getOs()
              .equals(other.getOs())) return false;
        }
        if (hasOsv() != other.hasOsv()) return false;
        if (hasOsv()) {
          if (!getOsv()
              .equals(other.getOsv())) return false;
        }
        if (hasHwv() != other.hasHwv()) return false;
        if (hasHwv()) {
          if (!getHwv()
              .equals(other.getHwv())) return false;
        }
        if (hasW() != other.hasW()) return false;
        if (hasW()) {
          if (getW()
              != other.getW()) return false;
        }
        if (hasH() != other.hasH()) return false;
        if (hasH()) {
          if (getH()
              != other.getH()) return false;
        }
        if (hasPpi() != other.hasPpi()) return false;
        if (hasPpi()) {
          if (getPpi()
              != other.getPpi()) return false;
        }
        if (hasPxratio() != other.hasPxratio()) return false;
        if (hasPxratio()) {
          if (java.lang.Double.doubleToLongBits(getPxratio())
              != java.lang.Double.doubleToLongBits(
                  other.getPxratio())) return false;
        }
        if (hasJs() != other.hasJs()) return false;
        if (hasJs()) {
          if (getJs()
              != other.getJs()) return false;
        }
        if (hasGeofetch() != other.hasGeofetch()) return false;
        if (hasGeofetch()) {
          if (getGeofetch()
              != other.getGeofetch()) return false;
        }
        if (hasConnectiontype() != other.hasConnectiontype()) return false;
        if (hasConnectiontype()) {
          if (getConnectiontype()
              != other.getConnectiontype()) return false;
        }
        if (hasDevicetype() != other.hasDevicetype()) return false;
        if (hasDevicetype()) {
          if (getDevicetype()
              != other.getDevicetype()) return false;
        }
        if (hasFlashver() != other.hasFlashver()) return false;
        if (hasFlashver()) {
          if (!getFlashver()
              .equals(other.getFlashver())) return false;
        }
        if (hasIfa() != other.hasIfa()) return false;
        if (hasIfa()) {
          if (!getIfa()
              .equals(other.getIfa())) return false;
        }
        if (hasMacsha1() != other.hasMacsha1()) return false;
        if (hasMacsha1()) {
          if (!getMacsha1()
              .equals(other.getMacsha1())) return false;
        }
        if (hasMacmd5() != other.hasMacmd5()) return false;
        if (hasMacmd5()) {
          if (!getMacmd5()
              .equals(other.getMacmd5())) return false;
        }
        if (hasLmt() != other.hasLmt()) return false;
        if (hasLmt()) {
          if (getLmt()
              != other.getLmt()) return false;
        }
        if (hasMccmnc() != other.hasMccmnc()) return false;
        if (hasMccmnc()) {
          if (!getMccmnc()
              .equals(other.getMccmnc())) return false;
        }
        if (hasSua() != other.hasSua()) return false;
        if (hasSua()) {
          if (!getSua()
              .equals(other.getSua())) return false;
        }
        if (!unknownFields.equals(other.unknownFields)) return false;
        if (!getExtensionFields().equals(other.getExtensionFields()))
          return false;
        return true;
      }

      @java.lang.Override
      public int hashCode() {
        if (memoizedHashCode != 0) {
          return memoizedHashCode;
        }
        int hash = 41;
        hash = (19 * hash) + getDescriptor().hashCode();
        if (hasDnt()) {
          hash = (37 * hash) + DNT_FIELD_NUMBER;
          hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
              getDnt());
        }
        if (hasUa()) {
          hash = (37 * hash) + UA_FIELD_NUMBER;
          hash = (53 * hash) + getUa().hashCode();
        }
        if (hasIp()) {
          hash = (37 * hash) + IP_FIELD_NUMBER;
          hash = (53 * hash) + getIp().hashCode();
        }
        if (hasGeo()) {
          hash = (37 * hash) + GEO_FIELD_NUMBER;
          hash = (53 * hash) + getGeo().hashCode();
        }
        if (hasDidsha1()) {
          hash = (37 * hash) + DIDSHA1_FIELD_NUMBER;
          hash = (53 * hash) + getDidsha1().hashCode();
        }
        if (hasDidmd5()) {
          hash = (37 * hash) + DIDMD5_FIELD_NUMBER;
          hash = (53 * hash) + getDidmd5().hashCode();
        }
        if (hasDpidsha1()) {
          hash = (37 * hash) + DPIDSHA1_FIELD_NUMBER;
          hash = (53 * hash) + getDpidsha1().hashCode();
        }
        if (hasDpidmd5()) {
          hash = (37 * hash) + DPIDMD5_FIELD_NUMBER;
          hash = (53 * hash) + getDpidmd5().hashCode();
        }
        if (hasIpv6()) {
          hash = (37 * hash) + IPV6_FIELD_NUMBER;
          hash = (53 * hash) + getIpv6().hashCode();
        }
        if (hasCarrier()) {
          hash = (37 * hash) + CARRIER_FIELD_NUMBER;
          hash = (53 * hash) + getCarrier().hashCode();
        }
        if (hasLanguage()) {
          hash = (37 * hash) + LANGUAGE_FIELD_NUMBER;
          hash = (53 * hash) + getLanguage().hashCode();
        }
        if (hasLangb()) {
          hash = (37 * hash) + LANGB_FIELD_NUMBER;
          hash = (53 * hash) + getLangb().hashCode();
        }
        if (hasMake()) {
          hash = (37 * hash) + MAKE_FIELD_NUMBER;
          hash = (53 * hash) + getMake().hashCode();
        }
        if (hasModel()) {
          hash = (37 * hash) + MODEL_FIELD_NUMBER;
          hash = (53 * hash) + getModel().hashCode();
        }
        if (hasOs()) {
          hash = (37 * hash) + OS_FIELD_NUMBER;
          hash = (53 * hash) + getOs().hashCode();
        }
        if (hasOsv()) {
          hash = (37 * hash) + OSV_FIELD_NUMBER;
          hash = (53 * hash) + getOsv().hashCode();
        }
        if (hasHwv()) {
          hash = (37 * hash) + HWV_FIELD_NUMBER;
          hash = (53 * hash) + getHwv().hashCode();
        }
        if (hasW()) {
          hash = (37 * hash) + W_FIELD_NUMBER;
          hash = (53 * hash) + getW();
        }
        if (hasH()) {
          hash = (37 * hash) + H_FIELD_NUMBER;
          hash = (53 * hash) + getH();
        }
        if (hasPpi()) {
          hash = (37 * hash) + PPI_FIELD_NUMBER;
          hash = (53 * hash) + getPpi();
        }
        if (hasPxratio()) {
          hash = (37 * hash) + PXRATIO_FIELD_NUMBER;
          hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
              java.lang.Double.doubleToLongBits(getPxratio()));
        }
        if (hasJs()) {
          hash = (37 * hash) + JS_FIELD_NUMBER;
          hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
              getJs());
        }
        if (hasGeofetch()) {
          hash = (37 * hash) + GEOFETCH_FIELD_NUMBER;
          hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
              getGeofetch());
        }
        if (hasConnectiontype()) {
          hash = (37 * hash) + CONNECTIONTYPE_FIELD_NUMBER;
          hash = (53 * hash) + getConnectiontype();
        }
        if (hasDevicetype()) {
          hash = (37 * hash) + DEVICETYPE_FIELD_NUMBER;
          hash = (53 * hash) + getDevicetype();
        }
        if (hasFlashver()) {
          hash = (37 * hash) + FLASHVER_FIELD_NUMBER;
          hash = (53 * hash) + getFlashver().hashCode();
        }
        if (hasIfa()) {
          hash = (37 * hash) + IFA_FIELD_NUMBER;
          hash = (53 * hash) + getIfa().hashCode();
        }
        if (hasMacsha1()) {
          hash = (37 * hash) + MACSHA1_FIELD_NUMBER;
          hash = (53 * hash) + getMacsha1().hashCode();
        }
        if (hasMacmd5()) {
          hash = (37 * hash) + MACMD5_FIELD_NUMBER;
          hash = (53 * hash) + getMacmd5().hashCode();
        }
        if (hasLmt()) {
          hash = (37 * hash) + LMT_FIELD_NUMBER;
          hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
              getLmt());
        }
        if (hasMccmnc()) {
          hash = (37 * hash) + MCCMNC_FIELD_NUMBER;
          hash = (53 * hash) + getMccmnc().hashCode();
        }
        if (hasSua()) {
          hash = (37 * hash) + SUA_FIELD_NUMBER;
          hash = (53 * hash) + getSua().hashCode();
        }
        hash = hashFields(hash, getExtensionFields());
        hash = (29 * hash) + unknownFields.hashCode();
        memoizedHashCode = hash;
        return hash;
      }

      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device parseFrom(
          java.nio.ByteBuffer data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device parseFrom(
          java.nio.ByteBuffer data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device parseFrom(
          com.google.protobuf.ByteString data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device parseFrom(
          com.google.protobuf.ByteString data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device parseFrom(byte[] data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device parseFrom(
          byte[] data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device parseFrom(java.io.InputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device parseDelimitedFrom(java.io.InputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseDelimitedWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device parseFrom(
          com.google.protobuf.CodedInputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device 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>
       * OpenRTB 2.0: This object provides information pertaining to the device
       * through which the user is interacting. Device information includes its
       * hardware, platform, location, and carrier data. The device can refer to a
       * mobile handset, a desktop computer, set top box, or other digital device.
       * </pre>
       *
       * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Device}
       */
      public static final class Builder extends
          com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device, Builder> implements
          // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.BidRequest.Device)
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.DeviceOrBuilder {
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Device_descriptor;
        }

        @java.lang.Override
        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Device_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device.Builder.class);
        }

        // Construct using com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device.newBuilder()
        private Builder() {
          maybeForceBuilderInitialization();
        }

        private Builder(
            com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
          super(parent);
          maybeForceBuilderInitialization();
        }
        private void maybeForceBuilderInitialization() {
          if (com.google.protobuf.GeneratedMessageV3
                  .alwaysUseFieldBuilders) {
            getGeoFieldBuilder();
            getSuaFieldBuilder();
          }
        }
        @java.lang.Override
        public Builder clear() {
          super.clear();
          dnt_ = false;
          bitField0_ = (bitField0_ & ~0x00000001);
          ua_ = "";
          bitField0_ = (bitField0_ & ~0x00000002);
          ip_ = "";
          bitField0_ = (bitField0_ & ~0x00000004);
          if (geoBuilder_ == null) {
            geo_ = null;
          } else {
            geoBuilder_.clear();
          }
          bitField0_ = (bitField0_ & ~0x00000008);
          didsha1_ = "";
          bitField0_ = (bitField0_ & ~0x00000010);
          didmd5_ = "";
          bitField0_ = (bitField0_ & ~0x00000020);
          dpidsha1_ = "";
          bitField0_ = (bitField0_ & ~0x00000040);
          dpidmd5_ = "";
          bitField0_ = (bitField0_ & ~0x00000080);
          ipv6_ = "";
          bitField0_ = (bitField0_ & ~0x00000100);
          carrier_ = "";
          bitField0_ = (bitField0_ & ~0x00000200);
          language_ = "";
          bitField0_ = (bitField0_ & ~0x00000400);
          langb_ = "";
          bitField0_ = (bitField0_ & ~0x00000800);
          make_ = "";
          bitField0_ = (bitField0_ & ~0x00001000);
          model_ = "";
          bitField0_ = (bitField0_ & ~0x00002000);
          os_ = "";
          bitField0_ = (bitField0_ & ~0x00004000);
          osv_ = "";
          bitField0_ = (bitField0_ & ~0x00008000);
          hwv_ = "";
          bitField0_ = (bitField0_ & ~0x00010000);
          w_ = 0;
          bitField0_ = (bitField0_ & ~0x00020000);
          h_ = 0;
          bitField0_ = (bitField0_ & ~0x00040000);
          ppi_ = 0;
          bitField0_ = (bitField0_ & ~0x00080000);
          pxratio_ = 0D;
          bitField0_ = (bitField0_ & ~0x00100000);
          js_ = false;
          bitField0_ = (bitField0_ & ~0x00200000);
          geofetch_ = false;
          bitField0_ = (bitField0_ & ~0x00400000);
          connectiontype_ = 0;
          bitField0_ = (bitField0_ & ~0x00800000);
          devicetype_ = 0;
          bitField0_ = (bitField0_ & ~0x01000000);
          flashver_ = "";
          bitField0_ = (bitField0_ & ~0x02000000);
          ifa_ = "";
          bitField0_ = (bitField0_ & ~0x04000000);
          macsha1_ = "";
          bitField0_ = (bitField0_ & ~0x08000000);
          macmd5_ = "";
          bitField0_ = (bitField0_ & ~0x10000000);
          lmt_ = false;
          bitField0_ = (bitField0_ & ~0x20000000);
          mccmnc_ = "";
          bitField0_ = (bitField0_ & ~0x40000000);
          if (suaBuilder_ == null) {
            sua_ = null;
          } else {
            suaBuilder_.clear();
          }
          bitField0_ = (bitField0_ & ~0x80000000);
          return this;
        }

        @java.lang.Override
        public com.google.protobuf.Descriptors.Descriptor
            getDescriptorForType() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Device_descriptor;
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device getDefaultInstanceForType() {
          return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device.getDefaultInstance();
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device build() {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device result = buildPartial();
          if (!result.isInitialized()) {
            throw newUninitializedMessageException(result);
          }
          return result;
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device buildPartial() {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device result = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device(this);
          int from_bitField0_ = bitField0_;
          int to_bitField0_ = 0;
          if (((from_bitField0_ & 0x00000001) != 0)) {
            result.dnt_ = dnt_;
            to_bitField0_ |= 0x00000001;
          }
          if (((from_bitField0_ & 0x00000002) != 0)) {
            to_bitField0_ |= 0x00000002;
          }
          result.ua_ = ua_;
          if (((from_bitField0_ & 0x00000004) != 0)) {
            to_bitField0_ |= 0x00000004;
          }
          result.ip_ = ip_;
          if (((from_bitField0_ & 0x00000008) != 0)) {
            if (geoBuilder_ == null) {
              result.geo_ = geo_;
            } else {
              result.geo_ = geoBuilder_.build();
            }
            to_bitField0_ |= 0x00000008;
          }
          if (((from_bitField0_ & 0x00000010) != 0)) {
            to_bitField0_ |= 0x00000010;
          }
          result.didsha1_ = didsha1_;
          if (((from_bitField0_ & 0x00000020) != 0)) {
            to_bitField0_ |= 0x00000020;
          }
          result.didmd5_ = didmd5_;
          if (((from_bitField0_ & 0x00000040) != 0)) {
            to_bitField0_ |= 0x00000040;
          }
          result.dpidsha1_ = dpidsha1_;
          if (((from_bitField0_ & 0x00000080) != 0)) {
            to_bitField0_ |= 0x00000080;
          }
          result.dpidmd5_ = dpidmd5_;
          if (((from_bitField0_ & 0x00000100) != 0)) {
            to_bitField0_ |= 0x00000100;
          }
          result.ipv6_ = ipv6_;
          if (((from_bitField0_ & 0x00000200) != 0)) {
            to_bitField0_ |= 0x00000200;
          }
          result.carrier_ = carrier_;
          if (((from_bitField0_ & 0x00000400) != 0)) {
            to_bitField0_ |= 0x00000400;
          }
          result.language_ = language_;
          if (((from_bitField0_ & 0x00000800) != 0)) {
            to_bitField0_ |= 0x00000800;
          }
          result.langb_ = langb_;
          if (((from_bitField0_ & 0x00001000) != 0)) {
            to_bitField0_ |= 0x00001000;
          }
          result.make_ = make_;
          if (((from_bitField0_ & 0x00002000) != 0)) {
            to_bitField0_ |= 0x00002000;
          }
          result.model_ = model_;
          if (((from_bitField0_ & 0x00004000) != 0)) {
            to_bitField0_ |= 0x00004000;
          }
          result.os_ = os_;
          if (((from_bitField0_ & 0x00008000) != 0)) {
            to_bitField0_ |= 0x00008000;
          }
          result.osv_ = osv_;
          if (((from_bitField0_ & 0x00010000) != 0)) {
            to_bitField0_ |= 0x00010000;
          }
          result.hwv_ = hwv_;
          if (((from_bitField0_ & 0x00020000) != 0)) {
            result.w_ = w_;
            to_bitField0_ |= 0x00020000;
          }
          if (((from_bitField0_ & 0x00040000) != 0)) {
            result.h_ = h_;
            to_bitField0_ |= 0x00040000;
          }
          if (((from_bitField0_ & 0x00080000) != 0)) {
            result.ppi_ = ppi_;
            to_bitField0_ |= 0x00080000;
          }
          if (((from_bitField0_ & 0x00100000) != 0)) {
            result.pxratio_ = pxratio_;
            to_bitField0_ |= 0x00100000;
          }
          if (((from_bitField0_ & 0x00200000) != 0)) {
            result.js_ = js_;
            to_bitField0_ |= 0x00200000;
          }
          if (((from_bitField0_ & 0x00400000) != 0)) {
            result.geofetch_ = geofetch_;
            to_bitField0_ |= 0x00400000;
          }
          if (((from_bitField0_ & 0x00800000) != 0)) {
            result.connectiontype_ = connectiontype_;
            to_bitField0_ |= 0x00800000;
          }
          if (((from_bitField0_ & 0x01000000) != 0)) {
            result.devicetype_ = devicetype_;
            to_bitField0_ |= 0x01000000;
          }
          if (((from_bitField0_ & 0x02000000) != 0)) {
            to_bitField0_ |= 0x02000000;
          }
          result.flashver_ = flashver_;
          if (((from_bitField0_ & 0x04000000) != 0)) {
            to_bitField0_ |= 0x04000000;
          }
          result.ifa_ = ifa_;
          if (((from_bitField0_ & 0x08000000) != 0)) {
            to_bitField0_ |= 0x08000000;
          }
          result.macsha1_ = macsha1_;
          if (((from_bitField0_ & 0x10000000) != 0)) {
            to_bitField0_ |= 0x10000000;
          }
          result.macmd5_ = macmd5_;
          if (((from_bitField0_ & 0x20000000) != 0)) {
            result.lmt_ = lmt_;
            to_bitField0_ |= 0x20000000;
          }
          if (((from_bitField0_ & 0x40000000) != 0)) {
            to_bitField0_ |= 0x40000000;
          }
          result.mccmnc_ = mccmnc_;
          if (((from_bitField0_ & 0x80000000) != 0)) {
            if (suaBuilder_ == null) {
              result.sua_ = sua_;
            } else {
              result.sua_ = suaBuilder_.build();
            }
            to_bitField0_ |= 0x80000000;
          }
          result.bitField0_ = to_bitField0_;
          onBuilt();
          return result;
        }

        @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 <Type> Builder setExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device, Type> extension,
            Type value) {
          return super.setExtension(extension, value);
        }
        @java.lang.Override
        public <Type> Builder setExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device, java.util.List<Type>> extension,
            int index, Type value) {
          return super.setExtension(extension, index, value);
        }
        @java.lang.Override
        public <Type> Builder addExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device, java.util.List<Type>> extension,
            Type value) {
          return super.addExtension(extension, value);
        }
        @java.lang.Override
        public <Type> Builder clearExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device, ?> extension) {
          return super.clearExtension(extension);
        }
        @java.lang.Override
        public Builder mergeFrom(com.google.protobuf.Message other) {
          if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device) {
            return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device)other);
          } else {
            super.mergeFrom(other);
            return this;
          }
        }

        public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device other) {
          if (other == com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device.getDefaultInstance()) return this;
          if (other.hasDnt()) {
            setDnt(other.getDnt());
          }
          if (other.hasUa()) {
            bitField0_ |= 0x00000002;
            ua_ = other.ua_;
            onChanged();
          }
          if (other.hasIp()) {
            bitField0_ |= 0x00000004;
            ip_ = other.ip_;
            onChanged();
          }
          if (other.hasGeo()) {
            mergeGeo(other.getGeo());
          }
          if (other.hasDidsha1()) {
            bitField0_ |= 0x00000010;
            didsha1_ = other.didsha1_;
            onChanged();
          }
          if (other.hasDidmd5()) {
            bitField0_ |= 0x00000020;
            didmd5_ = other.didmd5_;
            onChanged();
          }
          if (other.hasDpidsha1()) {
            bitField0_ |= 0x00000040;
            dpidsha1_ = other.dpidsha1_;
            onChanged();
          }
          if (other.hasDpidmd5()) {
            bitField0_ |= 0x00000080;
            dpidmd5_ = other.dpidmd5_;
            onChanged();
          }
          if (other.hasIpv6()) {
            bitField0_ |= 0x00000100;
            ipv6_ = other.ipv6_;
            onChanged();
          }
          if (other.hasCarrier()) {
            bitField0_ |= 0x00000200;
            carrier_ = other.carrier_;
            onChanged();
          }
          if (other.hasLanguage()) {
            bitField0_ |= 0x00000400;
            language_ = other.language_;
            onChanged();
          }
          if (other.hasLangb()) {
            bitField0_ |= 0x00000800;
            langb_ = other.langb_;
            onChanged();
          }
          if (other.hasMake()) {
            bitField0_ |= 0x00001000;
            make_ = other.make_;
            onChanged();
          }
          if (other.hasModel()) {
            bitField0_ |= 0x00002000;
            model_ = other.model_;
            onChanged();
          }
          if (other.hasOs()) {
            bitField0_ |= 0x00004000;
            os_ = other.os_;
            onChanged();
          }
          if (other.hasOsv()) {
            bitField0_ |= 0x00008000;
            osv_ = other.osv_;
            onChanged();
          }
          if (other.hasHwv()) {
            bitField0_ |= 0x00010000;
            hwv_ = other.hwv_;
            onChanged();
          }
          if (other.hasW()) {
            setW(other.getW());
          }
          if (other.hasH()) {
            setH(other.getH());
          }
          if (other.hasPpi()) {
            setPpi(other.getPpi());
          }
          if (other.hasPxratio()) {
            setPxratio(other.getPxratio());
          }
          if (other.hasJs()) {
            setJs(other.getJs());
          }
          if (other.hasGeofetch()) {
            setGeofetch(other.getGeofetch());
          }
          if (other.hasConnectiontype()) {
            setConnectiontype(other.getConnectiontype());
          }
          if (other.hasDevicetype()) {
            setDevicetype(other.getDevicetype());
          }
          if (other.hasFlashver()) {
            bitField0_ |= 0x02000000;
            flashver_ = other.flashver_;
            onChanged();
          }
          if (other.hasIfa()) {
            bitField0_ |= 0x04000000;
            ifa_ = other.ifa_;
            onChanged();
          }
          if (other.hasMacsha1()) {
            bitField0_ |= 0x08000000;
            macsha1_ = other.macsha1_;
            onChanged();
          }
          if (other.hasMacmd5()) {
            bitField0_ |= 0x10000000;
            macmd5_ = other.macmd5_;
            onChanged();
          }
          if (other.hasLmt()) {
            setLmt(other.getLmt());
          }
          if (other.hasMccmnc()) {
            bitField0_ |= 0x40000000;
            mccmnc_ = other.mccmnc_;
            onChanged();
          }
          if (other.hasSua()) {
            mergeSua(other.getSua());
          }
          this.mergeExtensionFields(other);
          this.mergeUnknownFields(other.unknownFields);
          onChanged();
          return this;
        }

        @java.lang.Override
        public final boolean isInitialized() {
          if (hasGeo()) {
            if (!getGeo().isInitialized()) {
              return false;
            }
          }
          if (hasSua()) {
            if (!getSua().isInitialized()) {
              return false;
            }
          }
          if (!extensionsAreInitialized()) {
            return false;
          }
          return true;
        }

        @java.lang.Override
        public Builder mergeFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws java.io.IOException {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device parsedMessage = null;
          try {
            parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device) e.getUnfinishedMessage();
            throw e.unwrapIOException();
          } finally {
            if (parsedMessage != null) {
              mergeFrom(parsedMessage);
            }
          }
          return this;
        }
        private int bitField0_;

        private boolean dnt_ ;
        /**
         * <pre>
         * Standard "Do Not Track" flag as set in the header by the browser,
         * where 0 = tracking is unrestricted, 1 = do not track.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional bool dnt = 1;</code>
         * @return Whether the dnt field is set.
         */
        @java.lang.Override
        public boolean hasDnt() {
          return ((bitField0_ & 0x00000001) != 0);
        }
        /**
         * <pre>
         * Standard "Do Not Track" flag as set in the header by the browser,
         * where 0 = tracking is unrestricted, 1 = do not track.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional bool dnt = 1;</code>
         * @return The dnt.
         */
        @java.lang.Override
        public boolean getDnt() {
          return dnt_;
        }
        /**
         * <pre>
         * Standard "Do Not Track" flag as set in the header by the browser,
         * where 0 = tracking is unrestricted, 1 = do not track.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional bool dnt = 1;</code>
         * @param value The dnt to set.
         * @return This builder for chaining.
         */
        public Builder setDnt(boolean value) {
          bitField0_ |= 0x00000001;
          dnt_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Standard "Do Not Track" flag as set in the header by the browser,
         * where 0 = tracking is unrestricted, 1 = do not track.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional bool dnt = 1;</code>
         * @return This builder for chaining.
         */
        public Builder clearDnt() {
          bitField0_ = (bitField0_ & ~0x00000001);
          dnt_ = false;
          onChanged();
          return this;
        }

        private java.lang.Object ua_ = "";
        /**
         * <pre>
         * Browser user agent string. Certain data may be redacted or replaced.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string ua = 2;</code>
         * @return Whether the ua field is set.
         */
        public boolean hasUa() {
          return ((bitField0_ & 0x00000002) != 0);
        }
        /**
         * <pre>
         * Browser user agent string. Certain data may be redacted or replaced.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string ua = 2;</code>
         * @return The ua.
         */
        public java.lang.String getUa() {
          java.lang.Object ref = ua_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              ua_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Browser user agent string. Certain data may be redacted or replaced.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string ua = 2;</code>
         * @return The bytes for ua.
         */
        public com.google.protobuf.ByteString
            getUaBytes() {
          java.lang.Object ref = ua_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            ua_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Browser user agent string. Certain data may be redacted or replaced.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string ua = 2;</code>
         * @param value The ua to set.
         * @return This builder for chaining.
         */
        public Builder setUa(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
          ua_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Browser user agent string. Certain data may be redacted or replaced.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string ua = 2;</code>
         * @return This builder for chaining.
         */
        public Builder clearUa() {
          bitField0_ = (bitField0_ & ~0x00000002);
          ua_ = getDefaultInstance().getUa();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Browser user agent string. Certain data may be redacted or replaced.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string ua = 2;</code>
         * @param value The bytes for ua to set.
         * @return This builder for chaining.
         */
        public Builder setUaBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
          ua_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object ip_ = "";
        /**
         * <pre>
         * IPv4 address closest to device.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string ip = 3;</code>
         * @return Whether the ip field is set.
         */
        public boolean hasIp() {
          return ((bitField0_ & 0x00000004) != 0);
        }
        /**
         * <pre>
         * IPv4 address closest to device.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string ip = 3;</code>
         * @return The ip.
         */
        public java.lang.String getIp() {
          java.lang.Object ref = ip_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              ip_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * IPv4 address closest to device.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string ip = 3;</code>
         * @return The bytes for ip.
         */
        public com.google.protobuf.ByteString
            getIpBytes() {
          java.lang.Object ref = ip_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            ip_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * IPv4 address closest to device.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string ip = 3;</code>
         * @param value The ip to set.
         * @return This builder for chaining.
         */
        public Builder setIp(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
          ip_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * IPv4 address closest to device.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string ip = 3;</code>
         * @return This builder for chaining.
         */
        public Builder clearIp() {
          bitField0_ = (bitField0_ & ~0x00000004);
          ip_ = getDefaultInstance().getIp();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * IPv4 address closest to device.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional string ip = 3;</code>
         * @param value The bytes for ip to set.
         * @return This builder for chaining.
         */
        public Builder setIpBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
          ip_ = value;
          onChanged();
          return this;
        }

        private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo geo_;
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.GeoOrBuilder> geoBuilder_;
        /**
         * <pre>
         * Location of the device assumed to be the user's current location defined
         * by a Geo object (Section 3.2.12).
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Geo geo = 4;</code>
         * @return Whether the geo field is set.
         */
        public boolean hasGeo() {
          return ((bitField0_ & 0x00000008) != 0);
        }
        /**
         * <pre>
         * Location of the device assumed to be the user's current location defined
         * by a Geo object (Section 3.2.12).
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Geo geo = 4;</code>
         * @return The geo.
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo getGeo() {
          if (geoBuilder_ == null) {
            return geo_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo.getDefaultInstance() : geo_;
          } else {
            return geoBuilder_.getMessage();
          }
        }
        /**
         * <pre>
         * Location of the device assumed to be the user's current location defined
         * by a Geo object (Section 3.2.12).
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Geo geo = 4;</code>
         */
        public Builder setGeo(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo value) {
          if (geoBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            geo_ = value;
            onChanged();
          } else {
            geoBuilder_.setMessage(value);
          }
          bitField0_ |= 0x00000008;
          return this;
        }
        /**
         * <pre>
         * Location of the device assumed to be the user's current location defined
         * by a Geo object (Section 3.2.12).
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Geo geo = 4;</code>
         */
        public Builder setGeo(
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo.Builder builderForValue) {
          if (geoBuilder_ == null) {
            geo_ = builderForValue.build();
            onChanged();
          } else {
            geoBuilder_.setMessage(builderForValue.build());
          }
          bitField0_ |= 0x00000008;
          return this;
        }
        /**
         * <pre>
         * Location of the device assumed to be the user's current location defined
         * by a Geo object (Section 3.2.12).
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Geo geo = 4;</code>
         */
        public Builder mergeGeo(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo value) {
          if (geoBuilder_ == null) {
            if (((bitField0_ & 0x00000008) != 0) &&
                geo_ != null &&
                geo_ != com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo.getDefaultInstance()) {
              geo_ =
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo.newBuilder(geo_).mergeFrom(value).buildPartial();
            } else {
              geo_ = value;
            }
            onChanged();
          } else {
            geoBuilder_.mergeFrom(value);
          }
          bitField0_ |= 0x00000008;
          return this;
        }
        /**
         * <pre>
         * Location of the device assumed to be the user's current location defined
         * by a Geo object (Section 3.2.12).
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Geo geo = 4;</code>
         */
        public Builder clearGeo() {
          if (geoBuilder_ == null) {
            geo_ = null;
            onChanged();
          } else {
            geoBuilder_.clear();
          }
          bitField0_ = (bitField0_ & ~0x00000008);
          return this;
        }
        /**
         * <pre>
         * Location of the device assumed to be the user's current location defined
         * by a Geo object (Section 3.2.12).
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Geo geo = 4;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo.Builder getGeoBuilder() {
          bitField0_ |= 0x00000008;
          onChanged();
          return getGeoFieldBuilder().getBuilder();
        }
        /**
         * <pre>
         * Location of the device assumed to be the user's current location defined
         * by a Geo object (Section 3.2.12).
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Geo geo = 4;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.GeoOrBuilder getGeoOrBuilder() {
          if (geoBuilder_ != null) {
            return geoBuilder_.getMessageOrBuilder();
          } else {
            return geo_ == null ?
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo.getDefaultInstance() : geo_;
          }
        }
        /**
         * <pre>
         * Location of the device assumed to be the user's current location defined
         * by a Geo object (Section 3.2.12).
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Geo geo = 4;</code>
         */
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.GeoOrBuilder> 
            getGeoFieldBuilder() {
          if (geoBuilder_ == null) {
            geoBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.GeoOrBuilder>(
                    getGeo(),
                    getParentForChildren(),
                    isClean());
            geo_ = null;
          }
          return geoBuilder_;
        }

        private java.lang.Object didsha1_ = "";
        /**
         * <pre>
         * Hardware device ID (e.g., IMEI); hashed via SHA1.
         * </pre>
         *
         * <code>optional string didsha1 = 5;</code>
         * @return Whether the didsha1 field is set.
         */
        public boolean hasDidsha1() {
          return ((bitField0_ & 0x00000010) != 0);
        }
        /**
         * <pre>
         * Hardware device ID (e.g., IMEI); hashed via SHA1.
         * </pre>
         *
         * <code>optional string didsha1 = 5;</code>
         * @return The didsha1.
         */
        public java.lang.String getDidsha1() {
          java.lang.Object ref = didsha1_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              didsha1_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Hardware device ID (e.g., IMEI); hashed via SHA1.
         * </pre>
         *
         * <code>optional string didsha1 = 5;</code>
         * @return The bytes for didsha1.
         */
        public com.google.protobuf.ByteString
            getDidsha1Bytes() {
          java.lang.Object ref = didsha1_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            didsha1_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Hardware device ID (e.g., IMEI); hashed via SHA1.
         * </pre>
         *
         * <code>optional string didsha1 = 5;</code>
         * @param value The didsha1 to set.
         * @return This builder for chaining.
         */
        public Builder setDidsha1(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
          didsha1_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Hardware device ID (e.g., IMEI); hashed via SHA1.
         * </pre>
         *
         * <code>optional string didsha1 = 5;</code>
         * @return This builder for chaining.
         */
        public Builder clearDidsha1() {
          bitField0_ = (bitField0_ & ~0x00000010);
          didsha1_ = getDefaultInstance().getDidsha1();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Hardware device ID (e.g., IMEI); hashed via SHA1.
         * </pre>
         *
         * <code>optional string didsha1 = 5;</code>
         * @param value The bytes for didsha1 to set.
         * @return This builder for chaining.
         */
        public Builder setDidsha1Bytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
          didsha1_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object didmd5_ = "";
        /**
         * <pre>
         * Hardware device ID (e.g., IMEI); hashed via MD5.
         * </pre>
         *
         * <code>optional string didmd5 = 6;</code>
         * @return Whether the didmd5 field is set.
         */
        public boolean hasDidmd5() {
          return ((bitField0_ & 0x00000020) != 0);
        }
        /**
         * <pre>
         * Hardware device ID (e.g., IMEI); hashed via MD5.
         * </pre>
         *
         * <code>optional string didmd5 = 6;</code>
         * @return The didmd5.
         */
        public java.lang.String getDidmd5() {
          java.lang.Object ref = didmd5_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              didmd5_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Hardware device ID (e.g., IMEI); hashed via MD5.
         * </pre>
         *
         * <code>optional string didmd5 = 6;</code>
         * @return The bytes for didmd5.
         */
        public com.google.protobuf.ByteString
            getDidmd5Bytes() {
          java.lang.Object ref = didmd5_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            didmd5_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Hardware device ID (e.g., IMEI); hashed via MD5.
         * </pre>
         *
         * <code>optional string didmd5 = 6;</code>
         * @param value The didmd5 to set.
         * @return This builder for chaining.
         */
        public Builder setDidmd5(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000020;
          didmd5_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Hardware device ID (e.g., IMEI); hashed via MD5.
         * </pre>
         *
         * <code>optional string didmd5 = 6;</code>
         * @return This builder for chaining.
         */
        public Builder clearDidmd5() {
          bitField0_ = (bitField0_ & ~0x00000020);
          didmd5_ = getDefaultInstance().getDidmd5();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Hardware device ID (e.g., IMEI); hashed via MD5.
         * </pre>
         *
         * <code>optional string didmd5 = 6;</code>
         * @param value The bytes for didmd5 to set.
         * @return This builder for chaining.
         */
        public Builder setDidmd5Bytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000020;
          didmd5_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object dpidsha1_ = "";
        /**
         * <pre>
         * Platform device ID (e.g., Android ID); hashed via SHA1.
         * </pre>
         *
         * <code>optional string dpidsha1 = 7;</code>
         * @return Whether the dpidsha1 field is set.
         */
        public boolean hasDpidsha1() {
          return ((bitField0_ & 0x00000040) != 0);
        }
        /**
         * <pre>
         * Platform device ID (e.g., Android ID); hashed via SHA1.
         * </pre>
         *
         * <code>optional string dpidsha1 = 7;</code>
         * @return The dpidsha1.
         */
        public java.lang.String getDpidsha1() {
          java.lang.Object ref = dpidsha1_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              dpidsha1_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Platform device ID (e.g., Android ID); hashed via SHA1.
         * </pre>
         *
         * <code>optional string dpidsha1 = 7;</code>
         * @return The bytes for dpidsha1.
         */
        public com.google.protobuf.ByteString
            getDpidsha1Bytes() {
          java.lang.Object ref = dpidsha1_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            dpidsha1_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Platform device ID (e.g., Android ID); hashed via SHA1.
         * </pre>
         *
         * <code>optional string dpidsha1 = 7;</code>
         * @param value The dpidsha1 to set.
         * @return This builder for chaining.
         */
        public Builder setDpidsha1(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000040;
          dpidsha1_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Platform device ID (e.g., Android ID); hashed via SHA1.
         * </pre>
         *
         * <code>optional string dpidsha1 = 7;</code>
         * @return This builder for chaining.
         */
        public Builder clearDpidsha1() {
          bitField0_ = (bitField0_ & ~0x00000040);
          dpidsha1_ = getDefaultInstance().getDpidsha1();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Platform device ID (e.g., Android ID); hashed via SHA1.
         * </pre>
         *
         * <code>optional string dpidsha1 = 7;</code>
         * @param value The bytes for dpidsha1 to set.
         * @return This builder for chaining.
         */
        public Builder setDpidsha1Bytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000040;
          dpidsha1_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object dpidmd5_ = "";
        /**
         * <pre>
         * Platform device ID (e.g., Android ID); hashed via MD5.
         * </pre>
         *
         * <code>optional string dpidmd5 = 8;</code>
         * @return Whether the dpidmd5 field is set.
         */
        public boolean hasDpidmd5() {
          return ((bitField0_ & 0x00000080) != 0);
        }
        /**
         * <pre>
         * Platform device ID (e.g., Android ID); hashed via MD5.
         * </pre>
         *
         * <code>optional string dpidmd5 = 8;</code>
         * @return The dpidmd5.
         */
        public java.lang.String getDpidmd5() {
          java.lang.Object ref = dpidmd5_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              dpidmd5_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Platform device ID (e.g., Android ID); hashed via MD5.
         * </pre>
         *
         * <code>optional string dpidmd5 = 8;</code>
         * @return The bytes for dpidmd5.
         */
        public com.google.protobuf.ByteString
            getDpidmd5Bytes() {
          java.lang.Object ref = dpidmd5_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            dpidmd5_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Platform device ID (e.g., Android ID); hashed via MD5.
         * </pre>
         *
         * <code>optional string dpidmd5 = 8;</code>
         * @param value The dpidmd5 to set.
         * @return This builder for chaining.
         */
        public Builder setDpidmd5(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000080;
          dpidmd5_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Platform device ID (e.g., Android ID); hashed via MD5.
         * </pre>
         *
         * <code>optional string dpidmd5 = 8;</code>
         * @return This builder for chaining.
         */
        public Builder clearDpidmd5() {
          bitField0_ = (bitField0_ & ~0x00000080);
          dpidmd5_ = getDefaultInstance().getDpidmd5();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Platform device ID (e.g., Android ID); hashed via MD5.
         * </pre>
         *
         * <code>optional string dpidmd5 = 8;</code>
         * @param value The bytes for dpidmd5 to set.
         * @return This builder for chaining.
         */
        public Builder setDpidmd5Bytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000080;
          dpidmd5_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object ipv6_ = "";
        /**
         * <pre>
         * IPv6 address closest to device.
         * </pre>
         *
         * <code>optional string ipv6 = 9;</code>
         * @return Whether the ipv6 field is set.
         */
        public boolean hasIpv6() {
          return ((bitField0_ & 0x00000100) != 0);
        }
        /**
         * <pre>
         * IPv6 address closest to device.
         * </pre>
         *
         * <code>optional string ipv6 = 9;</code>
         * @return The ipv6.
         */
        public java.lang.String getIpv6() {
          java.lang.Object ref = ipv6_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              ipv6_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * IPv6 address closest to device.
         * </pre>
         *
         * <code>optional string ipv6 = 9;</code>
         * @return The bytes for ipv6.
         */
        public com.google.protobuf.ByteString
            getIpv6Bytes() {
          java.lang.Object ref = ipv6_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            ipv6_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * IPv6 address closest to device.
         * </pre>
         *
         * <code>optional string ipv6 = 9;</code>
         * @param value The ipv6 to set.
         * @return This builder for chaining.
         */
        public Builder setIpv6(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000100;
          ipv6_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * IPv6 address closest to device.
         * </pre>
         *
         * <code>optional string ipv6 = 9;</code>
         * @return This builder for chaining.
         */
        public Builder clearIpv6() {
          bitField0_ = (bitField0_ & ~0x00000100);
          ipv6_ = getDefaultInstance().getIpv6();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * IPv6 address closest to device.
         * </pre>
         *
         * <code>optional string ipv6 = 9;</code>
         * @param value The bytes for ipv6 to set.
         * @return This builder for chaining.
         */
        public Builder setIpv6Bytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000100;
          ipv6_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object carrier_ = "";
        /**
         * <pre>
         * Carrier or ISP (e.g., "VERIZON") using exchange curated string
         * names which should be published to bidders a priori.
         * </pre>
         *
         * <code>optional string carrier = 10;</code>
         * @return Whether the carrier field is set.
         */
        public boolean hasCarrier() {
          return ((bitField0_ & 0x00000200) != 0);
        }
        /**
         * <pre>
         * Carrier or ISP (e.g., "VERIZON") using exchange curated string
         * names which should be published to bidders a priori.
         * </pre>
         *
         * <code>optional string carrier = 10;</code>
         * @return The carrier.
         */
        public java.lang.String getCarrier() {
          java.lang.Object ref = carrier_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              carrier_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Carrier or ISP (e.g., "VERIZON") using exchange curated string
         * names which should be published to bidders a priori.
         * </pre>
         *
         * <code>optional string carrier = 10;</code>
         * @return The bytes for carrier.
         */
        public com.google.protobuf.ByteString
            getCarrierBytes() {
          java.lang.Object ref = carrier_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            carrier_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Carrier or ISP (e.g., "VERIZON") using exchange curated string
         * names which should be published to bidders a priori.
         * </pre>
         *
         * <code>optional string carrier = 10;</code>
         * @param value The carrier to set.
         * @return This builder for chaining.
         */
        public Builder setCarrier(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000200;
          carrier_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Carrier or ISP (e.g., "VERIZON") using exchange curated string
         * names which should be published to bidders a priori.
         * </pre>
         *
         * <code>optional string carrier = 10;</code>
         * @return This builder for chaining.
         */
        public Builder clearCarrier() {
          bitField0_ = (bitField0_ & ~0x00000200);
          carrier_ = getDefaultInstance().getCarrier();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Carrier or ISP (e.g., "VERIZON") using exchange curated string
         * names which should be published to bidders a priori.
         * </pre>
         *
         * <code>optional string carrier = 10;</code>
         * @param value The bytes for carrier to set.
         * @return This builder for chaining.
         */
        public Builder setCarrierBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000200;
          carrier_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object language_ = "";
        /**
         * <pre>
         * Browser language using ISO-639-1-alpha-2.
         * </pre>
         *
         * <code>optional string language = 11;</code>
         * @return Whether the language field is set.
         */
        public boolean hasLanguage() {
          return ((bitField0_ & 0x00000400) != 0);
        }
        /**
         * <pre>
         * Browser language using ISO-639-1-alpha-2.
         * </pre>
         *
         * <code>optional string language = 11;</code>
         * @return The language.
         */
        public java.lang.String getLanguage() {
          java.lang.Object ref = language_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              language_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Browser language using ISO-639-1-alpha-2.
         * </pre>
         *
         * <code>optional string language = 11;</code>
         * @return The bytes for language.
         */
        public com.google.protobuf.ByteString
            getLanguageBytes() {
          java.lang.Object ref = language_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            language_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Browser language using ISO-639-1-alpha-2.
         * </pre>
         *
         * <code>optional string language = 11;</code>
         * @param value The language to set.
         * @return This builder for chaining.
         */
        public Builder setLanguage(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000400;
          language_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Browser language using ISO-639-1-alpha-2.
         * </pre>
         *
         * <code>optional string language = 11;</code>
         * @return This builder for chaining.
         */
        public Builder clearLanguage() {
          bitField0_ = (bitField0_ & ~0x00000400);
          language_ = getDefaultInstance().getLanguage();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Browser language using ISO-639-1-alpha-2.
         * </pre>
         *
         * <code>optional string language = 11;</code>
         * @param value The bytes for language to set.
         * @return This builder for chaining.
         */
        public Builder setLanguageBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000400;
          language_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object langb_ = "";
        /**
         * <pre>
         * Browser language using IETF BCP 47. Only one of language or langb should be present.
         * </pre>
         *
         * <code>optional string langb = 32;</code>
         * @return Whether the langb field is set.
         */
        public boolean hasLangb() {
          return ((bitField0_ & 0x00000800) != 0);
        }
        /**
         * <pre>
         * Browser language using IETF BCP 47. Only one of language or langb should be present.
         * </pre>
         *
         * <code>optional string langb = 32;</code>
         * @return The langb.
         */
        public java.lang.String getLangb() {
          java.lang.Object ref = langb_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              langb_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Browser language using IETF BCP 47. Only one of language or langb should be present.
         * </pre>
         *
         * <code>optional string langb = 32;</code>
         * @return The bytes for langb.
         */
        public com.google.protobuf.ByteString
            getLangbBytes() {
          java.lang.Object ref = langb_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            langb_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Browser language using IETF BCP 47. Only one of language or langb should be present.
         * </pre>
         *
         * <code>optional string langb = 32;</code>
         * @param value The langb to set.
         * @return This builder for chaining.
         */
        public Builder setLangb(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000800;
          langb_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Browser language using IETF BCP 47. Only one of language or langb should be present.
         * </pre>
         *
         * <code>optional string langb = 32;</code>
         * @return This builder for chaining.
         */
        public Builder clearLangb() {
          bitField0_ = (bitField0_ & ~0x00000800);
          langb_ = getDefaultInstance().getLangb();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Browser language using IETF BCP 47. Only one of language or langb should be present.
         * </pre>
         *
         * <code>optional string langb = 32;</code>
         * @param value The bytes for langb to set.
         * @return This builder for chaining.
         */
        public Builder setLangbBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000800;
          langb_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object make_ = "";
        /**
         * <pre>
         * Device make (e.g., "Apple").
         * </pre>
         *
         * <code>optional string make = 12;</code>
         * @return Whether the make field is set.
         */
        public boolean hasMake() {
          return ((bitField0_ & 0x00001000) != 0);
        }
        /**
         * <pre>
         * Device make (e.g., "Apple").
         * </pre>
         *
         * <code>optional string make = 12;</code>
         * @return The make.
         */
        public java.lang.String getMake() {
          java.lang.Object ref = make_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              make_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Device make (e.g., "Apple").
         * </pre>
         *
         * <code>optional string make = 12;</code>
         * @return The bytes for make.
         */
        public com.google.protobuf.ByteString
            getMakeBytes() {
          java.lang.Object ref = make_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            make_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Device make (e.g., "Apple").
         * </pre>
         *
         * <code>optional string make = 12;</code>
         * @param value The make to set.
         * @return This builder for chaining.
         */
        public Builder setMake(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00001000;
          make_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Device make (e.g., "Apple").
         * </pre>
         *
         * <code>optional string make = 12;</code>
         * @return This builder for chaining.
         */
        public Builder clearMake() {
          bitField0_ = (bitField0_ & ~0x00001000);
          make_ = getDefaultInstance().getMake();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Device make (e.g., "Apple").
         * </pre>
         *
         * <code>optional string make = 12;</code>
         * @param value The bytes for make to set.
         * @return This builder for chaining.
         */
        public Builder setMakeBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00001000;
          make_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object model_ = "";
        /**
         * <pre>
         * Device model (e.g., "iPhone").
         * </pre>
         *
         * <code>optional string model = 13;</code>
         * @return Whether the model field is set.
         */
        public boolean hasModel() {
          return ((bitField0_ & 0x00002000) != 0);
        }
        /**
         * <pre>
         * Device model (e.g., "iPhone").
         * </pre>
         *
         * <code>optional string model = 13;</code>
         * @return The model.
         */
        public java.lang.String getModel() {
          java.lang.Object ref = model_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              model_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Device model (e.g., "iPhone").
         * </pre>
         *
         * <code>optional string model = 13;</code>
         * @return The bytes for model.
         */
        public com.google.protobuf.ByteString
            getModelBytes() {
          java.lang.Object ref = model_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            model_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Device model (e.g., "iPhone").
         * </pre>
         *
         * <code>optional string model = 13;</code>
         * @param value The model to set.
         * @return This builder for chaining.
         */
        public Builder setModel(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00002000;
          model_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Device model (e.g., "iPhone").
         * </pre>
         *
         * <code>optional string model = 13;</code>
         * @return This builder for chaining.
         */
        public Builder clearModel() {
          bitField0_ = (bitField0_ & ~0x00002000);
          model_ = getDefaultInstance().getModel();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Device model (e.g., "iPhone").
         * </pre>
         *
         * <code>optional string model = 13;</code>
         * @param value The bytes for model to set.
         * @return This builder for chaining.
         */
        public Builder setModelBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00002000;
          model_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object os_ = "";
        /**
         * <pre>
         * Device operating system (e.g., "iOS").
         * </pre>
         *
         * <code>optional string os = 14;</code>
         * @return Whether the os field is set.
         */
        public boolean hasOs() {
          return ((bitField0_ & 0x00004000) != 0);
        }
        /**
         * <pre>
         * Device operating system (e.g., "iOS").
         * </pre>
         *
         * <code>optional string os = 14;</code>
         * @return The os.
         */
        public java.lang.String getOs() {
          java.lang.Object ref = os_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              os_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Device operating system (e.g., "iOS").
         * </pre>
         *
         * <code>optional string os = 14;</code>
         * @return The bytes for os.
         */
        public com.google.protobuf.ByteString
            getOsBytes() {
          java.lang.Object ref = os_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            os_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Device operating system (e.g., "iOS").
         * </pre>
         *
         * <code>optional string os = 14;</code>
         * @param value The os to set.
         * @return This builder for chaining.
         */
        public Builder setOs(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00004000;
          os_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Device operating system (e.g., "iOS").
         * </pre>
         *
         * <code>optional string os = 14;</code>
         * @return This builder for chaining.
         */
        public Builder clearOs() {
          bitField0_ = (bitField0_ & ~0x00004000);
          os_ = getDefaultInstance().getOs();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Device operating system (e.g., "iOS").
         * </pre>
         *
         * <code>optional string os = 14;</code>
         * @param value The bytes for os to set.
         * @return This builder for chaining.
         */
        public Builder setOsBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00004000;
          os_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object osv_ = "";
        /**
         * <pre>
         * Device operating system version (e.g., "3.1.2").
         * </pre>
         *
         * <code>optional string osv = 15;</code>
         * @return Whether the osv field is set.
         */
        public boolean hasOsv() {
          return ((bitField0_ & 0x00008000) != 0);
        }
        /**
         * <pre>
         * Device operating system version (e.g., "3.1.2").
         * </pre>
         *
         * <code>optional string osv = 15;</code>
         * @return The osv.
         */
        public java.lang.String getOsv() {
          java.lang.Object ref = osv_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              osv_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Device operating system version (e.g., "3.1.2").
         * </pre>
         *
         * <code>optional string osv = 15;</code>
         * @return The bytes for osv.
         */
        public com.google.protobuf.ByteString
            getOsvBytes() {
          java.lang.Object ref = osv_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            osv_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Device operating system version (e.g., "3.1.2").
         * </pre>
         *
         * <code>optional string osv = 15;</code>
         * @param value The osv to set.
         * @return This builder for chaining.
         */
        public Builder setOsv(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00008000;
          osv_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Device operating system version (e.g., "3.1.2").
         * </pre>
         *
         * <code>optional string osv = 15;</code>
         * @return This builder for chaining.
         */
        public Builder clearOsv() {
          bitField0_ = (bitField0_ & ~0x00008000);
          osv_ = getDefaultInstance().getOsv();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Device operating system version (e.g., "3.1.2").
         * </pre>
         *
         * <code>optional string osv = 15;</code>
         * @param value The bytes for osv to set.
         * @return This builder for chaining.
         */
        public Builder setOsvBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00008000;
          osv_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object hwv_ = "";
        /**
         * <pre>
         * Hardware version of the device (e.g., "5S" for iPhone 5S).
         * </pre>
         *
         * <code>optional string hwv = 24;</code>
         * @return Whether the hwv field is set.
         */
        public boolean hasHwv() {
          return ((bitField0_ & 0x00010000) != 0);
        }
        /**
         * <pre>
         * Hardware version of the device (e.g., "5S" for iPhone 5S).
         * </pre>
         *
         * <code>optional string hwv = 24;</code>
         * @return The hwv.
         */
        public java.lang.String getHwv() {
          java.lang.Object ref = hwv_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              hwv_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Hardware version of the device (e.g., "5S" for iPhone 5S).
         * </pre>
         *
         * <code>optional string hwv = 24;</code>
         * @return The bytes for hwv.
         */
        public com.google.protobuf.ByteString
            getHwvBytes() {
          java.lang.Object ref = hwv_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            hwv_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Hardware version of the device (e.g., "5S" for iPhone 5S).
         * </pre>
         *
         * <code>optional string hwv = 24;</code>
         * @param value The hwv to set.
         * @return This builder for chaining.
         */
        public Builder setHwv(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00010000;
          hwv_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Hardware version of the device (e.g., "5S" for iPhone 5S).
         * </pre>
         *
         * <code>optional string hwv = 24;</code>
         * @return This builder for chaining.
         */
        public Builder clearHwv() {
          bitField0_ = (bitField0_ & ~0x00010000);
          hwv_ = getDefaultInstance().getHwv();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Hardware version of the device (e.g., "5S" for iPhone 5S).
         * </pre>
         *
         * <code>optional string hwv = 24;</code>
         * @param value The bytes for hwv to set.
         * @return This builder for chaining.
         */
        public Builder setHwvBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00010000;
          hwv_ = value;
          onChanged();
          return this;
        }

        private int w_ ;
        /**
         * <pre>
         * Physical width of the screen in pixels.
         * </pre>
         *
         * <code>optional int32 w = 25;</code>
         * @return Whether the w field is set.
         */
        @java.lang.Override
        public boolean hasW() {
          return ((bitField0_ & 0x00020000) != 0);
        }
        /**
         * <pre>
         * Physical width of the screen in pixels.
         * </pre>
         *
         * <code>optional int32 w = 25;</code>
         * @return The w.
         */
        @java.lang.Override
        public int getW() {
          return w_;
        }
        /**
         * <pre>
         * Physical width of the screen in pixels.
         * </pre>
         *
         * <code>optional int32 w = 25;</code>
         * @param value The w to set.
         * @return This builder for chaining.
         */
        public Builder setW(int value) {
          bitField0_ |= 0x00020000;
          w_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Physical width of the screen in pixels.
         * </pre>
         *
         * <code>optional int32 w = 25;</code>
         * @return This builder for chaining.
         */
        public Builder clearW() {
          bitField0_ = (bitField0_ & ~0x00020000);
          w_ = 0;
          onChanged();
          return this;
        }

        private int h_ ;
        /**
         * <pre>
         * Physical height of the screen in pixels.
         * </pre>
         *
         * <code>optional int32 h = 26;</code>
         * @return Whether the h field is set.
         */
        @java.lang.Override
        public boolean hasH() {
          return ((bitField0_ & 0x00040000) != 0);
        }
        /**
         * <pre>
         * Physical height of the screen in pixels.
         * </pre>
         *
         * <code>optional int32 h = 26;</code>
         * @return The h.
         */
        @java.lang.Override
        public int getH() {
          return h_;
        }
        /**
         * <pre>
         * Physical height of the screen in pixels.
         * </pre>
         *
         * <code>optional int32 h = 26;</code>
         * @param value The h to set.
         * @return This builder for chaining.
         */
        public Builder setH(int value) {
          bitField0_ |= 0x00040000;
          h_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Physical height of the screen in pixels.
         * </pre>
         *
         * <code>optional int32 h = 26;</code>
         * @return This builder for chaining.
         */
        public Builder clearH() {
          bitField0_ = (bitField0_ & ~0x00040000);
          h_ = 0;
          onChanged();
          return this;
        }

        private int ppi_ ;
        /**
         * <pre>
         * Screen size as pixels per linear inch.
         * </pre>
         *
         * <code>optional int32 ppi = 27;</code>
         * @return Whether the ppi field is set.
         */
        @java.lang.Override
        public boolean hasPpi() {
          return ((bitField0_ & 0x00080000) != 0);
        }
        /**
         * <pre>
         * Screen size as pixels per linear inch.
         * </pre>
         *
         * <code>optional int32 ppi = 27;</code>
         * @return The ppi.
         */
        @java.lang.Override
        public int getPpi() {
          return ppi_;
        }
        /**
         * <pre>
         * Screen size as pixels per linear inch.
         * </pre>
         *
         * <code>optional int32 ppi = 27;</code>
         * @param value The ppi to set.
         * @return This builder for chaining.
         */
        public Builder setPpi(int value) {
          bitField0_ |= 0x00080000;
          ppi_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Screen size as pixels per linear inch.
         * </pre>
         *
         * <code>optional int32 ppi = 27;</code>
         * @return This builder for chaining.
         */
        public Builder clearPpi() {
          bitField0_ = (bitField0_ & ~0x00080000);
          ppi_ = 0;
          onChanged();
          return this;
        }

        private double pxratio_ ;
        /**
         * <pre>
         * The ratio of physical pixels to device independent pixels.
         * </pre>
         *
         * <code>optional double pxratio = 28;</code>
         * @return Whether the pxratio field is set.
         */
        @java.lang.Override
        public boolean hasPxratio() {
          return ((bitField0_ & 0x00100000) != 0);
        }
        /**
         * <pre>
         * The ratio of physical pixels to device independent pixels.
         * </pre>
         *
         * <code>optional double pxratio = 28;</code>
         * @return The pxratio.
         */
        @java.lang.Override
        public double getPxratio() {
          return pxratio_;
        }
        /**
         * <pre>
         * The ratio of physical pixels to device independent pixels.
         * </pre>
         *
         * <code>optional double pxratio = 28;</code>
         * @param value The pxratio to set.
         * @return This builder for chaining.
         */
        public Builder setPxratio(double value) {
          bitField0_ |= 0x00100000;
          pxratio_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * The ratio of physical pixels to device independent pixels.
         * </pre>
         *
         * <code>optional double pxratio = 28;</code>
         * @return This builder for chaining.
         */
        public Builder clearPxratio() {
          bitField0_ = (bitField0_ & ~0x00100000);
          pxratio_ = 0D;
          onChanged();
          return this;
        }

        private boolean js_ ;
        /**
         * <pre>
         * Support for JavaScript, where 0 = no, 1 = yes.
         * </pre>
         *
         * <code>optional bool js = 16;</code>
         * @return Whether the js field is set.
         */
        @java.lang.Override
        public boolean hasJs() {
          return ((bitField0_ & 0x00200000) != 0);
        }
        /**
         * <pre>
         * Support for JavaScript, where 0 = no, 1 = yes.
         * </pre>
         *
         * <code>optional bool js = 16;</code>
         * @return The js.
         */
        @java.lang.Override
        public boolean getJs() {
          return js_;
        }
        /**
         * <pre>
         * Support for JavaScript, where 0 = no, 1 = yes.
         * </pre>
         *
         * <code>optional bool js = 16;</code>
         * @param value The js to set.
         * @return This builder for chaining.
         */
        public Builder setJs(boolean value) {
          bitField0_ |= 0x00200000;
          js_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Support for JavaScript, where 0 = no, 1 = yes.
         * </pre>
         *
         * <code>optional bool js = 16;</code>
         * @return This builder for chaining.
         */
        public Builder clearJs() {
          bitField0_ = (bitField0_ & ~0x00200000);
          js_ = false;
          onChanged();
          return this;
        }

        private boolean geofetch_ ;
        /**
         * <pre>
         * Indicates if the geolocation API will be available to JavaScript
         * code running in the banner, where 0 = no, 1 = yes.
         * </pre>
         *
         * <code>optional bool geofetch = 29;</code>
         * @return Whether the geofetch field is set.
         */
        @java.lang.Override
        public boolean hasGeofetch() {
          return ((bitField0_ & 0x00400000) != 0);
        }
        /**
         * <pre>
         * Indicates if the geolocation API will be available to JavaScript
         * code running in the banner, where 0 = no, 1 = yes.
         * </pre>
         *
         * <code>optional bool geofetch = 29;</code>
         * @return The geofetch.
         */
        @java.lang.Override
        public boolean getGeofetch() {
          return geofetch_;
        }
        /**
         * <pre>
         * Indicates if the geolocation API will be available to JavaScript
         * code running in the banner, where 0 = no, 1 = yes.
         * </pre>
         *
         * <code>optional bool geofetch = 29;</code>
         * @param value The geofetch to set.
         * @return This builder for chaining.
         */
        public Builder setGeofetch(boolean value) {
          bitField0_ |= 0x00400000;
          geofetch_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Indicates if the geolocation API will be available to JavaScript
         * code running in the banner, where 0 = no, 1 = yes.
         * </pre>
         *
         * <code>optional bool geofetch = 29;</code>
         * @return This builder for chaining.
         */
        public Builder clearGeofetch() {
          bitField0_ = (bitField0_ & ~0x00400000);
          geofetch_ = false;
          onChanged();
          return this;
        }

        private int connectiontype_ ;
        /**
         * <pre>
         * Network connection type.
         * Refer to enum com.iabtechlab.adcom.v1.enums.ConnectionType for generic values.
         * </pre>
         *
         * <code>optional int32 connectiontype = 17;</code>
         * @return Whether the connectiontype field is set.
         */
        @java.lang.Override
        public boolean hasConnectiontype() {
          return ((bitField0_ & 0x00800000) != 0);
        }
        /**
         * <pre>
         * Network connection type.
         * Refer to enum com.iabtechlab.adcom.v1.enums.ConnectionType for generic values.
         * </pre>
         *
         * <code>optional int32 connectiontype = 17;</code>
         * @return The connectiontype.
         */
        @java.lang.Override
        public int getConnectiontype() {
          return connectiontype_;
        }
        /**
         * <pre>
         * Network connection type.
         * Refer to enum com.iabtechlab.adcom.v1.enums.ConnectionType for generic values.
         * </pre>
         *
         * <code>optional int32 connectiontype = 17;</code>
         * @param value The connectiontype to set.
         * @return This builder for chaining.
         */
        public Builder setConnectiontype(int value) {
          bitField0_ |= 0x00800000;
          connectiontype_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Network connection type.
         * Refer to enum com.iabtechlab.adcom.v1.enums.ConnectionType for generic values.
         * </pre>
         *
         * <code>optional int32 connectiontype = 17;</code>
         * @return This builder for chaining.
         */
        public Builder clearConnectiontype() {
          bitField0_ = (bitField0_ & ~0x00800000);
          connectiontype_ = 0;
          onChanged();
          return this;
        }

        private int devicetype_ ;
        /**
         * <pre>
         * The general type of device.
         * Refer to enum com.iabtechlab.adcom.v1.enums.DeviceType for generic values.
         * </pre>
         *
         * <code>optional int32 devicetype = 18;</code>
         * @return Whether the devicetype field is set.
         */
        @java.lang.Override
        public boolean hasDevicetype() {
          return ((bitField0_ & 0x01000000) != 0);
        }
        /**
         * <pre>
         * The general type of device.
         * Refer to enum com.iabtechlab.adcom.v1.enums.DeviceType for generic values.
         * </pre>
         *
         * <code>optional int32 devicetype = 18;</code>
         * @return The devicetype.
         */
        @java.lang.Override
        public int getDevicetype() {
          return devicetype_;
        }
        /**
         * <pre>
         * The general type of device.
         * Refer to enum com.iabtechlab.adcom.v1.enums.DeviceType for generic values.
         * </pre>
         *
         * <code>optional int32 devicetype = 18;</code>
         * @param value The devicetype to set.
         * @return This builder for chaining.
         */
        public Builder setDevicetype(int value) {
          bitField0_ |= 0x01000000;
          devicetype_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * The general type of device.
         * Refer to enum com.iabtechlab.adcom.v1.enums.DeviceType for generic values.
         * </pre>
         *
         * <code>optional int32 devicetype = 18;</code>
         * @return This builder for chaining.
         */
        public Builder clearDevicetype() {
          bitField0_ = (bitField0_ & ~0x01000000);
          devicetype_ = 0;
          onChanged();
          return this;
        }

        private java.lang.Object flashver_ = "";
        /**
         * <pre>
         * Version of Flash supported by the browser.
         * </pre>
         *
         * <code>optional string flashver = 19;</code>
         * @return Whether the flashver field is set.
         */
        public boolean hasFlashver() {
          return ((bitField0_ & 0x02000000) != 0);
        }
        /**
         * <pre>
         * Version of Flash supported by the browser.
         * </pre>
         *
         * <code>optional string flashver = 19;</code>
         * @return The flashver.
         */
        public java.lang.String getFlashver() {
          java.lang.Object ref = flashver_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              flashver_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Version of Flash supported by the browser.
         * </pre>
         *
         * <code>optional string flashver = 19;</code>
         * @return The bytes for flashver.
         */
        public com.google.protobuf.ByteString
            getFlashverBytes() {
          java.lang.Object ref = flashver_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            flashver_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Version of Flash supported by the browser.
         * </pre>
         *
         * <code>optional string flashver = 19;</code>
         * @param value The flashver to set.
         * @return This builder for chaining.
         */
        public Builder setFlashver(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x02000000;
          flashver_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Version of Flash supported by the browser.
         * </pre>
         *
         * <code>optional string flashver = 19;</code>
         * @return This builder for chaining.
         */
        public Builder clearFlashver() {
          bitField0_ = (bitField0_ & ~0x02000000);
          flashver_ = getDefaultInstance().getFlashver();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Version of Flash supported by the browser.
         * </pre>
         *
         * <code>optional string flashver = 19;</code>
         * @param value The bytes for flashver to set.
         * @return This builder for chaining.
         */
        public Builder setFlashverBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x02000000;
          flashver_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object ifa_ = "";
        /**
         * <pre>
         * ID sanctioned for advertiser use in the clear (i.e., not hashed).
         * </pre>
         *
         * <code>optional string ifa = 20;</code>
         * @return Whether the ifa field is set.
         */
        public boolean hasIfa() {
          return ((bitField0_ & 0x04000000) != 0);
        }
        /**
         * <pre>
         * ID sanctioned for advertiser use in the clear (i.e., not hashed).
         * </pre>
         *
         * <code>optional string ifa = 20;</code>
         * @return The ifa.
         */
        public java.lang.String getIfa() {
          java.lang.Object ref = ifa_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              ifa_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * ID sanctioned for advertiser use in the clear (i.e., not hashed).
         * </pre>
         *
         * <code>optional string ifa = 20;</code>
         * @return The bytes for ifa.
         */
        public com.google.protobuf.ByteString
            getIfaBytes() {
          java.lang.Object ref = ifa_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            ifa_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * ID sanctioned for advertiser use in the clear (i.e., not hashed).
         * </pre>
         *
         * <code>optional string ifa = 20;</code>
         * @param value The ifa to set.
         * @return This builder for chaining.
         */
        public Builder setIfa(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x04000000;
          ifa_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * ID sanctioned for advertiser use in the clear (i.e., not hashed).
         * </pre>
         *
         * <code>optional string ifa = 20;</code>
         * @return This builder for chaining.
         */
        public Builder clearIfa() {
          bitField0_ = (bitField0_ & ~0x04000000);
          ifa_ = getDefaultInstance().getIfa();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * ID sanctioned for advertiser use in the clear (i.e., not hashed).
         * </pre>
         *
         * <code>optional string ifa = 20;</code>
         * @param value The bytes for ifa to set.
         * @return This builder for chaining.
         */
        public Builder setIfaBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x04000000;
          ifa_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object macsha1_ = "";
        /**
         * <pre>
         * MAC address of the device; hashed via SHA1.
         * </pre>
         *
         * <code>optional string macsha1 = 21;</code>
         * @return Whether the macsha1 field is set.
         */
        public boolean hasMacsha1() {
          return ((bitField0_ & 0x08000000) != 0);
        }
        /**
         * <pre>
         * MAC address of the device; hashed via SHA1.
         * </pre>
         *
         * <code>optional string macsha1 = 21;</code>
         * @return The macsha1.
         */
        public java.lang.String getMacsha1() {
          java.lang.Object ref = macsha1_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              macsha1_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * MAC address of the device; hashed via SHA1.
         * </pre>
         *
         * <code>optional string macsha1 = 21;</code>
         * @return The bytes for macsha1.
         */
        public com.google.protobuf.ByteString
            getMacsha1Bytes() {
          java.lang.Object ref = macsha1_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            macsha1_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * MAC address of the device; hashed via SHA1.
         * </pre>
         *
         * <code>optional string macsha1 = 21;</code>
         * @param value The macsha1 to set.
         * @return This builder for chaining.
         */
        public Builder setMacsha1(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x08000000;
          macsha1_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * MAC address of the device; hashed via SHA1.
         * </pre>
         *
         * <code>optional string macsha1 = 21;</code>
         * @return This builder for chaining.
         */
        public Builder clearMacsha1() {
          bitField0_ = (bitField0_ & ~0x08000000);
          macsha1_ = getDefaultInstance().getMacsha1();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * MAC address of the device; hashed via SHA1.
         * </pre>
         *
         * <code>optional string macsha1 = 21;</code>
         * @param value The bytes for macsha1 to set.
         * @return This builder for chaining.
         */
        public Builder setMacsha1Bytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x08000000;
          macsha1_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object macmd5_ = "";
        /**
         * <pre>
         * MAC address of the device; hashed via MD5.
         * </pre>
         *
         * <code>optional string macmd5 = 22;</code>
         * @return Whether the macmd5 field is set.
         */
        public boolean hasMacmd5() {
          return ((bitField0_ & 0x10000000) != 0);
        }
        /**
         * <pre>
         * MAC address of the device; hashed via MD5.
         * </pre>
         *
         * <code>optional string macmd5 = 22;</code>
         * @return The macmd5.
         */
        public java.lang.String getMacmd5() {
          java.lang.Object ref = macmd5_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              macmd5_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * MAC address of the device; hashed via MD5.
         * </pre>
         *
         * <code>optional string macmd5 = 22;</code>
         * @return The bytes for macmd5.
         */
        public com.google.protobuf.ByteString
            getMacmd5Bytes() {
          java.lang.Object ref = macmd5_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            macmd5_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * MAC address of the device; hashed via MD5.
         * </pre>
         *
         * <code>optional string macmd5 = 22;</code>
         * @param value The macmd5 to set.
         * @return This builder for chaining.
         */
        public Builder setMacmd5(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x10000000;
          macmd5_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * MAC address of the device; hashed via MD5.
         * </pre>
         *
         * <code>optional string macmd5 = 22;</code>
         * @return This builder for chaining.
         */
        public Builder clearMacmd5() {
          bitField0_ = (bitField0_ & ~0x10000000);
          macmd5_ = getDefaultInstance().getMacmd5();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * MAC address of the device; hashed via MD5.
         * </pre>
         *
         * <code>optional string macmd5 = 22;</code>
         * @param value The bytes for macmd5 to set.
         * @return This builder for chaining.
         */
        public Builder setMacmd5Bytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x10000000;
          macmd5_ = value;
          onChanged();
          return this;
        }

        private boolean lmt_ ;
        /**
         * <pre>
         * "Limit Ad Tracking" signal commercially endorsed (e.g., iOS, Android),
         * where 0 = tracking is unrestricted, 1 = tracking must be limited per
         * commercial guidelines.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional bool lmt = 23;</code>
         * @return Whether the lmt field is set.
         */
        @java.lang.Override
        public boolean hasLmt() {
          return ((bitField0_ & 0x20000000) != 0);
        }
        /**
         * <pre>
         * "Limit Ad Tracking" signal commercially endorsed (e.g., iOS, Android),
         * where 0 = tracking is unrestricted, 1 = tracking must be limited per
         * commercial guidelines.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional bool lmt = 23;</code>
         * @return The lmt.
         */
        @java.lang.Override
        public boolean getLmt() {
          return lmt_;
        }
        /**
         * <pre>
         * "Limit Ad Tracking" signal commercially endorsed (e.g., iOS, Android),
         * where 0 = tracking is unrestricted, 1 = tracking must be limited per
         * commercial guidelines.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional bool lmt = 23;</code>
         * @param value The lmt to set.
         * @return This builder for chaining.
         */
        public Builder setLmt(boolean value) {
          bitField0_ |= 0x20000000;
          lmt_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * "Limit Ad Tracking" signal commercially endorsed (e.g., iOS, Android),
         * where 0 = tracking is unrestricted, 1 = tracking must be limited per
         * commercial guidelines.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional bool lmt = 23;</code>
         * @return This builder for chaining.
         */
        public Builder clearLmt() {
          bitField0_ = (bitField0_ & ~0x20000000);
          lmt_ = false;
          onChanged();
          return this;
        }

        private java.lang.Object mccmnc_ = "";
        /**
         * <pre>
         * Mobile carrier as the concatenated MCC-MNC code (e.g.,
         * "310-005" identifies Verizon Wireless CDMA in the USA).
         * Refer to https://en.wikipedia.org/wiki/Mobile_country_code
         * for further examples. Note that the dash between the MCC
         * and MNC parts is required to remove parsing ambiguity.
         * </pre>
         *
         * <code>optional string mccmnc = 30;</code>
         * @return Whether the mccmnc field is set.
         */
        public boolean hasMccmnc() {
          return ((bitField0_ & 0x40000000) != 0);
        }
        /**
         * <pre>
         * Mobile carrier as the concatenated MCC-MNC code (e.g.,
         * "310-005" identifies Verizon Wireless CDMA in the USA).
         * Refer to https://en.wikipedia.org/wiki/Mobile_country_code
         * for further examples. Note that the dash between the MCC
         * and MNC parts is required to remove parsing ambiguity.
         * </pre>
         *
         * <code>optional string mccmnc = 30;</code>
         * @return The mccmnc.
         */
        public java.lang.String getMccmnc() {
          java.lang.Object ref = mccmnc_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              mccmnc_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Mobile carrier as the concatenated MCC-MNC code (e.g.,
         * "310-005" identifies Verizon Wireless CDMA in the USA).
         * Refer to https://en.wikipedia.org/wiki/Mobile_country_code
         * for further examples. Note that the dash between the MCC
         * and MNC parts is required to remove parsing ambiguity.
         * </pre>
         *
         * <code>optional string mccmnc = 30;</code>
         * @return The bytes for mccmnc.
         */
        public com.google.protobuf.ByteString
            getMccmncBytes() {
          java.lang.Object ref = mccmnc_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            mccmnc_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Mobile carrier as the concatenated MCC-MNC code (e.g.,
         * "310-005" identifies Verizon Wireless CDMA in the USA).
         * Refer to https://en.wikipedia.org/wiki/Mobile_country_code
         * for further examples. Note that the dash between the MCC
         * and MNC parts is required to remove parsing ambiguity.
         * </pre>
         *
         * <code>optional string mccmnc = 30;</code>
         * @param value The mccmnc to set.
         * @return This builder for chaining.
         */
        public Builder setMccmnc(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x40000000;
          mccmnc_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Mobile carrier as the concatenated MCC-MNC code (e.g.,
         * "310-005" identifies Verizon Wireless CDMA in the USA).
         * Refer to https://en.wikipedia.org/wiki/Mobile_country_code
         * for further examples. Note that the dash between the MCC
         * and MNC parts is required to remove parsing ambiguity.
         * </pre>
         *
         * <code>optional string mccmnc = 30;</code>
         * @return This builder for chaining.
         */
        public Builder clearMccmnc() {
          bitField0_ = (bitField0_ & ~0x40000000);
          mccmnc_ = getDefaultInstance().getMccmnc();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Mobile carrier as the concatenated MCC-MNC code (e.g.,
         * "310-005" identifies Verizon Wireless CDMA in the USA).
         * Refer to https://en.wikipedia.org/wiki/Mobile_country_code
         * for further examples. Note that the dash between the MCC
         * and MNC parts is required to remove parsing ambiguity.
         * </pre>
         *
         * <code>optional string mccmnc = 30;</code>
         * @param value The bytes for mccmnc to set.
         * @return This builder for chaining.
         */
        public Builder setMccmncBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x40000000;
          mccmnc_ = value;
          onChanged();
          return this;
        }

        private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent sua_;
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgentOrBuilder> suaBuilder_;
        /**
         * <pre>
         * Structured user agent information defined by a UserAgent object (Section 3.2.29)
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.UserAgent sua = 31;</code>
         * @return Whether the sua field is set.
         */
        public boolean hasSua() {
          return ((bitField0_ & 0x80000000) != 0);
        }
        /**
         * <pre>
         * Structured user agent information defined by a UserAgent object (Section 3.2.29)
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.UserAgent sua = 31;</code>
         * @return The sua.
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent getSua() {
          if (suaBuilder_ == null) {
            return sua_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent.getDefaultInstance() : sua_;
          } else {
            return suaBuilder_.getMessage();
          }
        }
        /**
         * <pre>
         * Structured user agent information defined by a UserAgent object (Section 3.2.29)
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.UserAgent sua = 31;</code>
         */
        public Builder setSua(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent value) {
          if (suaBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            sua_ = value;
            onChanged();
          } else {
            suaBuilder_.setMessage(value);
          }
          bitField0_ |= 0x80000000;
          return this;
        }
        /**
         * <pre>
         * Structured user agent information defined by a UserAgent object (Section 3.2.29)
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.UserAgent sua = 31;</code>
         */
        public Builder setSua(
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent.Builder builderForValue) {
          if (suaBuilder_ == null) {
            sua_ = builderForValue.build();
            onChanged();
          } else {
            suaBuilder_.setMessage(builderForValue.build());
          }
          bitField0_ |= 0x80000000;
          return this;
        }
        /**
         * <pre>
         * Structured user agent information defined by a UserAgent object (Section 3.2.29)
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.UserAgent sua = 31;</code>
         */
        public Builder mergeSua(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent value) {
          if (suaBuilder_ == null) {
            if (((bitField0_ & 0x80000000) != 0) &&
                sua_ != null &&
                sua_ != com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent.getDefaultInstance()) {
              sua_ =
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent.newBuilder(sua_).mergeFrom(value).buildPartial();
            } else {
              sua_ = value;
            }
            onChanged();
          } else {
            suaBuilder_.mergeFrom(value);
          }
          bitField0_ |= 0x80000000;
          return this;
        }
        /**
         * <pre>
         * Structured user agent information defined by a UserAgent object (Section 3.2.29)
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.UserAgent sua = 31;</code>
         */
        public Builder clearSua() {
          if (suaBuilder_ == null) {
            sua_ = null;
            onChanged();
          } else {
            suaBuilder_.clear();
          }
          bitField0_ = (bitField0_ & ~0x80000000);
          return this;
        }
        /**
         * <pre>
         * Structured user agent information defined by a UserAgent object (Section 3.2.29)
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.UserAgent sua = 31;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent.Builder getSuaBuilder() {
          bitField0_ |= 0x80000000;
          onChanged();
          return getSuaFieldBuilder().getBuilder();
        }
        /**
         * <pre>
         * Structured user agent information defined by a UserAgent object (Section 3.2.29)
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.UserAgent sua = 31;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgentOrBuilder getSuaOrBuilder() {
          if (suaBuilder_ != null) {
            return suaBuilder_.getMessageOrBuilder();
          } else {
            return sua_ == null ?
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent.getDefaultInstance() : sua_;
          }
        }
        /**
         * <pre>
         * Structured user agent information defined by a UserAgent object (Section 3.2.29)
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.UserAgent sua = 31;</code>
         */
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgentOrBuilder> 
            getSuaFieldBuilder() {
          if (suaBuilder_ == null) {
            suaBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgentOrBuilder>(
                    getSua(),
                    getParentForChildren(),
                    isClean());
            sua_ = null;
          }
          return suaBuilder_;
        }
        @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:com.iabtechlab.openrtb.v2.BidRequest.Device)
      }

      // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.BidRequest.Device)
      private static final com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device DEFAULT_INSTANCE;
      static {
        DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device();
      }

      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device getDefaultInstance() {
        return DEFAULT_INSTANCE;
      }

      @java.lang.Deprecated public static final com.google.protobuf.Parser<Device>
          PARSER = new com.google.protobuf.AbstractParser<Device>() {
        @java.lang.Override
        public Device parsePartialFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return new Device(input, extensionRegistry);
        }
      };

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

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

      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device getDefaultInstanceForType() {
        return DEFAULT_INSTANCE;
      }

    }

    public interface GeoOrBuilder extends
        // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.BidRequest.Geo)
        com.google.protobuf.GeneratedMessageV3.
            ExtendableMessageOrBuilder<Geo> {

      /**
       * <pre>
       * Latitude from -90.0 to +90.0, where negative is south.
       * </pre>
       *
       * <code>optional double lat = 1;</code>
       * @return Whether the lat field is set.
       */
      boolean hasLat();
      /**
       * <pre>
       * Latitude from -90.0 to +90.0, where negative is south.
       * </pre>
       *
       * <code>optional double lat = 1;</code>
       * @return The lat.
       */
      double getLat();

      /**
       * <pre>
       * Longitude from -180.0 to +180.0, where negative is west.
       * </pre>
       *
       * <code>optional double lon = 2;</code>
       * @return Whether the lon field is set.
       */
      boolean hasLon();
      /**
       * <pre>
       * Longitude from -180.0 to +180.0, where negative is west.
       * </pre>
       *
       * <code>optional double lon = 2;</code>
       * @return The lon.
       */
      double getLon();

      /**
       * <pre>
       * Country using ISO-3166-1 Alpha-3.
       * </pre>
       *
       * <code>optional string country = 3;</code>
       * @return Whether the country field is set.
       */
      boolean hasCountry();
      /**
       * <pre>
       * Country using ISO-3166-1 Alpha-3.
       * </pre>
       *
       * <code>optional string country = 3;</code>
       * @return The country.
       */
      java.lang.String getCountry();
      /**
       * <pre>
       * Country using ISO-3166-1 Alpha-3.
       * </pre>
       *
       * <code>optional string country = 3;</code>
       * @return The bytes for country.
       */
      com.google.protobuf.ByteString
          getCountryBytes();

      /**
       * <pre>
       * Region code using ISO-3166-2; 2-letter state code if USA.
       * </pre>
       *
       * <code>optional string region = 4;</code>
       * @return Whether the region field is set.
       */
      boolean hasRegion();
      /**
       * <pre>
       * Region code using ISO-3166-2; 2-letter state code if USA.
       * </pre>
       *
       * <code>optional string region = 4;</code>
       * @return The region.
       */
      java.lang.String getRegion();
      /**
       * <pre>
       * Region code using ISO-3166-2; 2-letter state code if USA.
       * </pre>
       *
       * <code>optional string region = 4;</code>
       * @return The bytes for region.
       */
      com.google.protobuf.ByteString
          getRegionBytes();

      /**
       * <pre>
       * Region of a country using FIPS 10-4 notation. While OpenRTB supports
       * this attribute, it has been withdrawn by NIST in 2008.
       * </pre>
       *
       * <code>optional string regionfips104 = 5;</code>
       * @return Whether the regionfips104 field is set.
       */
      boolean hasRegionfips104();
      /**
       * <pre>
       * Region of a country using FIPS 10-4 notation. While OpenRTB supports
       * this attribute, it has been withdrawn by NIST in 2008.
       * </pre>
       *
       * <code>optional string regionfips104 = 5;</code>
       * @return The regionfips104.
       */
      java.lang.String getRegionfips104();
      /**
       * <pre>
       * Region of a country using FIPS 10-4 notation. While OpenRTB supports
       * this attribute, it has been withdrawn by NIST in 2008.
       * </pre>
       *
       * <code>optional string regionfips104 = 5;</code>
       * @return The bytes for regionfips104.
       */
      com.google.protobuf.ByteString
          getRegionfips104Bytes();

      /**
       * <pre>
       * Google metro code; similar to but not exactly Nielsen DMAs.
       * See Appendix A for a link to the codes.
       * (http://code.google.com/apis/adwords/docs/appendix/metrocodes.html).
       * </pre>
       *
       * <code>optional string metro = 6;</code>
       * @return Whether the metro field is set.
       */
      boolean hasMetro();
      /**
       * <pre>
       * Google metro code; similar to but not exactly Nielsen DMAs.
       * See Appendix A for a link to the codes.
       * (http://code.google.com/apis/adwords/docs/appendix/metrocodes.html).
       * </pre>
       *
       * <code>optional string metro = 6;</code>
       * @return The metro.
       */
      java.lang.String getMetro();
      /**
       * <pre>
       * Google metro code; similar to but not exactly Nielsen DMAs.
       * See Appendix A for a link to the codes.
       * (http://code.google.com/apis/adwords/docs/appendix/metrocodes.html).
       * </pre>
       *
       * <code>optional string metro = 6;</code>
       * @return The bytes for metro.
       */
      com.google.protobuf.ByteString
          getMetroBytes();

      /**
       * <pre>
       * City using United Nations Code for Trade &amp; Transport Locations.
       * See Appendix A for a link to the codes.
       * (http://www.unece.org/cefact/locode/service/location.htm).
       * </pre>
       *
       * <code>optional string city = 7;</code>
       * @return Whether the city field is set.
       */
      boolean hasCity();
      /**
       * <pre>
       * City using United Nations Code for Trade &amp; Transport Locations.
       * See Appendix A for a link to the codes.
       * (http://www.unece.org/cefact/locode/service/location.htm).
       * </pre>
       *
       * <code>optional string city = 7;</code>
       * @return The city.
       */
      java.lang.String getCity();
      /**
       * <pre>
       * City using United Nations Code for Trade &amp; Transport Locations.
       * See Appendix A for a link to the codes.
       * (http://www.unece.org/cefact/locode/service/location.htm).
       * </pre>
       *
       * <code>optional string city = 7;</code>
       * @return The bytes for city.
       */
      com.google.protobuf.ByteString
          getCityBytes();

      /**
       * <pre>
       * Zip/postal code.
       * </pre>
       *
       * <code>optional string zip = 8;</code>
       * @return Whether the zip field is set.
       */
      boolean hasZip();
      /**
       * <pre>
       * Zip/postal code.
       * </pre>
       *
       * <code>optional string zip = 8;</code>
       * @return The zip.
       */
      java.lang.String getZip();
      /**
       * <pre>
       * Zip/postal code.
       * </pre>
       *
       * <code>optional string zip = 8;</code>
       * @return The bytes for zip.
       */
      com.google.protobuf.ByteString
          getZipBytes();

      /**
       * <pre>
       * Source of location data; recommended when passing lat/lon.
       * Refer to enum com.iabtechlab.adcom.v1.enums.LocationType for generic values.
       * </pre>
       *
       * <code>optional int32 type = 9;</code>
       * @return Whether the type field is set.
       */
      boolean hasType();
      /**
       * <pre>
       * Source of location data; recommended when passing lat/lon.
       * Refer to enum com.iabtechlab.adcom.v1.enums.LocationType for generic values.
       * </pre>
       *
       * <code>optional int32 type = 9;</code>
       * @return The type.
       */
      int getType();

      /**
       * <pre>
       * Estimated location accuracy in meters; recommended when lat/lon
       * are specified and derived from a device's location services
       * (i.e., type = 1). Note that this is the accuracy as reported
       * from the device. Consult OS specific documentation
       * (e.g., Android, iOS) for exact interpretation.
       * </pre>
       *
       * <code>optional int32 accuracy = 11;</code>
       * @return Whether the accuracy field is set.
       */
      boolean hasAccuracy();
      /**
       * <pre>
       * Estimated location accuracy in meters; recommended when lat/lon
       * are specified and derived from a device's location services
       * (i.e., type = 1). Note that this is the accuracy as reported
       * from the device. Consult OS specific documentation
       * (e.g., Android, iOS) for exact interpretation.
       * </pre>
       *
       * <code>optional int32 accuracy = 11;</code>
       * @return The accuracy.
       */
      int getAccuracy();

      /**
       * <pre>
       * Number of seconds since this geolocation fix was established.
       * Note that devices may cache location data across multiple fetches.
       * Ideally, this value should be from the time the actual fix was taken.
       * </pre>
       *
       * <code>optional int32 lastfix = 12;</code>
       * @return Whether the lastfix field is set.
       */
      boolean hasLastfix();
      /**
       * <pre>
       * Number of seconds since this geolocation fix was established.
       * Note that devices may cache location data across multiple fetches.
       * Ideally, this value should be from the time the actual fix was taken.
       * </pre>
       *
       * <code>optional int32 lastfix = 12;</code>
       * @return The lastfix.
       */
      int getLastfix();

      /**
       * <pre>
       * Service or provider used to determine geolocation from IP
       * address if applicable (i.e., type = 2).
       * Refer to enum com.iabtechlab.adcom.v1.enums.LocationService for generic values.
       * </pre>
       *
       * <code>optional int32 ipservice = 13;</code>
       * @return Whether the ipservice field is set.
       */
      boolean hasIpservice();
      /**
       * <pre>
       * Service or provider used to determine geolocation from IP
       * address if applicable (i.e., type = 2).
       * Refer to enum com.iabtechlab.adcom.v1.enums.LocationService for generic values.
       * </pre>
       *
       * <code>optional int32 ipservice = 13;</code>
       * @return The ipservice.
       */
      int getIpservice();

      /**
       * <pre>
       * Local time as the number +/- of minutes from UTC.
       * </pre>
       *
       * <code>optional int32 utcoffset = 10;</code>
       * @return Whether the utcoffset field is set.
       */
      boolean hasUtcoffset();
      /**
       * <pre>
       * Local time as the number +/- of minutes from UTC.
       * </pre>
       *
       * <code>optional int32 utcoffset = 10;</code>
       * @return The utcoffset.
       */
      int getUtcoffset();
    }
    /**
     * <pre>
     * OpenRTB 2.0: This object encapsulates various methods for specifying a
     * geographic location. When subordinate to a Device object, it indicates the
     * location of the device which can also be interpreted as the user's current
     * location. When subordinate to a User object, it indicates the location of
     * the user's home base (i.e., not necessarily their current location).
     * The lat/lon attributes should only be passed if they conform to the
     * accuracy depicted in the type attribute. For example, the centroid of a
     * geographic region such as postal code should not be passed.
     * </pre>
     *
     * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Geo}
     */
    public static final class Geo extends
        com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
          Geo> implements
        // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.BidRequest.Geo)
        GeoOrBuilder {
    private static final long serialVersionUID = 0L;
      // Use Geo.newBuilder() to construct.
      private Geo(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo, ?> builder) {
        super(builder);
      }
      private Geo() {
        country_ = "";
        region_ = "";
        regionfips104_ = "";
        metro_ = "";
        city_ = "";
        zip_ = "";
      }

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

      @java.lang.Override
      public final com.google.protobuf.UnknownFieldSet
      getUnknownFields() {
        return this.unknownFields;
      }
      private Geo(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        this();
        if (extensionRegistry == null) {
          throw new java.lang.NullPointerException();
        }
        int mutable_bitField0_ = 0;
        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
            com.google.protobuf.UnknownFieldSet.newBuilder();
        try {
          boolean done = false;
          while (!done) {
            int tag = input.readTag();
            switch (tag) {
              case 0:
                done = true;
                break;
              case 9: {
                bitField0_ |= 0x00000001;
                lat_ = input.readDouble();
                break;
              }
              case 17: {
                bitField0_ |= 0x00000002;
                lon_ = input.readDouble();
                break;
              }
              case 26: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000004;
                country_ = bs;
                break;
              }
              case 34: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000008;
                region_ = bs;
                break;
              }
              case 42: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000010;
                regionfips104_ = bs;
                break;
              }
              case 50: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000020;
                metro_ = bs;
                break;
              }
              case 58: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000040;
                city_ = bs;
                break;
              }
              case 66: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000080;
                zip_ = bs;
                break;
              }
              case 72: {
                bitField0_ |= 0x00000100;
                type_ = input.readInt32();
                break;
              }
              case 80: {
                bitField0_ |= 0x00001000;
                utcoffset_ = input.readInt32();
                break;
              }
              case 88: {
                bitField0_ |= 0x00000200;
                accuracy_ = input.readInt32();
                break;
              }
              case 96: {
                bitField0_ |= 0x00000400;
                lastfix_ = input.readInt32();
                break;
              }
              case 104: {
                bitField0_ |= 0x00000800;
                ipservice_ = input.readInt32();
                break;
              }
              default: {
                if (!parseUnknownField(
                    input, unknownFields, extensionRegistry, tag)) {
                  done = true;
                }
                break;
              }
            }
          }
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          throw e.setUnfinishedMessage(this);
        } catch (java.io.IOException e) {
          throw new com.google.protobuf.InvalidProtocolBufferException(
              e).setUnfinishedMessage(this);
        } finally {
          this.unknownFields = unknownFields.build();
          makeExtensionsImmutable();
        }
      }
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Geo_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Geo_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo.Builder.class);
      }

      private int bitField0_;
      public static final int LAT_FIELD_NUMBER = 1;
      private double lat_;
      /**
       * <pre>
       * Latitude from -90.0 to +90.0, where negative is south.
       * </pre>
       *
       * <code>optional double lat = 1;</code>
       * @return Whether the lat field is set.
       */
      @java.lang.Override
      public boolean hasLat() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <pre>
       * Latitude from -90.0 to +90.0, where negative is south.
       * </pre>
       *
       * <code>optional double lat = 1;</code>
       * @return The lat.
       */
      @java.lang.Override
      public double getLat() {
        return lat_;
      }

      public static final int LON_FIELD_NUMBER = 2;
      private double lon_;
      /**
       * <pre>
       * Longitude from -180.0 to +180.0, where negative is west.
       * </pre>
       *
       * <code>optional double lon = 2;</code>
       * @return Whether the lon field is set.
       */
      @java.lang.Override
      public boolean hasLon() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <pre>
       * Longitude from -180.0 to +180.0, where negative is west.
       * </pre>
       *
       * <code>optional double lon = 2;</code>
       * @return The lon.
       */
      @java.lang.Override
      public double getLon() {
        return lon_;
      }

      public static final int COUNTRY_FIELD_NUMBER = 3;
      private volatile java.lang.Object country_;
      /**
       * <pre>
       * Country using ISO-3166-1 Alpha-3.
       * </pre>
       *
       * <code>optional string country = 3;</code>
       * @return Whether the country field is set.
       */
      @java.lang.Override
      public boolean hasCountry() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <pre>
       * Country using ISO-3166-1 Alpha-3.
       * </pre>
       *
       * <code>optional string country = 3;</code>
       * @return The country.
       */
      @java.lang.Override
      public java.lang.String getCountry() {
        java.lang.Object ref = country_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            country_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Country using ISO-3166-1 Alpha-3.
       * </pre>
       *
       * <code>optional string country = 3;</code>
       * @return The bytes for country.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getCountryBytes() {
        java.lang.Object ref = country_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          country_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int REGION_FIELD_NUMBER = 4;
      private volatile java.lang.Object region_;
      /**
       * <pre>
       * Region code using ISO-3166-2; 2-letter state code if USA.
       * </pre>
       *
       * <code>optional string region = 4;</code>
       * @return Whether the region field is set.
       */
      @java.lang.Override
      public boolean hasRegion() {
        return ((bitField0_ & 0x00000008) != 0);
      }
      /**
       * <pre>
       * Region code using ISO-3166-2; 2-letter state code if USA.
       * </pre>
       *
       * <code>optional string region = 4;</code>
       * @return The region.
       */
      @java.lang.Override
      public java.lang.String getRegion() {
        java.lang.Object ref = region_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            region_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Region code using ISO-3166-2; 2-letter state code if USA.
       * </pre>
       *
       * <code>optional string region = 4;</code>
       * @return The bytes for region.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getRegionBytes() {
        java.lang.Object ref = region_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          region_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int REGIONFIPS104_FIELD_NUMBER = 5;
      private volatile java.lang.Object regionfips104_;
      /**
       * <pre>
       * Region of a country using FIPS 10-4 notation. While OpenRTB supports
       * this attribute, it has been withdrawn by NIST in 2008.
       * </pre>
       *
       * <code>optional string regionfips104 = 5;</code>
       * @return Whether the regionfips104 field is set.
       */
      @java.lang.Override
      public boolean hasRegionfips104() {
        return ((bitField0_ & 0x00000010) != 0);
      }
      /**
       * <pre>
       * Region of a country using FIPS 10-4 notation. While OpenRTB supports
       * this attribute, it has been withdrawn by NIST in 2008.
       * </pre>
       *
       * <code>optional string regionfips104 = 5;</code>
       * @return The regionfips104.
       */
      @java.lang.Override
      public java.lang.String getRegionfips104() {
        java.lang.Object ref = regionfips104_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            regionfips104_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Region of a country using FIPS 10-4 notation. While OpenRTB supports
       * this attribute, it has been withdrawn by NIST in 2008.
       * </pre>
       *
       * <code>optional string regionfips104 = 5;</code>
       * @return The bytes for regionfips104.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getRegionfips104Bytes() {
        java.lang.Object ref = regionfips104_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          regionfips104_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int METRO_FIELD_NUMBER = 6;
      private volatile java.lang.Object metro_;
      /**
       * <pre>
       * Google metro code; similar to but not exactly Nielsen DMAs.
       * See Appendix A for a link to the codes.
       * (http://code.google.com/apis/adwords/docs/appendix/metrocodes.html).
       * </pre>
       *
       * <code>optional string metro = 6;</code>
       * @return Whether the metro field is set.
       */
      @java.lang.Override
      public boolean hasMetro() {
        return ((bitField0_ & 0x00000020) != 0);
      }
      /**
       * <pre>
       * Google metro code; similar to but not exactly Nielsen DMAs.
       * See Appendix A for a link to the codes.
       * (http://code.google.com/apis/adwords/docs/appendix/metrocodes.html).
       * </pre>
       *
       * <code>optional string metro = 6;</code>
       * @return The metro.
       */
      @java.lang.Override
      public java.lang.String getMetro() {
        java.lang.Object ref = metro_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            metro_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Google metro code; similar to but not exactly Nielsen DMAs.
       * See Appendix A for a link to the codes.
       * (http://code.google.com/apis/adwords/docs/appendix/metrocodes.html).
       * </pre>
       *
       * <code>optional string metro = 6;</code>
       * @return The bytes for metro.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getMetroBytes() {
        java.lang.Object ref = metro_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          metro_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int CITY_FIELD_NUMBER = 7;
      private volatile java.lang.Object city_;
      /**
       * <pre>
       * City using United Nations Code for Trade &amp; Transport Locations.
       * See Appendix A for a link to the codes.
       * (http://www.unece.org/cefact/locode/service/location.htm).
       * </pre>
       *
       * <code>optional string city = 7;</code>
       * @return Whether the city field is set.
       */
      @java.lang.Override
      public boolean hasCity() {
        return ((bitField0_ & 0x00000040) != 0);
      }
      /**
       * <pre>
       * City using United Nations Code for Trade &amp; Transport Locations.
       * See Appendix A for a link to the codes.
       * (http://www.unece.org/cefact/locode/service/location.htm).
       * </pre>
       *
       * <code>optional string city = 7;</code>
       * @return The city.
       */
      @java.lang.Override
      public java.lang.String getCity() {
        java.lang.Object ref = city_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            city_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * City using United Nations Code for Trade &amp; Transport Locations.
       * See Appendix A for a link to the codes.
       * (http://www.unece.org/cefact/locode/service/location.htm).
       * </pre>
       *
       * <code>optional string city = 7;</code>
       * @return The bytes for city.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getCityBytes() {
        java.lang.Object ref = city_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          city_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int ZIP_FIELD_NUMBER = 8;
      private volatile java.lang.Object zip_;
      /**
       * <pre>
       * Zip/postal code.
       * </pre>
       *
       * <code>optional string zip = 8;</code>
       * @return Whether the zip field is set.
       */
      @java.lang.Override
      public boolean hasZip() {
        return ((bitField0_ & 0x00000080) != 0);
      }
      /**
       * <pre>
       * Zip/postal code.
       * </pre>
       *
       * <code>optional string zip = 8;</code>
       * @return The zip.
       */
      @java.lang.Override
      public java.lang.String getZip() {
        java.lang.Object ref = zip_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            zip_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Zip/postal code.
       * </pre>
       *
       * <code>optional string zip = 8;</code>
       * @return The bytes for zip.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getZipBytes() {
        java.lang.Object ref = zip_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          zip_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int TYPE_FIELD_NUMBER = 9;
      private int type_;
      /**
       * <pre>
       * Source of location data; recommended when passing lat/lon.
       * Refer to enum com.iabtechlab.adcom.v1.enums.LocationType for generic values.
       * </pre>
       *
       * <code>optional int32 type = 9;</code>
       * @return Whether the type field is set.
       */
      @java.lang.Override
      public boolean hasType() {
        return ((bitField0_ & 0x00000100) != 0);
      }
      /**
       * <pre>
       * Source of location data; recommended when passing lat/lon.
       * Refer to enum com.iabtechlab.adcom.v1.enums.LocationType for generic values.
       * </pre>
       *
       * <code>optional int32 type = 9;</code>
       * @return The type.
       */
      @java.lang.Override
      public int getType() {
        return type_;
      }

      public static final int ACCURACY_FIELD_NUMBER = 11;
      private int accuracy_;
      /**
       * <pre>
       * Estimated location accuracy in meters; recommended when lat/lon
       * are specified and derived from a device's location services
       * (i.e., type = 1). Note that this is the accuracy as reported
       * from the device. Consult OS specific documentation
       * (e.g., Android, iOS) for exact interpretation.
       * </pre>
       *
       * <code>optional int32 accuracy = 11;</code>
       * @return Whether the accuracy field is set.
       */
      @java.lang.Override
      public boolean hasAccuracy() {
        return ((bitField0_ & 0x00000200) != 0);
      }
      /**
       * <pre>
       * Estimated location accuracy in meters; recommended when lat/lon
       * are specified and derived from a device's location services
       * (i.e., type = 1). Note that this is the accuracy as reported
       * from the device. Consult OS specific documentation
       * (e.g., Android, iOS) for exact interpretation.
       * </pre>
       *
       * <code>optional int32 accuracy = 11;</code>
       * @return The accuracy.
       */
      @java.lang.Override
      public int getAccuracy() {
        return accuracy_;
      }

      public static final int LASTFIX_FIELD_NUMBER = 12;
      private int lastfix_;
      /**
       * <pre>
       * Number of seconds since this geolocation fix was established.
       * Note that devices may cache location data across multiple fetches.
       * Ideally, this value should be from the time the actual fix was taken.
       * </pre>
       *
       * <code>optional int32 lastfix = 12;</code>
       * @return Whether the lastfix field is set.
       */
      @java.lang.Override
      public boolean hasLastfix() {
        return ((bitField0_ & 0x00000400) != 0);
      }
      /**
       * <pre>
       * Number of seconds since this geolocation fix was established.
       * Note that devices may cache location data across multiple fetches.
       * Ideally, this value should be from the time the actual fix was taken.
       * </pre>
       *
       * <code>optional int32 lastfix = 12;</code>
       * @return The lastfix.
       */
      @java.lang.Override
      public int getLastfix() {
        return lastfix_;
      }

      public static final int IPSERVICE_FIELD_NUMBER = 13;
      private int ipservice_;
      /**
       * <pre>
       * Service or provider used to determine geolocation from IP
       * address if applicable (i.e., type = 2).
       * Refer to enum com.iabtechlab.adcom.v1.enums.LocationService for generic values.
       * </pre>
       *
       * <code>optional int32 ipservice = 13;</code>
       * @return Whether the ipservice field is set.
       */
      @java.lang.Override
      public boolean hasIpservice() {
        return ((bitField0_ & 0x00000800) != 0);
      }
      /**
       * <pre>
       * Service or provider used to determine geolocation from IP
       * address if applicable (i.e., type = 2).
       * Refer to enum com.iabtechlab.adcom.v1.enums.LocationService for generic values.
       * </pre>
       *
       * <code>optional int32 ipservice = 13;</code>
       * @return The ipservice.
       */
      @java.lang.Override
      public int getIpservice() {
        return ipservice_;
      }

      public static final int UTCOFFSET_FIELD_NUMBER = 10;
      private int utcoffset_;
      /**
       * <pre>
       * Local time as the number +/- of minutes from UTC.
       * </pre>
       *
       * <code>optional int32 utcoffset = 10;</code>
       * @return Whether the utcoffset field is set.
       */
      @java.lang.Override
      public boolean hasUtcoffset() {
        return ((bitField0_ & 0x00001000) != 0);
      }
      /**
       * <pre>
       * Local time as the number +/- of minutes from UTC.
       * </pre>
       *
       * <code>optional int32 utcoffset = 10;</code>
       * @return The utcoffset.
       */
      @java.lang.Override
      public int getUtcoffset() {
        return utcoffset_;
      }

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

        if (!extensionsAreInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
        memoizedIsInitialized = 1;
        return true;
      }

      @java.lang.Override
      public void writeTo(com.google.protobuf.CodedOutputStream output)
                          throws java.io.IOException {
        com.google.protobuf.GeneratedMessageV3
          .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo>.ExtensionWriter
            extensionWriter = newExtensionWriter();
        if (((bitField0_ & 0x00000001) != 0)) {
          output.writeDouble(1, lat_);
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          output.writeDouble(2, lon_);
        }
        if (((bitField0_ & 0x00000004) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 3, country_);
        }
        if (((bitField0_ & 0x00000008) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 4, region_);
        }
        if (((bitField0_ & 0x00000010) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 5, regionfips104_);
        }
        if (((bitField0_ & 0x00000020) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 6, metro_);
        }
        if (((bitField0_ & 0x00000040) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 7, city_);
        }
        if (((bitField0_ & 0x00000080) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 8, zip_);
        }
        if (((bitField0_ & 0x00000100) != 0)) {
          output.writeInt32(9, type_);
        }
        if (((bitField0_ & 0x00001000) != 0)) {
          output.writeInt32(10, utcoffset_);
        }
        if (((bitField0_ & 0x00000200) != 0)) {
          output.writeInt32(11, accuracy_);
        }
        if (((bitField0_ & 0x00000400) != 0)) {
          output.writeInt32(12, lastfix_);
        }
        if (((bitField0_ & 0x00000800) != 0)) {
          output.writeInt32(13, ipservice_);
        }
        extensionWriter.writeUntil(10000, output);
        unknownFields.writeTo(output);
      }

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

        size = 0;
        if (((bitField0_ & 0x00000001) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeDoubleSize(1, lat_);
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeDoubleSize(2, lon_);
        }
        if (((bitField0_ & 0x00000004) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, country_);
        }
        if (((bitField0_ & 0x00000008) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, region_);
        }
        if (((bitField0_ & 0x00000010) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(5, regionfips104_);
        }
        if (((bitField0_ & 0x00000020) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(6, metro_);
        }
        if (((bitField0_ & 0x00000040) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(7, city_);
        }
        if (((bitField0_ & 0x00000080) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(8, zip_);
        }
        if (((bitField0_ & 0x00000100) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeInt32Size(9, type_);
        }
        if (((bitField0_ & 0x00001000) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeInt32Size(10, utcoffset_);
        }
        if (((bitField0_ & 0x00000200) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeInt32Size(11, accuracy_);
        }
        if (((bitField0_ & 0x00000400) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeInt32Size(12, lastfix_);
        }
        if (((bitField0_ & 0x00000800) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeInt32Size(13, ipservice_);
        }
        size += extensionsSerializedSize();
        size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo)) {
          return super.equals(obj);
        }
        com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo other = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo) obj;

        if (hasLat() != other.hasLat()) return false;
        if (hasLat()) {
          if (java.lang.Double.doubleToLongBits(getLat())
              != java.lang.Double.doubleToLongBits(
                  other.getLat())) return false;
        }
        if (hasLon() != other.hasLon()) return false;
        if (hasLon()) {
          if (java.lang.Double.doubleToLongBits(getLon())
              != java.lang.Double.doubleToLongBits(
                  other.getLon())) return false;
        }
        if (hasCountry() != other.hasCountry()) return false;
        if (hasCountry()) {
          if (!getCountry()
              .equals(other.getCountry())) return false;
        }
        if (hasRegion() != other.hasRegion()) return false;
        if (hasRegion()) {
          if (!getRegion()
              .equals(other.getRegion())) return false;
        }
        if (hasRegionfips104() != other.hasRegionfips104()) return false;
        if (hasRegionfips104()) {
          if (!getRegionfips104()
              .equals(other.getRegionfips104())) return false;
        }
        if (hasMetro() != other.hasMetro()) return false;
        if (hasMetro()) {
          if (!getMetro()
              .equals(other.getMetro())) return false;
        }
        if (hasCity() != other.hasCity()) return false;
        if (hasCity()) {
          if (!getCity()
              .equals(other.getCity())) return false;
        }
        if (hasZip() != other.hasZip()) return false;
        if (hasZip()) {
          if (!getZip()
              .equals(other.getZip())) return false;
        }
        if (hasType() != other.hasType()) return false;
        if (hasType()) {
          if (getType()
              != other.getType()) return false;
        }
        if (hasAccuracy() != other.hasAccuracy()) return false;
        if (hasAccuracy()) {
          if (getAccuracy()
              != other.getAccuracy()) return false;
        }
        if (hasLastfix() != other.hasLastfix()) return false;
        if (hasLastfix()) {
          if (getLastfix()
              != other.getLastfix()) return false;
        }
        if (hasIpservice() != other.hasIpservice()) return false;
        if (hasIpservice()) {
          if (getIpservice()
              != other.getIpservice()) return false;
        }
        if (hasUtcoffset() != other.hasUtcoffset()) return false;
        if (hasUtcoffset()) {
          if (getUtcoffset()
              != other.getUtcoffset()) return false;
        }
        if (!unknownFields.equals(other.unknownFields)) return false;
        if (!getExtensionFields().equals(other.getExtensionFields()))
          return false;
        return true;
      }

      @java.lang.Override
      public int hashCode() {
        if (memoizedHashCode != 0) {
          return memoizedHashCode;
        }
        int hash = 41;
        hash = (19 * hash) + getDescriptor().hashCode();
        if (hasLat()) {
          hash = (37 * hash) + LAT_FIELD_NUMBER;
          hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
              java.lang.Double.doubleToLongBits(getLat()));
        }
        if (hasLon()) {
          hash = (37 * hash) + LON_FIELD_NUMBER;
          hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
              java.lang.Double.doubleToLongBits(getLon()));
        }
        if (hasCountry()) {
          hash = (37 * hash) + COUNTRY_FIELD_NUMBER;
          hash = (53 * hash) + getCountry().hashCode();
        }
        if (hasRegion()) {
          hash = (37 * hash) + REGION_FIELD_NUMBER;
          hash = (53 * hash) + getRegion().hashCode();
        }
        if (hasRegionfips104()) {
          hash = (37 * hash) + REGIONFIPS104_FIELD_NUMBER;
          hash = (53 * hash) + getRegionfips104().hashCode();
        }
        if (hasMetro()) {
          hash = (37 * hash) + METRO_FIELD_NUMBER;
          hash = (53 * hash) + getMetro().hashCode();
        }
        if (hasCity()) {
          hash = (37 * hash) + CITY_FIELD_NUMBER;
          hash = (53 * hash) + getCity().hashCode();
        }
        if (hasZip()) {
          hash = (37 * hash) + ZIP_FIELD_NUMBER;
          hash = (53 * hash) + getZip().hashCode();
        }
        if (hasType()) {
          hash = (37 * hash) + TYPE_FIELD_NUMBER;
          hash = (53 * hash) + getType();
        }
        if (hasAccuracy()) {
          hash = (37 * hash) + ACCURACY_FIELD_NUMBER;
          hash = (53 * hash) + getAccuracy();
        }
        if (hasLastfix()) {
          hash = (37 * hash) + LASTFIX_FIELD_NUMBER;
          hash = (53 * hash) + getLastfix();
        }
        if (hasIpservice()) {
          hash = (37 * hash) + IPSERVICE_FIELD_NUMBER;
          hash = (53 * hash) + getIpservice();
        }
        if (hasUtcoffset()) {
          hash = (37 * hash) + UTCOFFSET_FIELD_NUMBER;
          hash = (53 * hash) + getUtcoffset();
        }
        hash = hashFields(hash, getExtensionFields());
        hash = (29 * hash) + unknownFields.hashCode();
        memoizedHashCode = hash;
        return hash;
      }

      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo parseFrom(
          java.nio.ByteBuffer data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo parseFrom(
          java.nio.ByteBuffer data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo parseFrom(
          com.google.protobuf.ByteString data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo parseFrom(
          com.google.protobuf.ByteString data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo parseFrom(byte[] data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo parseFrom(
          byte[] data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo parseFrom(java.io.InputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo parseDelimitedFrom(java.io.InputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseDelimitedWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo parseFrom(
          com.google.protobuf.CodedInputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo 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>
       * OpenRTB 2.0: This object encapsulates various methods for specifying a
       * geographic location. When subordinate to a Device object, it indicates the
       * location of the device which can also be interpreted as the user's current
       * location. When subordinate to a User object, it indicates the location of
       * the user's home base (i.e., not necessarily their current location).
       * The lat/lon attributes should only be passed if they conform to the
       * accuracy depicted in the type attribute. For example, the centroid of a
       * geographic region such as postal code should not be passed.
       * </pre>
       *
       * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Geo}
       */
      public static final class Builder extends
          com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo, Builder> implements
          // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.BidRequest.Geo)
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.GeoOrBuilder {
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Geo_descriptor;
        }

        @java.lang.Override
        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Geo_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo.Builder.class);
        }

        // Construct using com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo.newBuilder()
        private Builder() {
          maybeForceBuilderInitialization();
        }

        private Builder(
            com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
          super(parent);
          maybeForceBuilderInitialization();
        }
        private void maybeForceBuilderInitialization() {
          if (com.google.protobuf.GeneratedMessageV3
                  .alwaysUseFieldBuilders) {
          }
        }
        @java.lang.Override
        public Builder clear() {
          super.clear();
          lat_ = 0D;
          bitField0_ = (bitField0_ & ~0x00000001);
          lon_ = 0D;
          bitField0_ = (bitField0_ & ~0x00000002);
          country_ = "";
          bitField0_ = (bitField0_ & ~0x00000004);
          region_ = "";
          bitField0_ = (bitField0_ & ~0x00000008);
          regionfips104_ = "";
          bitField0_ = (bitField0_ & ~0x00000010);
          metro_ = "";
          bitField0_ = (bitField0_ & ~0x00000020);
          city_ = "";
          bitField0_ = (bitField0_ & ~0x00000040);
          zip_ = "";
          bitField0_ = (bitField0_ & ~0x00000080);
          type_ = 0;
          bitField0_ = (bitField0_ & ~0x00000100);
          accuracy_ = 0;
          bitField0_ = (bitField0_ & ~0x00000200);
          lastfix_ = 0;
          bitField0_ = (bitField0_ & ~0x00000400);
          ipservice_ = 0;
          bitField0_ = (bitField0_ & ~0x00000800);
          utcoffset_ = 0;
          bitField0_ = (bitField0_ & ~0x00001000);
          return this;
        }

        @java.lang.Override
        public com.google.protobuf.Descriptors.Descriptor
            getDescriptorForType() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Geo_descriptor;
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo getDefaultInstanceForType() {
          return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo.getDefaultInstance();
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo build() {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo result = buildPartial();
          if (!result.isInitialized()) {
            throw newUninitializedMessageException(result);
          }
          return result;
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo buildPartial() {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo result = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo(this);
          int from_bitField0_ = bitField0_;
          int to_bitField0_ = 0;
          if (((from_bitField0_ & 0x00000001) != 0)) {
            result.lat_ = lat_;
            to_bitField0_ |= 0x00000001;
          }
          if (((from_bitField0_ & 0x00000002) != 0)) {
            result.lon_ = lon_;
            to_bitField0_ |= 0x00000002;
          }
          if (((from_bitField0_ & 0x00000004) != 0)) {
            to_bitField0_ |= 0x00000004;
          }
          result.country_ = country_;
          if (((from_bitField0_ & 0x00000008) != 0)) {
            to_bitField0_ |= 0x00000008;
          }
          result.region_ = region_;
          if (((from_bitField0_ & 0x00000010) != 0)) {
            to_bitField0_ |= 0x00000010;
          }
          result.regionfips104_ = regionfips104_;
          if (((from_bitField0_ & 0x00000020) != 0)) {
            to_bitField0_ |= 0x00000020;
          }
          result.metro_ = metro_;
          if (((from_bitField0_ & 0x00000040) != 0)) {
            to_bitField0_ |= 0x00000040;
          }
          result.city_ = city_;
          if (((from_bitField0_ & 0x00000080) != 0)) {
            to_bitField0_ |= 0x00000080;
          }
          result.zip_ = zip_;
          if (((from_bitField0_ & 0x00000100) != 0)) {
            result.type_ = type_;
            to_bitField0_ |= 0x00000100;
          }
          if (((from_bitField0_ & 0x00000200) != 0)) {
            result.accuracy_ = accuracy_;
            to_bitField0_ |= 0x00000200;
          }
          if (((from_bitField0_ & 0x00000400) != 0)) {
            result.lastfix_ = lastfix_;
            to_bitField0_ |= 0x00000400;
          }
          if (((from_bitField0_ & 0x00000800) != 0)) {
            result.ipservice_ = ipservice_;
            to_bitField0_ |= 0x00000800;
          }
          if (((from_bitField0_ & 0x00001000) != 0)) {
            result.utcoffset_ = utcoffset_;
            to_bitField0_ |= 0x00001000;
          }
          result.bitField0_ = to_bitField0_;
          onBuilt();
          return result;
        }

        @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 <Type> Builder setExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo, Type> extension,
            Type value) {
          return super.setExtension(extension, value);
        }
        @java.lang.Override
        public <Type> Builder setExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo, java.util.List<Type>> extension,
            int index, Type value) {
          return super.setExtension(extension, index, value);
        }
        @java.lang.Override
        public <Type> Builder addExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo, java.util.List<Type>> extension,
            Type value) {
          return super.addExtension(extension, value);
        }
        @java.lang.Override
        public <Type> Builder clearExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo, ?> extension) {
          return super.clearExtension(extension);
        }
        @java.lang.Override
        public Builder mergeFrom(com.google.protobuf.Message other) {
          if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo) {
            return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo)other);
          } else {
            super.mergeFrom(other);
            return this;
          }
        }

        public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo other) {
          if (other == com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo.getDefaultInstance()) return this;
          if (other.hasLat()) {
            setLat(other.getLat());
          }
          if (other.hasLon()) {
            setLon(other.getLon());
          }
          if (other.hasCountry()) {
            bitField0_ |= 0x00000004;
            country_ = other.country_;
            onChanged();
          }
          if (other.hasRegion()) {
            bitField0_ |= 0x00000008;
            region_ = other.region_;
            onChanged();
          }
          if (other.hasRegionfips104()) {
            bitField0_ |= 0x00000010;
            regionfips104_ = other.regionfips104_;
            onChanged();
          }
          if (other.hasMetro()) {
            bitField0_ |= 0x00000020;
            metro_ = other.metro_;
            onChanged();
          }
          if (other.hasCity()) {
            bitField0_ |= 0x00000040;
            city_ = other.city_;
            onChanged();
          }
          if (other.hasZip()) {
            bitField0_ |= 0x00000080;
            zip_ = other.zip_;
            onChanged();
          }
          if (other.hasType()) {
            setType(other.getType());
          }
          if (other.hasAccuracy()) {
            setAccuracy(other.getAccuracy());
          }
          if (other.hasLastfix()) {
            setLastfix(other.getLastfix());
          }
          if (other.hasIpservice()) {
            setIpservice(other.getIpservice());
          }
          if (other.hasUtcoffset()) {
            setUtcoffset(other.getUtcoffset());
          }
          this.mergeExtensionFields(other);
          this.mergeUnknownFields(other.unknownFields);
          onChanged();
          return this;
        }

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

        @java.lang.Override
        public Builder mergeFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws java.io.IOException {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo parsedMessage = null;
          try {
            parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo) e.getUnfinishedMessage();
            throw e.unwrapIOException();
          } finally {
            if (parsedMessage != null) {
              mergeFrom(parsedMessage);
            }
          }
          return this;
        }
        private int bitField0_;

        private double lat_ ;
        /**
         * <pre>
         * Latitude from -90.0 to +90.0, where negative is south.
         * </pre>
         *
         * <code>optional double lat = 1;</code>
         * @return Whether the lat field is set.
         */
        @java.lang.Override
        public boolean hasLat() {
          return ((bitField0_ & 0x00000001) != 0);
        }
        /**
         * <pre>
         * Latitude from -90.0 to +90.0, where negative is south.
         * </pre>
         *
         * <code>optional double lat = 1;</code>
         * @return The lat.
         */
        @java.lang.Override
        public double getLat() {
          return lat_;
        }
        /**
         * <pre>
         * Latitude from -90.0 to +90.0, where negative is south.
         * </pre>
         *
         * <code>optional double lat = 1;</code>
         * @param value The lat to set.
         * @return This builder for chaining.
         */
        public Builder setLat(double value) {
          bitField0_ |= 0x00000001;
          lat_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Latitude from -90.0 to +90.0, where negative is south.
         * </pre>
         *
         * <code>optional double lat = 1;</code>
         * @return This builder for chaining.
         */
        public Builder clearLat() {
          bitField0_ = (bitField0_ & ~0x00000001);
          lat_ = 0D;
          onChanged();
          return this;
        }

        private double lon_ ;
        /**
         * <pre>
         * Longitude from -180.0 to +180.0, where negative is west.
         * </pre>
         *
         * <code>optional double lon = 2;</code>
         * @return Whether the lon field is set.
         */
        @java.lang.Override
        public boolean hasLon() {
          return ((bitField0_ & 0x00000002) != 0);
        }
        /**
         * <pre>
         * Longitude from -180.0 to +180.0, where negative is west.
         * </pre>
         *
         * <code>optional double lon = 2;</code>
         * @return The lon.
         */
        @java.lang.Override
        public double getLon() {
          return lon_;
        }
        /**
         * <pre>
         * Longitude from -180.0 to +180.0, where negative is west.
         * </pre>
         *
         * <code>optional double lon = 2;</code>
         * @param value The lon to set.
         * @return This builder for chaining.
         */
        public Builder setLon(double value) {
          bitField0_ |= 0x00000002;
          lon_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Longitude from -180.0 to +180.0, where negative is west.
         * </pre>
         *
         * <code>optional double lon = 2;</code>
         * @return This builder for chaining.
         */
        public Builder clearLon() {
          bitField0_ = (bitField0_ & ~0x00000002);
          lon_ = 0D;
          onChanged();
          return this;
        }

        private java.lang.Object country_ = "";
        /**
         * <pre>
         * Country using ISO-3166-1 Alpha-3.
         * </pre>
         *
         * <code>optional string country = 3;</code>
         * @return Whether the country field is set.
         */
        public boolean hasCountry() {
          return ((bitField0_ & 0x00000004) != 0);
        }
        /**
         * <pre>
         * Country using ISO-3166-1 Alpha-3.
         * </pre>
         *
         * <code>optional string country = 3;</code>
         * @return The country.
         */
        public java.lang.String getCountry() {
          java.lang.Object ref = country_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              country_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Country using ISO-3166-1 Alpha-3.
         * </pre>
         *
         * <code>optional string country = 3;</code>
         * @return The bytes for country.
         */
        public com.google.protobuf.ByteString
            getCountryBytes() {
          java.lang.Object ref = country_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            country_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Country using ISO-3166-1 Alpha-3.
         * </pre>
         *
         * <code>optional string country = 3;</code>
         * @param value The country to set.
         * @return This builder for chaining.
         */
        public Builder setCountry(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
          country_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Country using ISO-3166-1 Alpha-3.
         * </pre>
         *
         * <code>optional string country = 3;</code>
         * @return This builder for chaining.
         */
        public Builder clearCountry() {
          bitField0_ = (bitField0_ & ~0x00000004);
          country_ = getDefaultInstance().getCountry();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Country using ISO-3166-1 Alpha-3.
         * </pre>
         *
         * <code>optional string country = 3;</code>
         * @param value The bytes for country to set.
         * @return This builder for chaining.
         */
        public Builder setCountryBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
          country_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object region_ = "";
        /**
         * <pre>
         * Region code using ISO-3166-2; 2-letter state code if USA.
         * </pre>
         *
         * <code>optional string region = 4;</code>
         * @return Whether the region field is set.
         */
        public boolean hasRegion() {
          return ((bitField0_ & 0x00000008) != 0);
        }
        /**
         * <pre>
         * Region code using ISO-3166-2; 2-letter state code if USA.
         * </pre>
         *
         * <code>optional string region = 4;</code>
         * @return The region.
         */
        public java.lang.String getRegion() {
          java.lang.Object ref = region_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              region_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Region code using ISO-3166-2; 2-letter state code if USA.
         * </pre>
         *
         * <code>optional string region = 4;</code>
         * @return The bytes for region.
         */
        public com.google.protobuf.ByteString
            getRegionBytes() {
          java.lang.Object ref = region_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            region_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Region code using ISO-3166-2; 2-letter state code if USA.
         * </pre>
         *
         * <code>optional string region = 4;</code>
         * @param value The region to set.
         * @return This builder for chaining.
         */
        public Builder setRegion(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
          region_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Region code using ISO-3166-2; 2-letter state code if USA.
         * </pre>
         *
         * <code>optional string region = 4;</code>
         * @return This builder for chaining.
         */
        public Builder clearRegion() {
          bitField0_ = (bitField0_ & ~0x00000008);
          region_ = getDefaultInstance().getRegion();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Region code using ISO-3166-2; 2-letter state code if USA.
         * </pre>
         *
         * <code>optional string region = 4;</code>
         * @param value The bytes for region to set.
         * @return This builder for chaining.
         */
        public Builder setRegionBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
          region_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object regionfips104_ = "";
        /**
         * <pre>
         * Region of a country using FIPS 10-4 notation. While OpenRTB supports
         * this attribute, it has been withdrawn by NIST in 2008.
         * </pre>
         *
         * <code>optional string regionfips104 = 5;</code>
         * @return Whether the regionfips104 field is set.
         */
        public boolean hasRegionfips104() {
          return ((bitField0_ & 0x00000010) != 0);
        }
        /**
         * <pre>
         * Region of a country using FIPS 10-4 notation. While OpenRTB supports
         * this attribute, it has been withdrawn by NIST in 2008.
         * </pre>
         *
         * <code>optional string regionfips104 = 5;</code>
         * @return The regionfips104.
         */
        public java.lang.String getRegionfips104() {
          java.lang.Object ref = regionfips104_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              regionfips104_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Region of a country using FIPS 10-4 notation. While OpenRTB supports
         * this attribute, it has been withdrawn by NIST in 2008.
         * </pre>
         *
         * <code>optional string regionfips104 = 5;</code>
         * @return The bytes for regionfips104.
         */
        public com.google.protobuf.ByteString
            getRegionfips104Bytes() {
          java.lang.Object ref = regionfips104_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            regionfips104_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Region of a country using FIPS 10-4 notation. While OpenRTB supports
         * this attribute, it has been withdrawn by NIST in 2008.
         * </pre>
         *
         * <code>optional string regionfips104 = 5;</code>
         * @param value The regionfips104 to set.
         * @return This builder for chaining.
         */
        public Builder setRegionfips104(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
          regionfips104_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Region of a country using FIPS 10-4 notation. While OpenRTB supports
         * this attribute, it has been withdrawn by NIST in 2008.
         * </pre>
         *
         * <code>optional string regionfips104 = 5;</code>
         * @return This builder for chaining.
         */
        public Builder clearRegionfips104() {
          bitField0_ = (bitField0_ & ~0x00000010);
          regionfips104_ = getDefaultInstance().getRegionfips104();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Region of a country using FIPS 10-4 notation. While OpenRTB supports
         * this attribute, it has been withdrawn by NIST in 2008.
         * </pre>
         *
         * <code>optional string regionfips104 = 5;</code>
         * @param value The bytes for regionfips104 to set.
         * @return This builder for chaining.
         */
        public Builder setRegionfips104Bytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
          regionfips104_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object metro_ = "";
        /**
         * <pre>
         * Google metro code; similar to but not exactly Nielsen DMAs.
         * See Appendix A for a link to the codes.
         * (http://code.google.com/apis/adwords/docs/appendix/metrocodes.html).
         * </pre>
         *
         * <code>optional string metro = 6;</code>
         * @return Whether the metro field is set.
         */
        public boolean hasMetro() {
          return ((bitField0_ & 0x00000020) != 0);
        }
        /**
         * <pre>
         * Google metro code; similar to but not exactly Nielsen DMAs.
         * See Appendix A for a link to the codes.
         * (http://code.google.com/apis/adwords/docs/appendix/metrocodes.html).
         * </pre>
         *
         * <code>optional string metro = 6;</code>
         * @return The metro.
         */
        public java.lang.String getMetro() {
          java.lang.Object ref = metro_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              metro_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Google metro code; similar to but not exactly Nielsen DMAs.
         * See Appendix A for a link to the codes.
         * (http://code.google.com/apis/adwords/docs/appendix/metrocodes.html).
         * </pre>
         *
         * <code>optional string metro = 6;</code>
         * @return The bytes for metro.
         */
        public com.google.protobuf.ByteString
            getMetroBytes() {
          java.lang.Object ref = metro_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            metro_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Google metro code; similar to but not exactly Nielsen DMAs.
         * See Appendix A for a link to the codes.
         * (http://code.google.com/apis/adwords/docs/appendix/metrocodes.html).
         * </pre>
         *
         * <code>optional string metro = 6;</code>
         * @param value The metro to set.
         * @return This builder for chaining.
         */
        public Builder setMetro(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000020;
          metro_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Google metro code; similar to but not exactly Nielsen DMAs.
         * See Appendix A for a link to the codes.
         * (http://code.google.com/apis/adwords/docs/appendix/metrocodes.html).
         * </pre>
         *
         * <code>optional string metro = 6;</code>
         * @return This builder for chaining.
         */
        public Builder clearMetro() {
          bitField0_ = (bitField0_ & ~0x00000020);
          metro_ = getDefaultInstance().getMetro();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Google metro code; similar to but not exactly Nielsen DMAs.
         * See Appendix A for a link to the codes.
         * (http://code.google.com/apis/adwords/docs/appendix/metrocodes.html).
         * </pre>
         *
         * <code>optional string metro = 6;</code>
         * @param value The bytes for metro to set.
         * @return This builder for chaining.
         */
        public Builder setMetroBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000020;
          metro_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object city_ = "";
        /**
         * <pre>
         * City using United Nations Code for Trade &amp; Transport Locations.
         * See Appendix A for a link to the codes.
         * (http://www.unece.org/cefact/locode/service/location.htm).
         * </pre>
         *
         * <code>optional string city = 7;</code>
         * @return Whether the city field is set.
         */
        public boolean hasCity() {
          return ((bitField0_ & 0x00000040) != 0);
        }
        /**
         * <pre>
         * City using United Nations Code for Trade &amp; Transport Locations.
         * See Appendix A for a link to the codes.
         * (http://www.unece.org/cefact/locode/service/location.htm).
         * </pre>
         *
         * <code>optional string city = 7;</code>
         * @return The city.
         */
        public java.lang.String getCity() {
          java.lang.Object ref = city_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              city_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * City using United Nations Code for Trade &amp; Transport Locations.
         * See Appendix A for a link to the codes.
         * (http://www.unece.org/cefact/locode/service/location.htm).
         * </pre>
         *
         * <code>optional string city = 7;</code>
         * @return The bytes for city.
         */
        public com.google.protobuf.ByteString
            getCityBytes() {
          java.lang.Object ref = city_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            city_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * City using United Nations Code for Trade &amp; Transport Locations.
         * See Appendix A for a link to the codes.
         * (http://www.unece.org/cefact/locode/service/location.htm).
         * </pre>
         *
         * <code>optional string city = 7;</code>
         * @param value The city to set.
         * @return This builder for chaining.
         */
        public Builder setCity(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000040;
          city_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * City using United Nations Code for Trade &amp; Transport Locations.
         * See Appendix A for a link to the codes.
         * (http://www.unece.org/cefact/locode/service/location.htm).
         * </pre>
         *
         * <code>optional string city = 7;</code>
         * @return This builder for chaining.
         */
        public Builder clearCity() {
          bitField0_ = (bitField0_ & ~0x00000040);
          city_ = getDefaultInstance().getCity();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * City using United Nations Code for Trade &amp; Transport Locations.
         * See Appendix A for a link to the codes.
         * (http://www.unece.org/cefact/locode/service/location.htm).
         * </pre>
         *
         * <code>optional string city = 7;</code>
         * @param value The bytes for city to set.
         * @return This builder for chaining.
         */
        public Builder setCityBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000040;
          city_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object zip_ = "";
        /**
         * <pre>
         * Zip/postal code.
         * </pre>
         *
         * <code>optional string zip = 8;</code>
         * @return Whether the zip field is set.
         */
        public boolean hasZip() {
          return ((bitField0_ & 0x00000080) != 0);
        }
        /**
         * <pre>
         * Zip/postal code.
         * </pre>
         *
         * <code>optional string zip = 8;</code>
         * @return The zip.
         */
        public java.lang.String getZip() {
          java.lang.Object ref = zip_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              zip_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Zip/postal code.
         * </pre>
         *
         * <code>optional string zip = 8;</code>
         * @return The bytes for zip.
         */
        public com.google.protobuf.ByteString
            getZipBytes() {
          java.lang.Object ref = zip_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            zip_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Zip/postal code.
         * </pre>
         *
         * <code>optional string zip = 8;</code>
         * @param value The zip to set.
         * @return This builder for chaining.
         */
        public Builder setZip(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000080;
          zip_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Zip/postal code.
         * </pre>
         *
         * <code>optional string zip = 8;</code>
         * @return This builder for chaining.
         */
        public Builder clearZip() {
          bitField0_ = (bitField0_ & ~0x00000080);
          zip_ = getDefaultInstance().getZip();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Zip/postal code.
         * </pre>
         *
         * <code>optional string zip = 8;</code>
         * @param value The bytes for zip to set.
         * @return This builder for chaining.
         */
        public Builder setZipBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000080;
          zip_ = value;
          onChanged();
          return this;
        }

        private int type_ ;
        /**
         * <pre>
         * Source of location data; recommended when passing lat/lon.
         * Refer to enum com.iabtechlab.adcom.v1.enums.LocationType for generic values.
         * </pre>
         *
         * <code>optional int32 type = 9;</code>
         * @return Whether the type field is set.
         */
        @java.lang.Override
        public boolean hasType() {
          return ((bitField0_ & 0x00000100) != 0);
        }
        /**
         * <pre>
         * Source of location data; recommended when passing lat/lon.
         * Refer to enum com.iabtechlab.adcom.v1.enums.LocationType for generic values.
         * </pre>
         *
         * <code>optional int32 type = 9;</code>
         * @return The type.
         */
        @java.lang.Override
        public int getType() {
          return type_;
        }
        /**
         * <pre>
         * Source of location data; recommended when passing lat/lon.
         * Refer to enum com.iabtechlab.adcom.v1.enums.LocationType for generic values.
         * </pre>
         *
         * <code>optional int32 type = 9;</code>
         * @param value The type to set.
         * @return This builder for chaining.
         */
        public Builder setType(int value) {
          bitField0_ |= 0x00000100;
          type_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Source of location data; recommended when passing lat/lon.
         * Refer to enum com.iabtechlab.adcom.v1.enums.LocationType for generic values.
         * </pre>
         *
         * <code>optional int32 type = 9;</code>
         * @return This builder for chaining.
         */
        public Builder clearType() {
          bitField0_ = (bitField0_ & ~0x00000100);
          type_ = 0;
          onChanged();
          return this;
        }

        private int accuracy_ ;
        /**
         * <pre>
         * Estimated location accuracy in meters; recommended when lat/lon
         * are specified and derived from a device's location services
         * (i.e., type = 1). Note that this is the accuracy as reported
         * from the device. Consult OS specific documentation
         * (e.g., Android, iOS) for exact interpretation.
         * </pre>
         *
         * <code>optional int32 accuracy = 11;</code>
         * @return Whether the accuracy field is set.
         */
        @java.lang.Override
        public boolean hasAccuracy() {
          return ((bitField0_ & 0x00000200) != 0);
        }
        /**
         * <pre>
         * Estimated location accuracy in meters; recommended when lat/lon
         * are specified and derived from a device's location services
         * (i.e., type = 1). Note that this is the accuracy as reported
         * from the device. Consult OS specific documentation
         * (e.g., Android, iOS) for exact interpretation.
         * </pre>
         *
         * <code>optional int32 accuracy = 11;</code>
         * @return The accuracy.
         */
        @java.lang.Override
        public int getAccuracy() {
          return accuracy_;
        }
        /**
         * <pre>
         * Estimated location accuracy in meters; recommended when lat/lon
         * are specified and derived from a device's location services
         * (i.e., type = 1). Note that this is the accuracy as reported
         * from the device. Consult OS specific documentation
         * (e.g., Android, iOS) for exact interpretation.
         * </pre>
         *
         * <code>optional int32 accuracy = 11;</code>
         * @param value The accuracy to set.
         * @return This builder for chaining.
         */
        public Builder setAccuracy(int value) {
          bitField0_ |= 0x00000200;
          accuracy_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Estimated location accuracy in meters; recommended when lat/lon
         * are specified and derived from a device's location services
         * (i.e., type = 1). Note that this is the accuracy as reported
         * from the device. Consult OS specific documentation
         * (e.g., Android, iOS) for exact interpretation.
         * </pre>
         *
         * <code>optional int32 accuracy = 11;</code>
         * @return This builder for chaining.
         */
        public Builder clearAccuracy() {
          bitField0_ = (bitField0_ & ~0x00000200);
          accuracy_ = 0;
          onChanged();
          return this;
        }

        private int lastfix_ ;
        /**
         * <pre>
         * Number of seconds since this geolocation fix was established.
         * Note that devices may cache location data across multiple fetches.
         * Ideally, this value should be from the time the actual fix was taken.
         * </pre>
         *
         * <code>optional int32 lastfix = 12;</code>
         * @return Whether the lastfix field is set.
         */
        @java.lang.Override
        public boolean hasLastfix() {
          return ((bitField0_ & 0x00000400) != 0);
        }
        /**
         * <pre>
         * Number of seconds since this geolocation fix was established.
         * Note that devices may cache location data across multiple fetches.
         * Ideally, this value should be from the time the actual fix was taken.
         * </pre>
         *
         * <code>optional int32 lastfix = 12;</code>
         * @return The lastfix.
         */
        @java.lang.Override
        public int getLastfix() {
          return lastfix_;
        }
        /**
         * <pre>
         * Number of seconds since this geolocation fix was established.
         * Note that devices may cache location data across multiple fetches.
         * Ideally, this value should be from the time the actual fix was taken.
         * </pre>
         *
         * <code>optional int32 lastfix = 12;</code>
         * @param value The lastfix to set.
         * @return This builder for chaining.
         */
        public Builder setLastfix(int value) {
          bitField0_ |= 0x00000400;
          lastfix_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Number of seconds since this geolocation fix was established.
         * Note that devices may cache location data across multiple fetches.
         * Ideally, this value should be from the time the actual fix was taken.
         * </pre>
         *
         * <code>optional int32 lastfix = 12;</code>
         * @return This builder for chaining.
         */
        public Builder clearLastfix() {
          bitField0_ = (bitField0_ & ~0x00000400);
          lastfix_ = 0;
          onChanged();
          return this;
        }

        private int ipservice_ ;
        /**
         * <pre>
         * Service or provider used to determine geolocation from IP
         * address if applicable (i.e., type = 2).
         * Refer to enum com.iabtechlab.adcom.v1.enums.LocationService for generic values.
         * </pre>
         *
         * <code>optional int32 ipservice = 13;</code>
         * @return Whether the ipservice field is set.
         */
        @java.lang.Override
        public boolean hasIpservice() {
          return ((bitField0_ & 0x00000800) != 0);
        }
        /**
         * <pre>
         * Service or provider used to determine geolocation from IP
         * address if applicable (i.e., type = 2).
         * Refer to enum com.iabtechlab.adcom.v1.enums.LocationService for generic values.
         * </pre>
         *
         * <code>optional int32 ipservice = 13;</code>
         * @return The ipservice.
         */
        @java.lang.Override
        public int getIpservice() {
          return ipservice_;
        }
        /**
         * <pre>
         * Service or provider used to determine geolocation from IP
         * address if applicable (i.e., type = 2).
         * Refer to enum com.iabtechlab.adcom.v1.enums.LocationService for generic values.
         * </pre>
         *
         * <code>optional int32 ipservice = 13;</code>
         * @param value The ipservice to set.
         * @return This builder for chaining.
         */
        public Builder setIpservice(int value) {
          bitField0_ |= 0x00000800;
          ipservice_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Service or provider used to determine geolocation from IP
         * address if applicable (i.e., type = 2).
         * Refer to enum com.iabtechlab.adcom.v1.enums.LocationService for generic values.
         * </pre>
         *
         * <code>optional int32 ipservice = 13;</code>
         * @return This builder for chaining.
         */
        public Builder clearIpservice() {
          bitField0_ = (bitField0_ & ~0x00000800);
          ipservice_ = 0;
          onChanged();
          return this;
        }

        private int utcoffset_ ;
        /**
         * <pre>
         * Local time as the number +/- of minutes from UTC.
         * </pre>
         *
         * <code>optional int32 utcoffset = 10;</code>
         * @return Whether the utcoffset field is set.
         */
        @java.lang.Override
        public boolean hasUtcoffset() {
          return ((bitField0_ & 0x00001000) != 0);
        }
        /**
         * <pre>
         * Local time as the number +/- of minutes from UTC.
         * </pre>
         *
         * <code>optional int32 utcoffset = 10;</code>
         * @return The utcoffset.
         */
        @java.lang.Override
        public int getUtcoffset() {
          return utcoffset_;
        }
        /**
         * <pre>
         * Local time as the number +/- of minutes from UTC.
         * </pre>
         *
         * <code>optional int32 utcoffset = 10;</code>
         * @param value The utcoffset to set.
         * @return This builder for chaining.
         */
        public Builder setUtcoffset(int value) {
          bitField0_ |= 0x00001000;
          utcoffset_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Local time as the number +/- of minutes from UTC.
         * </pre>
         *
         * <code>optional int32 utcoffset = 10;</code>
         * @return This builder for chaining.
         */
        public Builder clearUtcoffset() {
          bitField0_ = (bitField0_ & ~0x00001000);
          utcoffset_ = 0;
          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:com.iabtechlab.openrtb.v2.BidRequest.Geo)
      }

      // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.BidRequest.Geo)
      private static final com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo DEFAULT_INSTANCE;
      static {
        DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo();
      }

      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo getDefaultInstance() {
        return DEFAULT_INSTANCE;
      }

      @java.lang.Deprecated public static final com.google.protobuf.Parser<Geo>
          PARSER = new com.google.protobuf.AbstractParser<Geo>() {
        @java.lang.Override
        public Geo parsePartialFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return new Geo(input, extensionRegistry);
        }
      };

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

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

      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo getDefaultInstanceForType() {
        return DEFAULT_INSTANCE;
      }

    }

    public interface UserAgentOrBuilder extends
        // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.BidRequest.UserAgent)
        com.google.protobuf.GeneratedMessageV3.
            ExtendableMessageOrBuilder<UserAgent> {

      /**
       * <pre>
       * Each BrandVersion object identifies a browser
       * or similar software component. Implementers should send brands and
       * versions derived from the Sec-CH-UA-Full-Version-List header
       * or an equivalent JavaScript accessor from NavigatorUAData interface.
       * This header or accessor are only available for browsers that support User-Agent Client Hints.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.BrandVersion browsers = 1;</code>
       */
      java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion> 
          getBrowsersList();
      /**
       * <pre>
       * Each BrandVersion object identifies a browser
       * or similar software component. Implementers should send brands and
       * versions derived from the Sec-CH-UA-Full-Version-List header
       * or an equivalent JavaScript accessor from NavigatorUAData interface.
       * This header or accessor are only available for browsers that support User-Agent Client Hints.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.BrandVersion browsers = 1;</code>
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion getBrowsers(int index);
      /**
       * <pre>
       * Each BrandVersion object identifies a browser
       * or similar software component. Implementers should send brands and
       * versions derived from the Sec-CH-UA-Full-Version-List header
       * or an equivalent JavaScript accessor from NavigatorUAData interface.
       * This header or accessor are only available for browsers that support User-Agent Client Hints.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.BrandVersion browsers = 1;</code>
       */
      int getBrowsersCount();
      /**
       * <pre>
       * Each BrandVersion object identifies a browser
       * or similar software component. Implementers should send brands and
       * versions derived from the Sec-CH-UA-Full-Version-List header
       * or an equivalent JavaScript accessor from NavigatorUAData interface.
       * This header or accessor are only available for browsers that support User-Agent Client Hints.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.BrandVersion browsers = 1;</code>
       */
      java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersionOrBuilder> 
          getBrowsersOrBuilderList();
      /**
       * <pre>
       * Each BrandVersion object identifies a browser
       * or similar software component. Implementers should send brands and
       * versions derived from the Sec-CH-UA-Full-Version-List header
       * or an equivalent JavaScript accessor from NavigatorUAData interface.
       * This header or accessor are only available for browsers that support User-Agent Client Hints.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.BrandVersion browsers = 1;</code>
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersionOrBuilder getBrowsersOrBuilder(
          int index);

      /**
       * <pre>
       * A BrandVersion object that identifies the
       * user agent’s execution platform / OS. Implementers should send a brand
       * derived from the Sec-CH-UA-Platform header, and version derived
       * from the Sec-CH-UA-Platform-Version header
       * or an equivalent JavaScript accessor from NavigatorUAData interface.
       * This header or accessor are only available for browsers that support User-Agent Client Hints.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.BrandVersion platform = 2;</code>
       * @return Whether the platform field is set.
       */
      boolean hasPlatform();
      /**
       * <pre>
       * A BrandVersion object that identifies the
       * user agent’s execution platform / OS. Implementers should send a brand
       * derived from the Sec-CH-UA-Platform header, and version derived
       * from the Sec-CH-UA-Platform-Version header
       * or an equivalent JavaScript accessor from NavigatorUAData interface.
       * This header or accessor are only available for browsers that support User-Agent Client Hints.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.BrandVersion platform = 2;</code>
       * @return The platform.
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion getPlatform();
      /**
       * <pre>
       * A BrandVersion object that identifies the
       * user agent’s execution platform / OS. Implementers should send a brand
       * derived from the Sec-CH-UA-Platform header, and version derived
       * from the Sec-CH-UA-Platform-Version header
       * or an equivalent JavaScript accessor from NavigatorUAData interface.
       * This header or accessor are only available for browsers that support User-Agent Client Hints.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.BrandVersion platform = 2;</code>
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersionOrBuilder getPlatformOrBuilder();

      /**
       * <pre>
       * 1 if the agent prefers a "mobile" version of the content, if available,
       * i.e. optimized for small screens or touch input.
       * 0 if the agent prefers the "desktop" or "full" content.
       * Implementers should derive this value from the Sec-CH-UA-Mobile header
       * or an equivalent JavaScript accessor from NavigatorUAData interface.
       * This header or accessor are only available for browsers that support User-Agent Client Hints.
       * </pre>
       *
       * <code>optional bool mobile = 3;</code>
       * @return Whether the mobile field is set.
       */
      boolean hasMobile();
      /**
       * <pre>
       * 1 if the agent prefers a "mobile" version of the content, if available,
       * i.e. optimized for small screens or touch input.
       * 0 if the agent prefers the "desktop" or "full" content.
       * Implementers should derive this value from the Sec-CH-UA-Mobile header
       * or an equivalent JavaScript accessor from NavigatorUAData interface.
       * This header or accessor are only available for browsers that support User-Agent Client Hints.
       * </pre>
       *
       * <code>optional bool mobile = 3;</code>
       * @return The mobile.
       */
      boolean getMobile();

      /**
       * <pre>
       * Device’s major binary architecture, e.g. "x86" or "arm".
       * Implementers should retrieve this value from the Sec-CH-UA-Arch header
       * or an equivalent JavaScript accessor from NavigatorUAData interface.
       * This header or accessor are only available for browsers that support User-Agent Client Hints.
       * </pre>
       *
       * <code>optional string architecture = 4;</code>
       * @return Whether the architecture field is set.
       */
      boolean hasArchitecture();
      /**
       * <pre>
       * Device’s major binary architecture, e.g. "x86" or "arm".
       * Implementers should retrieve this value from the Sec-CH-UA-Arch header
       * or an equivalent JavaScript accessor from NavigatorUAData interface.
       * This header or accessor are only available for browsers that support User-Agent Client Hints.
       * </pre>
       *
       * <code>optional string architecture = 4;</code>
       * @return The architecture.
       */
      java.lang.String getArchitecture();
      /**
       * <pre>
       * Device’s major binary architecture, e.g. "x86" or "arm".
       * Implementers should retrieve this value from the Sec-CH-UA-Arch header
       * or an equivalent JavaScript accessor from NavigatorUAData interface.
       * This header or accessor are only available for browsers that support User-Agent Client Hints.
       * </pre>
       *
       * <code>optional string architecture = 4;</code>
       * @return The bytes for architecture.
       */
      com.google.protobuf.ByteString
          getArchitectureBytes();

      /**
       * <pre>
       * Device’s bitness, e.g. "64" for 64-bit architecture.
       * Implementers should retrieve this value from the Sec-CH-UA-Bitness header
       * or an equivalent JavaScript accessor from NavigatorUAData interface.
       * This header or accessor are only available for browsers that support User-Agent Client Hints.
       * </pre>
       *
       * <code>optional string bitness = 5;</code>
       * @return Whether the bitness field is set.
       */
      boolean hasBitness();
      /**
       * <pre>
       * Device’s bitness, e.g. "64" for 64-bit architecture.
       * Implementers should retrieve this value from the Sec-CH-UA-Bitness header
       * or an equivalent JavaScript accessor from NavigatorUAData interface.
       * This header or accessor are only available for browsers that support User-Agent Client Hints.
       * </pre>
       *
       * <code>optional string bitness = 5;</code>
       * @return The bitness.
       */
      java.lang.String getBitness();
      /**
       * <pre>
       * Device’s bitness, e.g. "64" for 64-bit architecture.
       * Implementers should retrieve this value from the Sec-CH-UA-Bitness header
       * or an equivalent JavaScript accessor from NavigatorUAData interface.
       * This header or accessor are only available for browsers that support User-Agent Client Hints.
       * </pre>
       *
       * <code>optional string bitness = 5;</code>
       * @return The bytes for bitness.
       */
      com.google.protobuf.ByteString
          getBitnessBytes();

      /**
       * <pre>
       * Device model. Implementers should retrieve this value from the Sec-CH-UA-Model header
       * or an equivalent JavaScript accessor from NavigatorUAData interface.
       * This header or accessor are only available for browsers that support User-Agent Client Hints.
       * </pre>
       *
       * <code>optional string model = 6;</code>
       * @return Whether the model field is set.
       */
      boolean hasModel();
      /**
       * <pre>
       * Device model. Implementers should retrieve this value from the Sec-CH-UA-Model header
       * or an equivalent JavaScript accessor from NavigatorUAData interface.
       * This header or accessor are only available for browsers that support User-Agent Client Hints.
       * </pre>
       *
       * <code>optional string model = 6;</code>
       * @return The model.
       */
      java.lang.String getModel();
      /**
       * <pre>
       * Device model. Implementers should retrieve this value from the Sec-CH-UA-Model header
       * or an equivalent JavaScript accessor from NavigatorUAData interface.
       * This header or accessor are only available for browsers that support User-Agent Client Hints.
       * </pre>
       *
       * <code>optional string model = 6;</code>
       * @return The bytes for model.
       */
      com.google.protobuf.ByteString
          getModelBytes();

      /**
       * <pre>
       * The source of data used to create this object
       * Refer to enum com.iabtechlab.adcom.v1.enums.UserAgentSource for generic values
       * </pre>
       *
       * <code>optional int32 source = 7 [default = 0];</code>
       * @return Whether the source field is set.
       */
      boolean hasSource();
      /**
       * <pre>
       * The source of data used to create this object
       * Refer to enum com.iabtechlab.adcom.v1.enums.UserAgentSource for generic values
       * </pre>
       *
       * <code>optional int32 source = 7 [default = 0];</code>
       * @return The source.
       */
      int getSource();
    }
    /**
     * <pre>
     * OpenRTB 2.6: Structured user agent information, which can be used when a client supports
     * User-Agent Client Hints. If both device.ua and device.sua are present in the bid request,
     * device.sua should be considered the more accurate representation of the device attributes.
     * This is because the device.ua may contain a frozen or reduced user agent string
     * due to deprecation of user agent strings by browsers.
     * </pre>
     *
     * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.UserAgent}
     */
    public static final class UserAgent extends
        com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
          UserAgent> implements
        // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.BidRequest.UserAgent)
        UserAgentOrBuilder {
    private static final long serialVersionUID = 0L;
      // Use UserAgent.newBuilder() to construct.
      private UserAgent(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent, ?> builder) {
        super(builder);
      }
      private UserAgent() {
        browsers_ = java.util.Collections.emptyList();
        architecture_ = "";
        bitness_ = "";
        model_ = "";
      }

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

      @java.lang.Override
      public final com.google.protobuf.UnknownFieldSet
      getUnknownFields() {
        return this.unknownFields;
      }
      private UserAgent(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        this();
        if (extensionRegistry == null) {
          throw new java.lang.NullPointerException();
        }
        int mutable_bitField0_ = 0;
        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
            com.google.protobuf.UnknownFieldSet.newBuilder();
        try {
          boolean done = false;
          while (!done) {
            int tag = input.readTag();
            switch (tag) {
              case 0:
                done = true;
                break;
              case 10: {
                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
                  browsers_ = new java.util.ArrayList<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion>();
                  mutable_bitField0_ |= 0x00000001;
                }
                browsers_.add(
                    input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion.PARSER, extensionRegistry));
                break;
              }
              case 18: {
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion.Builder subBuilder = null;
                if (((bitField0_ & 0x00000001) != 0)) {
                  subBuilder = platform_.toBuilder();
                }
                platform_ = input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion.PARSER, extensionRegistry);
                if (subBuilder != null) {
                  subBuilder.mergeFrom(platform_);
                  platform_ = subBuilder.buildPartial();
                }
                bitField0_ |= 0x00000001;
                break;
              }
              case 24: {
                bitField0_ |= 0x00000002;
                mobile_ = input.readBool();
                break;
              }
              case 34: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000004;
                architecture_ = bs;
                break;
              }
              case 42: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000008;
                bitness_ = bs;
                break;
              }
              case 50: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000010;
                model_ = bs;
                break;
              }
              case 56: {
                bitField0_ |= 0x00000020;
                source_ = input.readInt32();
                break;
              }
              default: {
                if (!parseUnknownField(
                    input, unknownFields, extensionRegistry, tag)) {
                  done = true;
                }
                break;
              }
            }
          }
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          throw e.setUnfinishedMessage(this);
        } catch (java.io.IOException e) {
          throw new com.google.protobuf.InvalidProtocolBufferException(
              e).setUnfinishedMessage(this);
        } finally {
          if (((mutable_bitField0_ & 0x00000001) != 0)) {
            browsers_ = java.util.Collections.unmodifiableList(browsers_);
          }
          this.unknownFields = unknownFields.build();
          makeExtensionsImmutable();
        }
      }
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_UserAgent_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_UserAgent_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent.Builder.class);
      }

      private int bitField0_;
      public static final int BROWSERS_FIELD_NUMBER = 1;
      private java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion> browsers_;
      /**
       * <pre>
       * Each BrandVersion object identifies a browser
       * or similar software component. Implementers should send brands and
       * versions derived from the Sec-CH-UA-Full-Version-List header
       * or an equivalent JavaScript accessor from NavigatorUAData interface.
       * This header or accessor are only available for browsers that support User-Agent Client Hints.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.BrandVersion browsers = 1;</code>
       */
      @java.lang.Override
      public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion> getBrowsersList() {
        return browsers_;
      }
      /**
       * <pre>
       * Each BrandVersion object identifies a browser
       * or similar software component. Implementers should send brands and
       * versions derived from the Sec-CH-UA-Full-Version-List header
       * or an equivalent JavaScript accessor from NavigatorUAData interface.
       * This header or accessor are only available for browsers that support User-Agent Client Hints.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.BrandVersion browsers = 1;</code>
       */
      @java.lang.Override
      public java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersionOrBuilder> 
          getBrowsersOrBuilderList() {
        return browsers_;
      }
      /**
       * <pre>
       * Each BrandVersion object identifies a browser
       * or similar software component. Implementers should send brands and
       * versions derived from the Sec-CH-UA-Full-Version-List header
       * or an equivalent JavaScript accessor from NavigatorUAData interface.
       * This header or accessor are only available for browsers that support User-Agent Client Hints.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.BrandVersion browsers = 1;</code>
       */
      @java.lang.Override
      public int getBrowsersCount() {
        return browsers_.size();
      }
      /**
       * <pre>
       * Each BrandVersion object identifies a browser
       * or similar software component. Implementers should send brands and
       * versions derived from the Sec-CH-UA-Full-Version-List header
       * or an equivalent JavaScript accessor from NavigatorUAData interface.
       * This header or accessor are only available for browsers that support User-Agent Client Hints.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.BrandVersion browsers = 1;</code>
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion getBrowsers(int index) {
        return browsers_.get(index);
      }
      /**
       * <pre>
       * Each BrandVersion object identifies a browser
       * or similar software component. Implementers should send brands and
       * versions derived from the Sec-CH-UA-Full-Version-List header
       * or an equivalent JavaScript accessor from NavigatorUAData interface.
       * This header or accessor are only available for browsers that support User-Agent Client Hints.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.BrandVersion browsers = 1;</code>
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersionOrBuilder getBrowsersOrBuilder(
          int index) {
        return browsers_.get(index);
      }

      public static final int PLATFORM_FIELD_NUMBER = 2;
      private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion platform_;
      /**
       * <pre>
       * A BrandVersion object that identifies the
       * user agent’s execution platform / OS. Implementers should send a brand
       * derived from the Sec-CH-UA-Platform header, and version derived
       * from the Sec-CH-UA-Platform-Version header
       * or an equivalent JavaScript accessor from NavigatorUAData interface.
       * This header or accessor are only available for browsers that support User-Agent Client Hints.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.BrandVersion platform = 2;</code>
       * @return Whether the platform field is set.
       */
      @java.lang.Override
      public boolean hasPlatform() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <pre>
       * A BrandVersion object that identifies the
       * user agent’s execution platform / OS. Implementers should send a brand
       * derived from the Sec-CH-UA-Platform header, and version derived
       * from the Sec-CH-UA-Platform-Version header
       * or an equivalent JavaScript accessor from NavigatorUAData interface.
       * This header or accessor are only available for browsers that support User-Agent Client Hints.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.BrandVersion platform = 2;</code>
       * @return The platform.
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion getPlatform() {
        return platform_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion.getDefaultInstance() : platform_;
      }
      /**
       * <pre>
       * A BrandVersion object that identifies the
       * user agent’s execution platform / OS. Implementers should send a brand
       * derived from the Sec-CH-UA-Platform header, and version derived
       * from the Sec-CH-UA-Platform-Version header
       * or an equivalent JavaScript accessor from NavigatorUAData interface.
       * This header or accessor are only available for browsers that support User-Agent Client Hints.
       * RECOMMENDED by the OpenRTB specification.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.BrandVersion platform = 2;</code>
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersionOrBuilder getPlatformOrBuilder() {
        return platform_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion.getDefaultInstance() : platform_;
      }

      public static final int MOBILE_FIELD_NUMBER = 3;
      private boolean mobile_;
      /**
       * <pre>
       * 1 if the agent prefers a "mobile" version of the content, if available,
       * i.e. optimized for small screens or touch input.
       * 0 if the agent prefers the "desktop" or "full" content.
       * Implementers should derive this value from the Sec-CH-UA-Mobile header
       * or an equivalent JavaScript accessor from NavigatorUAData interface.
       * This header or accessor are only available for browsers that support User-Agent Client Hints.
       * </pre>
       *
       * <code>optional bool mobile = 3;</code>
       * @return Whether the mobile field is set.
       */
      @java.lang.Override
      public boolean hasMobile() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <pre>
       * 1 if the agent prefers a "mobile" version of the content, if available,
       * i.e. optimized for small screens or touch input.
       * 0 if the agent prefers the "desktop" or "full" content.
       * Implementers should derive this value from the Sec-CH-UA-Mobile header
       * or an equivalent JavaScript accessor from NavigatorUAData interface.
       * This header or accessor are only available for browsers that support User-Agent Client Hints.
       * </pre>
       *
       * <code>optional bool mobile = 3;</code>
       * @return The mobile.
       */
      @java.lang.Override
      public boolean getMobile() {
        return mobile_;
      }

      public static final int ARCHITECTURE_FIELD_NUMBER = 4;
      private volatile java.lang.Object architecture_;
      /**
       * <pre>
       * Device’s major binary architecture, e.g. "x86" or "arm".
       * Implementers should retrieve this value from the Sec-CH-UA-Arch header
       * or an equivalent JavaScript accessor from NavigatorUAData interface.
       * This header or accessor are only available for browsers that support User-Agent Client Hints.
       * </pre>
       *
       * <code>optional string architecture = 4;</code>
       * @return Whether the architecture field is set.
       */
      @java.lang.Override
      public boolean hasArchitecture() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <pre>
       * Device’s major binary architecture, e.g. "x86" or "arm".
       * Implementers should retrieve this value from the Sec-CH-UA-Arch header
       * or an equivalent JavaScript accessor from NavigatorUAData interface.
       * This header or accessor are only available for browsers that support User-Agent Client Hints.
       * </pre>
       *
       * <code>optional string architecture = 4;</code>
       * @return The architecture.
       */
      @java.lang.Override
      public java.lang.String getArchitecture() {
        java.lang.Object ref = architecture_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            architecture_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Device’s major binary architecture, e.g. "x86" or "arm".
       * Implementers should retrieve this value from the Sec-CH-UA-Arch header
       * or an equivalent JavaScript accessor from NavigatorUAData interface.
       * This header or accessor are only available for browsers that support User-Agent Client Hints.
       * </pre>
       *
       * <code>optional string architecture = 4;</code>
       * @return The bytes for architecture.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getArchitectureBytes() {
        java.lang.Object ref = architecture_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          architecture_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int BITNESS_FIELD_NUMBER = 5;
      private volatile java.lang.Object bitness_;
      /**
       * <pre>
       * Device’s bitness, e.g. "64" for 64-bit architecture.
       * Implementers should retrieve this value from the Sec-CH-UA-Bitness header
       * or an equivalent JavaScript accessor from NavigatorUAData interface.
       * This header or accessor are only available for browsers that support User-Agent Client Hints.
       * </pre>
       *
       * <code>optional string bitness = 5;</code>
       * @return Whether the bitness field is set.
       */
      @java.lang.Override
      public boolean hasBitness() {
        return ((bitField0_ & 0x00000008) != 0);
      }
      /**
       * <pre>
       * Device’s bitness, e.g. "64" for 64-bit architecture.
       * Implementers should retrieve this value from the Sec-CH-UA-Bitness header
       * or an equivalent JavaScript accessor from NavigatorUAData interface.
       * This header or accessor are only available for browsers that support User-Agent Client Hints.
       * </pre>
       *
       * <code>optional string bitness = 5;</code>
       * @return The bitness.
       */
      @java.lang.Override
      public java.lang.String getBitness() {
        java.lang.Object ref = bitness_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            bitness_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Device’s bitness, e.g. "64" for 64-bit architecture.
       * Implementers should retrieve this value from the Sec-CH-UA-Bitness header
       * or an equivalent JavaScript accessor from NavigatorUAData interface.
       * This header or accessor are only available for browsers that support User-Agent Client Hints.
       * </pre>
       *
       * <code>optional string bitness = 5;</code>
       * @return The bytes for bitness.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getBitnessBytes() {
        java.lang.Object ref = bitness_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          bitness_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int MODEL_FIELD_NUMBER = 6;
      private volatile java.lang.Object model_;
      /**
       * <pre>
       * Device model. Implementers should retrieve this value from the Sec-CH-UA-Model header
       * or an equivalent JavaScript accessor from NavigatorUAData interface.
       * This header or accessor are only available for browsers that support User-Agent Client Hints.
       * </pre>
       *
       * <code>optional string model = 6;</code>
       * @return Whether the model field is set.
       */
      @java.lang.Override
      public boolean hasModel() {
        return ((bitField0_ & 0x00000010) != 0);
      }
      /**
       * <pre>
       * Device model. Implementers should retrieve this value from the Sec-CH-UA-Model header
       * or an equivalent JavaScript accessor from NavigatorUAData interface.
       * This header or accessor are only available for browsers that support User-Agent Client Hints.
       * </pre>
       *
       * <code>optional string model = 6;</code>
       * @return The model.
       */
      @java.lang.Override
      public java.lang.String getModel() {
        java.lang.Object ref = model_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            model_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Device model. Implementers should retrieve this value from the Sec-CH-UA-Model header
       * or an equivalent JavaScript accessor from NavigatorUAData interface.
       * This header or accessor are only available for browsers that support User-Agent Client Hints.
       * </pre>
       *
       * <code>optional string model = 6;</code>
       * @return The bytes for model.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getModelBytes() {
        java.lang.Object ref = model_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          model_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int SOURCE_FIELD_NUMBER = 7;
      private int source_;
      /**
       * <pre>
       * The source of data used to create this object
       * Refer to enum com.iabtechlab.adcom.v1.enums.UserAgentSource for generic values
       * </pre>
       *
       * <code>optional int32 source = 7 [default = 0];</code>
       * @return Whether the source field is set.
       */
      @java.lang.Override
      public boolean hasSource() {
        return ((bitField0_ & 0x00000020) != 0);
      }
      /**
       * <pre>
       * The source of data used to create this object
       * Refer to enum com.iabtechlab.adcom.v1.enums.UserAgentSource for generic values
       * </pre>
       *
       * <code>optional int32 source = 7 [default = 0];</code>
       * @return The source.
       */
      @java.lang.Override
      public int getSource() {
        return source_;
      }

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

        for (int i = 0; i < getBrowsersCount(); i++) {
          if (!getBrowsers(i).isInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
        }
        if (hasPlatform()) {
          if (!getPlatform().isInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
        }
        if (!extensionsAreInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
        memoizedIsInitialized = 1;
        return true;
      }

      @java.lang.Override
      public void writeTo(com.google.protobuf.CodedOutputStream output)
                          throws java.io.IOException {
        com.google.protobuf.GeneratedMessageV3
          .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent>.ExtensionWriter
            extensionWriter = newExtensionWriter();
        for (int i = 0; i < browsers_.size(); i++) {
          output.writeMessage(1, browsers_.get(i));
        }
        if (((bitField0_ & 0x00000001) != 0)) {
          output.writeMessage(2, getPlatform());
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          output.writeBool(3, mobile_);
        }
        if (((bitField0_ & 0x00000004) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 4, architecture_);
        }
        if (((bitField0_ & 0x00000008) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 5, bitness_);
        }
        if (((bitField0_ & 0x00000010) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 6, model_);
        }
        if (((bitField0_ & 0x00000020) != 0)) {
          output.writeInt32(7, source_);
        }
        extensionWriter.writeUntil(10000, output);
        unknownFields.writeTo(output);
      }

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

        size = 0;
        for (int i = 0; i < browsers_.size(); i++) {
          size += com.google.protobuf.CodedOutputStream
            .computeMessageSize(1, browsers_.get(i));
        }
        if (((bitField0_ & 0x00000001) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeMessageSize(2, getPlatform());
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeBoolSize(3, mobile_);
        }
        if (((bitField0_ & 0x00000004) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, architecture_);
        }
        if (((bitField0_ & 0x00000008) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(5, bitness_);
        }
        if (((bitField0_ & 0x00000010) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(6, model_);
        }
        if (((bitField0_ & 0x00000020) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeInt32Size(7, source_);
        }
        size += extensionsSerializedSize();
        size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent)) {
          return super.equals(obj);
        }
        com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent other = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent) obj;

        if (!getBrowsersList()
            .equals(other.getBrowsersList())) return false;
        if (hasPlatform() != other.hasPlatform()) return false;
        if (hasPlatform()) {
          if (!getPlatform()
              .equals(other.getPlatform())) return false;
        }
        if (hasMobile() != other.hasMobile()) return false;
        if (hasMobile()) {
          if (getMobile()
              != other.getMobile()) return false;
        }
        if (hasArchitecture() != other.hasArchitecture()) return false;
        if (hasArchitecture()) {
          if (!getArchitecture()
              .equals(other.getArchitecture())) return false;
        }
        if (hasBitness() != other.hasBitness()) return false;
        if (hasBitness()) {
          if (!getBitness()
              .equals(other.getBitness())) return false;
        }
        if (hasModel() != other.hasModel()) return false;
        if (hasModel()) {
          if (!getModel()
              .equals(other.getModel())) return false;
        }
        if (hasSource() != other.hasSource()) return false;
        if (hasSource()) {
          if (getSource()
              != other.getSource()) return false;
        }
        if (!unknownFields.equals(other.unknownFields)) return false;
        if (!getExtensionFields().equals(other.getExtensionFields()))
          return false;
        return true;
      }

      @java.lang.Override
      public int hashCode() {
        if (memoizedHashCode != 0) {
          return memoizedHashCode;
        }
        int hash = 41;
        hash = (19 * hash) + getDescriptor().hashCode();
        if (getBrowsersCount() > 0) {
          hash = (37 * hash) + BROWSERS_FIELD_NUMBER;
          hash = (53 * hash) + getBrowsersList().hashCode();
        }
        if (hasPlatform()) {
          hash = (37 * hash) + PLATFORM_FIELD_NUMBER;
          hash = (53 * hash) + getPlatform().hashCode();
        }
        if (hasMobile()) {
          hash = (37 * hash) + MOBILE_FIELD_NUMBER;
          hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
              getMobile());
        }
        if (hasArchitecture()) {
          hash = (37 * hash) + ARCHITECTURE_FIELD_NUMBER;
          hash = (53 * hash) + getArchitecture().hashCode();
        }
        if (hasBitness()) {
          hash = (37 * hash) + BITNESS_FIELD_NUMBER;
          hash = (53 * hash) + getBitness().hashCode();
        }
        if (hasModel()) {
          hash = (37 * hash) + MODEL_FIELD_NUMBER;
          hash = (53 * hash) + getModel().hashCode();
        }
        if (hasSource()) {
          hash = (37 * hash) + SOURCE_FIELD_NUMBER;
          hash = (53 * hash) + getSource();
        }
        hash = hashFields(hash, getExtensionFields());
        hash = (29 * hash) + unknownFields.hashCode();
        memoizedHashCode = hash;
        return hash;
      }

      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent parseFrom(
          java.nio.ByteBuffer data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent parseFrom(
          java.nio.ByteBuffer data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent parseFrom(
          com.google.protobuf.ByteString data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent parseFrom(
          com.google.protobuf.ByteString data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent parseFrom(byte[] data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent parseFrom(
          byte[] data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent parseFrom(java.io.InputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent parseDelimitedFrom(java.io.InputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseDelimitedWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent parseFrom(
          com.google.protobuf.CodedInputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent 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>
       * OpenRTB 2.6: Structured user agent information, which can be used when a client supports
       * User-Agent Client Hints. If both device.ua and device.sua are present in the bid request,
       * device.sua should be considered the more accurate representation of the device attributes.
       * This is because the device.ua may contain a frozen or reduced user agent string
       * due to deprecation of user agent strings by browsers.
       * </pre>
       *
       * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.UserAgent}
       */
      public static final class Builder extends
          com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent, Builder> implements
          // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.BidRequest.UserAgent)
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgentOrBuilder {
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_UserAgent_descriptor;
        }

        @java.lang.Override
        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_UserAgent_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent.Builder.class);
        }

        // Construct using com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent.newBuilder()
        private Builder() {
          maybeForceBuilderInitialization();
        }

        private Builder(
            com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
          super(parent);
          maybeForceBuilderInitialization();
        }
        private void maybeForceBuilderInitialization() {
          if (com.google.protobuf.GeneratedMessageV3
                  .alwaysUseFieldBuilders) {
            getBrowsersFieldBuilder();
            getPlatformFieldBuilder();
          }
        }
        @java.lang.Override
        public Builder clear() {
          super.clear();
          if (browsersBuilder_ == null) {
            browsers_ = java.util.Collections.emptyList();
            bitField0_ = (bitField0_ & ~0x00000001);
          } else {
            browsersBuilder_.clear();
          }
          if (platformBuilder_ == null) {
            platform_ = null;
          } else {
            platformBuilder_.clear();
          }
          bitField0_ = (bitField0_ & ~0x00000002);
          mobile_ = false;
          bitField0_ = (bitField0_ & ~0x00000004);
          architecture_ = "";
          bitField0_ = (bitField0_ & ~0x00000008);
          bitness_ = "";
          bitField0_ = (bitField0_ & ~0x00000010);
          model_ = "";
          bitField0_ = (bitField0_ & ~0x00000020);
          source_ = 0;
          bitField0_ = (bitField0_ & ~0x00000040);
          return this;
        }

        @java.lang.Override
        public com.google.protobuf.Descriptors.Descriptor
            getDescriptorForType() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_UserAgent_descriptor;
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent getDefaultInstanceForType() {
          return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent.getDefaultInstance();
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent build() {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent result = buildPartial();
          if (!result.isInitialized()) {
            throw newUninitializedMessageException(result);
          }
          return result;
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent buildPartial() {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent result = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent(this);
          int from_bitField0_ = bitField0_;
          int to_bitField0_ = 0;
          if (browsersBuilder_ == null) {
            if (((bitField0_ & 0x00000001) != 0)) {
              browsers_ = java.util.Collections.unmodifiableList(browsers_);
              bitField0_ = (bitField0_ & ~0x00000001);
            }
            result.browsers_ = browsers_;
          } else {
            result.browsers_ = browsersBuilder_.build();
          }
          if (((from_bitField0_ & 0x00000002) != 0)) {
            if (platformBuilder_ == null) {
              result.platform_ = platform_;
            } else {
              result.platform_ = platformBuilder_.build();
            }
            to_bitField0_ |= 0x00000001;
          }
          if (((from_bitField0_ & 0x00000004) != 0)) {
            result.mobile_ = mobile_;
            to_bitField0_ |= 0x00000002;
          }
          if (((from_bitField0_ & 0x00000008) != 0)) {
            to_bitField0_ |= 0x00000004;
          }
          result.architecture_ = architecture_;
          if (((from_bitField0_ & 0x00000010) != 0)) {
            to_bitField0_ |= 0x00000008;
          }
          result.bitness_ = bitness_;
          if (((from_bitField0_ & 0x00000020) != 0)) {
            to_bitField0_ |= 0x00000010;
          }
          result.model_ = model_;
          if (((from_bitField0_ & 0x00000040) != 0)) {
            result.source_ = source_;
            to_bitField0_ |= 0x00000020;
          }
          result.bitField0_ = to_bitField0_;
          onBuilt();
          return result;
        }

        @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 <Type> Builder setExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent, Type> extension,
            Type value) {
          return super.setExtension(extension, value);
        }
        @java.lang.Override
        public <Type> Builder setExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent, java.util.List<Type>> extension,
            int index, Type value) {
          return super.setExtension(extension, index, value);
        }
        @java.lang.Override
        public <Type> Builder addExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent, java.util.List<Type>> extension,
            Type value) {
          return super.addExtension(extension, value);
        }
        @java.lang.Override
        public <Type> Builder clearExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent, ?> extension) {
          return super.clearExtension(extension);
        }
        @java.lang.Override
        public Builder mergeFrom(com.google.protobuf.Message other) {
          if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent) {
            return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent)other);
          } else {
            super.mergeFrom(other);
            return this;
          }
        }

        public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent other) {
          if (other == com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent.getDefaultInstance()) return this;
          if (browsersBuilder_ == null) {
            if (!other.browsers_.isEmpty()) {
              if (browsers_.isEmpty()) {
                browsers_ = other.browsers_;
                bitField0_ = (bitField0_ & ~0x00000001);
              } else {
                ensureBrowsersIsMutable();
                browsers_.addAll(other.browsers_);
              }
              onChanged();
            }
          } else {
            if (!other.browsers_.isEmpty()) {
              if (browsersBuilder_.isEmpty()) {
                browsersBuilder_.dispose();
                browsersBuilder_ = null;
                browsers_ = other.browsers_;
                bitField0_ = (bitField0_ & ~0x00000001);
                browsersBuilder_ = 
                  com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
                     getBrowsersFieldBuilder() : null;
              } else {
                browsersBuilder_.addAllMessages(other.browsers_);
              }
            }
          }
          if (other.hasPlatform()) {
            mergePlatform(other.getPlatform());
          }
          if (other.hasMobile()) {
            setMobile(other.getMobile());
          }
          if (other.hasArchitecture()) {
            bitField0_ |= 0x00000008;
            architecture_ = other.architecture_;
            onChanged();
          }
          if (other.hasBitness()) {
            bitField0_ |= 0x00000010;
            bitness_ = other.bitness_;
            onChanged();
          }
          if (other.hasModel()) {
            bitField0_ |= 0x00000020;
            model_ = other.model_;
            onChanged();
          }
          if (other.hasSource()) {
            setSource(other.getSource());
          }
          this.mergeExtensionFields(other);
          this.mergeUnknownFields(other.unknownFields);
          onChanged();
          return this;
        }

        @java.lang.Override
        public final boolean isInitialized() {
          for (int i = 0; i < getBrowsersCount(); i++) {
            if (!getBrowsers(i).isInitialized()) {
              return false;
            }
          }
          if (hasPlatform()) {
            if (!getPlatform().isInitialized()) {
              return false;
            }
          }
          if (!extensionsAreInitialized()) {
            return false;
          }
          return true;
        }

        @java.lang.Override
        public Builder mergeFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws java.io.IOException {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent parsedMessage = null;
          try {
            parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent) e.getUnfinishedMessage();
            throw e.unwrapIOException();
          } finally {
            if (parsedMessage != null) {
              mergeFrom(parsedMessage);
            }
          }
          return this;
        }
        private int bitField0_;

        private java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion> browsers_ =
          java.util.Collections.emptyList();
        private void ensureBrowsersIsMutable() {
          if (!((bitField0_ & 0x00000001) != 0)) {
            browsers_ = new java.util.ArrayList<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion>(browsers_);
            bitField0_ |= 0x00000001;
           }
        }

        private com.google.protobuf.RepeatedFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersionOrBuilder> browsersBuilder_;

        /**
         * <pre>
         * Each BrandVersion object identifies a browser
         * or similar software component. Implementers should send brands and
         * versions derived from the Sec-CH-UA-Full-Version-List header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.BrandVersion browsers = 1;</code>
         */
        public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion> getBrowsersList() {
          if (browsersBuilder_ == null) {
            return java.util.Collections.unmodifiableList(browsers_);
          } else {
            return browsersBuilder_.getMessageList();
          }
        }
        /**
         * <pre>
         * Each BrandVersion object identifies a browser
         * or similar software component. Implementers should send brands and
         * versions derived from the Sec-CH-UA-Full-Version-List header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.BrandVersion browsers = 1;</code>
         */
        public int getBrowsersCount() {
          if (browsersBuilder_ == null) {
            return browsers_.size();
          } else {
            return browsersBuilder_.getCount();
          }
        }
        /**
         * <pre>
         * Each BrandVersion object identifies a browser
         * or similar software component. Implementers should send brands and
         * versions derived from the Sec-CH-UA-Full-Version-List header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.BrandVersion browsers = 1;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion getBrowsers(int index) {
          if (browsersBuilder_ == null) {
            return browsers_.get(index);
          } else {
            return browsersBuilder_.getMessage(index);
          }
        }
        /**
         * <pre>
         * Each BrandVersion object identifies a browser
         * or similar software component. Implementers should send brands and
         * versions derived from the Sec-CH-UA-Full-Version-List header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.BrandVersion browsers = 1;</code>
         */
        public Builder setBrowsers(
            int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion value) {
          if (browsersBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            ensureBrowsersIsMutable();
            browsers_.set(index, value);
            onChanged();
          } else {
            browsersBuilder_.setMessage(index, value);
          }
          return this;
        }
        /**
         * <pre>
         * Each BrandVersion object identifies a browser
         * or similar software component. Implementers should send brands and
         * versions derived from the Sec-CH-UA-Full-Version-List header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.BrandVersion browsers = 1;</code>
         */
        public Builder setBrowsers(
            int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion.Builder builderForValue) {
          if (browsersBuilder_ == null) {
            ensureBrowsersIsMutable();
            browsers_.set(index, builderForValue.build());
            onChanged();
          } else {
            browsersBuilder_.setMessage(index, builderForValue.build());
          }
          return this;
        }
        /**
         * <pre>
         * Each BrandVersion object identifies a browser
         * or similar software component. Implementers should send brands and
         * versions derived from the Sec-CH-UA-Full-Version-List header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.BrandVersion browsers = 1;</code>
         */
        public Builder addBrowsers(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion value) {
          if (browsersBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            ensureBrowsersIsMutable();
            browsers_.add(value);
            onChanged();
          } else {
            browsersBuilder_.addMessage(value);
          }
          return this;
        }
        /**
         * <pre>
         * Each BrandVersion object identifies a browser
         * or similar software component. Implementers should send brands and
         * versions derived from the Sec-CH-UA-Full-Version-List header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.BrandVersion browsers = 1;</code>
         */
        public Builder addBrowsers(
            int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion value) {
          if (browsersBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            ensureBrowsersIsMutable();
            browsers_.add(index, value);
            onChanged();
          } else {
            browsersBuilder_.addMessage(index, value);
          }
          return this;
        }
        /**
         * <pre>
         * Each BrandVersion object identifies a browser
         * or similar software component. Implementers should send brands and
         * versions derived from the Sec-CH-UA-Full-Version-List header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.BrandVersion browsers = 1;</code>
         */
        public Builder addBrowsers(
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion.Builder builderForValue) {
          if (browsersBuilder_ == null) {
            ensureBrowsersIsMutable();
            browsers_.add(builderForValue.build());
            onChanged();
          } else {
            browsersBuilder_.addMessage(builderForValue.build());
          }
          return this;
        }
        /**
         * <pre>
         * Each BrandVersion object identifies a browser
         * or similar software component. Implementers should send brands and
         * versions derived from the Sec-CH-UA-Full-Version-List header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.BrandVersion browsers = 1;</code>
         */
        public Builder addBrowsers(
            int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion.Builder builderForValue) {
          if (browsersBuilder_ == null) {
            ensureBrowsersIsMutable();
            browsers_.add(index, builderForValue.build());
            onChanged();
          } else {
            browsersBuilder_.addMessage(index, builderForValue.build());
          }
          return this;
        }
        /**
         * <pre>
         * Each BrandVersion object identifies a browser
         * or similar software component. Implementers should send brands and
         * versions derived from the Sec-CH-UA-Full-Version-List header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.BrandVersion browsers = 1;</code>
         */
        public Builder addAllBrowsers(
            java.lang.Iterable<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion> values) {
          if (browsersBuilder_ == null) {
            ensureBrowsersIsMutable();
            com.google.protobuf.AbstractMessageLite.Builder.addAll(
                values, browsers_);
            onChanged();
          } else {
            browsersBuilder_.addAllMessages(values);
          }
          return this;
        }
        /**
         * <pre>
         * Each BrandVersion object identifies a browser
         * or similar software component. Implementers should send brands and
         * versions derived from the Sec-CH-UA-Full-Version-List header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.BrandVersion browsers = 1;</code>
         */
        public Builder clearBrowsers() {
          if (browsersBuilder_ == null) {
            browsers_ = java.util.Collections.emptyList();
            bitField0_ = (bitField0_ & ~0x00000001);
            onChanged();
          } else {
            browsersBuilder_.clear();
          }
          return this;
        }
        /**
         * <pre>
         * Each BrandVersion object identifies a browser
         * or similar software component. Implementers should send brands and
         * versions derived from the Sec-CH-UA-Full-Version-List header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.BrandVersion browsers = 1;</code>
         */
        public Builder removeBrowsers(int index) {
          if (browsersBuilder_ == null) {
            ensureBrowsersIsMutable();
            browsers_.remove(index);
            onChanged();
          } else {
            browsersBuilder_.remove(index);
          }
          return this;
        }
        /**
         * <pre>
         * Each BrandVersion object identifies a browser
         * or similar software component. Implementers should send brands and
         * versions derived from the Sec-CH-UA-Full-Version-List header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.BrandVersion browsers = 1;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion.Builder getBrowsersBuilder(
            int index) {
          return getBrowsersFieldBuilder().getBuilder(index);
        }
        /**
         * <pre>
         * Each BrandVersion object identifies a browser
         * or similar software component. Implementers should send brands and
         * versions derived from the Sec-CH-UA-Full-Version-List header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.BrandVersion browsers = 1;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersionOrBuilder getBrowsersOrBuilder(
            int index) {
          if (browsersBuilder_ == null) {
            return browsers_.get(index);  } else {
            return browsersBuilder_.getMessageOrBuilder(index);
          }
        }
        /**
         * <pre>
         * Each BrandVersion object identifies a browser
         * or similar software component. Implementers should send brands and
         * versions derived from the Sec-CH-UA-Full-Version-List header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.BrandVersion browsers = 1;</code>
         */
        public java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersionOrBuilder> 
             getBrowsersOrBuilderList() {
          if (browsersBuilder_ != null) {
            return browsersBuilder_.getMessageOrBuilderList();
          } else {
            return java.util.Collections.unmodifiableList(browsers_);
          }
        }
        /**
         * <pre>
         * Each BrandVersion object identifies a browser
         * or similar software component. Implementers should send brands and
         * versions derived from the Sec-CH-UA-Full-Version-List header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.BrandVersion browsers = 1;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion.Builder addBrowsersBuilder() {
          return getBrowsersFieldBuilder().addBuilder(
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion.getDefaultInstance());
        }
        /**
         * <pre>
         * Each BrandVersion object identifies a browser
         * or similar software component. Implementers should send brands and
         * versions derived from the Sec-CH-UA-Full-Version-List header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.BrandVersion browsers = 1;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion.Builder addBrowsersBuilder(
            int index) {
          return getBrowsersFieldBuilder().addBuilder(
              index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion.getDefaultInstance());
        }
        /**
         * <pre>
         * Each BrandVersion object identifies a browser
         * or similar software component. Implementers should send brands and
         * versions derived from the Sec-CH-UA-Full-Version-List header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.BrandVersion browsers = 1;</code>
         */
        public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion.Builder> 
             getBrowsersBuilderList() {
          return getBrowsersFieldBuilder().getBuilderList();
        }
        private com.google.protobuf.RepeatedFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersionOrBuilder> 
            getBrowsersFieldBuilder() {
          if (browsersBuilder_ == null) {
            browsersBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersionOrBuilder>(
                    browsers_,
                    ((bitField0_ & 0x00000001) != 0),
                    getParentForChildren(),
                    isClean());
            browsers_ = null;
          }
          return browsersBuilder_;
        }

        private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion platform_;
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersionOrBuilder> platformBuilder_;
        /**
         * <pre>
         * A BrandVersion object that identifies the
         * user agent’s execution platform / OS. Implementers should send a brand
         * derived from the Sec-CH-UA-Platform header, and version derived
         * from the Sec-CH-UA-Platform-Version header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.BrandVersion platform = 2;</code>
         * @return Whether the platform field is set.
         */
        public boolean hasPlatform() {
          return ((bitField0_ & 0x00000002) != 0);
        }
        /**
         * <pre>
         * A BrandVersion object that identifies the
         * user agent’s execution platform / OS. Implementers should send a brand
         * derived from the Sec-CH-UA-Platform header, and version derived
         * from the Sec-CH-UA-Platform-Version header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.BrandVersion platform = 2;</code>
         * @return The platform.
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion getPlatform() {
          if (platformBuilder_ == null) {
            return platform_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion.getDefaultInstance() : platform_;
          } else {
            return platformBuilder_.getMessage();
          }
        }
        /**
         * <pre>
         * A BrandVersion object that identifies the
         * user agent’s execution platform / OS. Implementers should send a brand
         * derived from the Sec-CH-UA-Platform header, and version derived
         * from the Sec-CH-UA-Platform-Version header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.BrandVersion platform = 2;</code>
         */
        public Builder setPlatform(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion value) {
          if (platformBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            platform_ = value;
            onChanged();
          } else {
            platformBuilder_.setMessage(value);
          }
          bitField0_ |= 0x00000002;
          return this;
        }
        /**
         * <pre>
         * A BrandVersion object that identifies the
         * user agent’s execution platform / OS. Implementers should send a brand
         * derived from the Sec-CH-UA-Platform header, and version derived
         * from the Sec-CH-UA-Platform-Version header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.BrandVersion platform = 2;</code>
         */
        public Builder setPlatform(
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion.Builder builderForValue) {
          if (platformBuilder_ == null) {
            platform_ = builderForValue.build();
            onChanged();
          } else {
            platformBuilder_.setMessage(builderForValue.build());
          }
          bitField0_ |= 0x00000002;
          return this;
        }
        /**
         * <pre>
         * A BrandVersion object that identifies the
         * user agent’s execution platform / OS. Implementers should send a brand
         * derived from the Sec-CH-UA-Platform header, and version derived
         * from the Sec-CH-UA-Platform-Version header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.BrandVersion platform = 2;</code>
         */
        public Builder mergePlatform(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion value) {
          if (platformBuilder_ == null) {
            if (((bitField0_ & 0x00000002) != 0) &&
                platform_ != null &&
                platform_ != com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion.getDefaultInstance()) {
              platform_ =
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion.newBuilder(platform_).mergeFrom(value).buildPartial();
            } else {
              platform_ = value;
            }
            onChanged();
          } else {
            platformBuilder_.mergeFrom(value);
          }
          bitField0_ |= 0x00000002;
          return this;
        }
        /**
         * <pre>
         * A BrandVersion object that identifies the
         * user agent’s execution platform / OS. Implementers should send a brand
         * derived from the Sec-CH-UA-Platform header, and version derived
         * from the Sec-CH-UA-Platform-Version header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.BrandVersion platform = 2;</code>
         */
        public Builder clearPlatform() {
          if (platformBuilder_ == null) {
            platform_ = null;
            onChanged();
          } else {
            platformBuilder_.clear();
          }
          bitField0_ = (bitField0_ & ~0x00000002);
          return this;
        }
        /**
         * <pre>
         * A BrandVersion object that identifies the
         * user agent’s execution platform / OS. Implementers should send a brand
         * derived from the Sec-CH-UA-Platform header, and version derived
         * from the Sec-CH-UA-Platform-Version header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.BrandVersion platform = 2;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion.Builder getPlatformBuilder() {
          bitField0_ |= 0x00000002;
          onChanged();
          return getPlatformFieldBuilder().getBuilder();
        }
        /**
         * <pre>
         * A BrandVersion object that identifies the
         * user agent’s execution platform / OS. Implementers should send a brand
         * derived from the Sec-CH-UA-Platform header, and version derived
         * from the Sec-CH-UA-Platform-Version header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.BrandVersion platform = 2;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersionOrBuilder getPlatformOrBuilder() {
          if (platformBuilder_ != null) {
            return platformBuilder_.getMessageOrBuilder();
          } else {
            return platform_ == null ?
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion.getDefaultInstance() : platform_;
          }
        }
        /**
         * <pre>
         * A BrandVersion object that identifies the
         * user agent’s execution platform / OS. Implementers should send a brand
         * derived from the Sec-CH-UA-Platform header, and version derived
         * from the Sec-CH-UA-Platform-Version header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * RECOMMENDED by the OpenRTB specification.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.BrandVersion platform = 2;</code>
         */
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersionOrBuilder> 
            getPlatformFieldBuilder() {
          if (platformBuilder_ == null) {
            platformBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersionOrBuilder>(
                    getPlatform(),
                    getParentForChildren(),
                    isClean());
            platform_ = null;
          }
          return platformBuilder_;
        }

        private boolean mobile_ ;
        /**
         * <pre>
         * 1 if the agent prefers a "mobile" version of the content, if available,
         * i.e. optimized for small screens or touch input.
         * 0 if the agent prefers the "desktop" or "full" content.
         * Implementers should derive this value from the Sec-CH-UA-Mobile header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * </pre>
         *
         * <code>optional bool mobile = 3;</code>
         * @return Whether the mobile field is set.
         */
        @java.lang.Override
        public boolean hasMobile() {
          return ((bitField0_ & 0x00000004) != 0);
        }
        /**
         * <pre>
         * 1 if the agent prefers a "mobile" version of the content, if available,
         * i.e. optimized for small screens or touch input.
         * 0 if the agent prefers the "desktop" or "full" content.
         * Implementers should derive this value from the Sec-CH-UA-Mobile header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * </pre>
         *
         * <code>optional bool mobile = 3;</code>
         * @return The mobile.
         */
        @java.lang.Override
        public boolean getMobile() {
          return mobile_;
        }
        /**
         * <pre>
         * 1 if the agent prefers a "mobile" version of the content, if available,
         * i.e. optimized for small screens or touch input.
         * 0 if the agent prefers the "desktop" or "full" content.
         * Implementers should derive this value from the Sec-CH-UA-Mobile header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * </pre>
         *
         * <code>optional bool mobile = 3;</code>
         * @param value The mobile to set.
         * @return This builder for chaining.
         */
        public Builder setMobile(boolean value) {
          bitField0_ |= 0x00000004;
          mobile_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * 1 if the agent prefers a "mobile" version of the content, if available,
         * i.e. optimized for small screens or touch input.
         * 0 if the agent prefers the "desktop" or "full" content.
         * Implementers should derive this value from the Sec-CH-UA-Mobile header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * </pre>
         *
         * <code>optional bool mobile = 3;</code>
         * @return This builder for chaining.
         */
        public Builder clearMobile() {
          bitField0_ = (bitField0_ & ~0x00000004);
          mobile_ = false;
          onChanged();
          return this;
        }

        private java.lang.Object architecture_ = "";
        /**
         * <pre>
         * Device’s major binary architecture, e.g. "x86" or "arm".
         * Implementers should retrieve this value from the Sec-CH-UA-Arch header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * </pre>
         *
         * <code>optional string architecture = 4;</code>
         * @return Whether the architecture field is set.
         */
        public boolean hasArchitecture() {
          return ((bitField0_ & 0x00000008) != 0);
        }
        /**
         * <pre>
         * Device’s major binary architecture, e.g. "x86" or "arm".
         * Implementers should retrieve this value from the Sec-CH-UA-Arch header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * </pre>
         *
         * <code>optional string architecture = 4;</code>
         * @return The architecture.
         */
        public java.lang.String getArchitecture() {
          java.lang.Object ref = architecture_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              architecture_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Device’s major binary architecture, e.g. "x86" or "arm".
         * Implementers should retrieve this value from the Sec-CH-UA-Arch header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * </pre>
         *
         * <code>optional string architecture = 4;</code>
         * @return The bytes for architecture.
         */
        public com.google.protobuf.ByteString
            getArchitectureBytes() {
          java.lang.Object ref = architecture_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            architecture_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Device’s major binary architecture, e.g. "x86" or "arm".
         * Implementers should retrieve this value from the Sec-CH-UA-Arch header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * </pre>
         *
         * <code>optional string architecture = 4;</code>
         * @param value The architecture to set.
         * @return This builder for chaining.
         */
        public Builder setArchitecture(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
          architecture_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Device’s major binary architecture, e.g. "x86" or "arm".
         * Implementers should retrieve this value from the Sec-CH-UA-Arch header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * </pre>
         *
         * <code>optional string architecture = 4;</code>
         * @return This builder for chaining.
         */
        public Builder clearArchitecture() {
          bitField0_ = (bitField0_ & ~0x00000008);
          architecture_ = getDefaultInstance().getArchitecture();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Device’s major binary architecture, e.g. "x86" or "arm".
         * Implementers should retrieve this value from the Sec-CH-UA-Arch header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * </pre>
         *
         * <code>optional string architecture = 4;</code>
         * @param value The bytes for architecture to set.
         * @return This builder for chaining.
         */
        public Builder setArchitectureBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
          architecture_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object bitness_ = "";
        /**
         * <pre>
         * Device’s bitness, e.g. "64" for 64-bit architecture.
         * Implementers should retrieve this value from the Sec-CH-UA-Bitness header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * </pre>
         *
         * <code>optional string bitness = 5;</code>
         * @return Whether the bitness field is set.
         */
        public boolean hasBitness() {
          return ((bitField0_ & 0x00000010) != 0);
        }
        /**
         * <pre>
         * Device’s bitness, e.g. "64" for 64-bit architecture.
         * Implementers should retrieve this value from the Sec-CH-UA-Bitness header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * </pre>
         *
         * <code>optional string bitness = 5;</code>
         * @return The bitness.
         */
        public java.lang.String getBitness() {
          java.lang.Object ref = bitness_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              bitness_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Device’s bitness, e.g. "64" for 64-bit architecture.
         * Implementers should retrieve this value from the Sec-CH-UA-Bitness header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * </pre>
         *
         * <code>optional string bitness = 5;</code>
         * @return The bytes for bitness.
         */
        public com.google.protobuf.ByteString
            getBitnessBytes() {
          java.lang.Object ref = bitness_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            bitness_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Device’s bitness, e.g. "64" for 64-bit architecture.
         * Implementers should retrieve this value from the Sec-CH-UA-Bitness header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * </pre>
         *
         * <code>optional string bitness = 5;</code>
         * @param value The bitness to set.
         * @return This builder for chaining.
         */
        public Builder setBitness(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
          bitness_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Device’s bitness, e.g. "64" for 64-bit architecture.
         * Implementers should retrieve this value from the Sec-CH-UA-Bitness header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * </pre>
         *
         * <code>optional string bitness = 5;</code>
         * @return This builder for chaining.
         */
        public Builder clearBitness() {
          bitField0_ = (bitField0_ & ~0x00000010);
          bitness_ = getDefaultInstance().getBitness();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Device’s bitness, e.g. "64" for 64-bit architecture.
         * Implementers should retrieve this value from the Sec-CH-UA-Bitness header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * </pre>
         *
         * <code>optional string bitness = 5;</code>
         * @param value The bytes for bitness to set.
         * @return This builder for chaining.
         */
        public Builder setBitnessBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
          bitness_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object model_ = "";
        /**
         * <pre>
         * Device model. Implementers should retrieve this value from the Sec-CH-UA-Model header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * </pre>
         *
         * <code>optional string model = 6;</code>
         * @return Whether the model field is set.
         */
        public boolean hasModel() {
          return ((bitField0_ & 0x00000020) != 0);
        }
        /**
         * <pre>
         * Device model. Implementers should retrieve this value from the Sec-CH-UA-Model header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * </pre>
         *
         * <code>optional string model = 6;</code>
         * @return The model.
         */
        public java.lang.String getModel() {
          java.lang.Object ref = model_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              model_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Device model. Implementers should retrieve this value from the Sec-CH-UA-Model header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * </pre>
         *
         * <code>optional string model = 6;</code>
         * @return The bytes for model.
         */
        public com.google.protobuf.ByteString
            getModelBytes() {
          java.lang.Object ref = model_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            model_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Device model. Implementers should retrieve this value from the Sec-CH-UA-Model header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * </pre>
         *
         * <code>optional string model = 6;</code>
         * @param value The model to set.
         * @return This builder for chaining.
         */
        public Builder setModel(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000020;
          model_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Device model. Implementers should retrieve this value from the Sec-CH-UA-Model header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * </pre>
         *
         * <code>optional string model = 6;</code>
         * @return This builder for chaining.
         */
        public Builder clearModel() {
          bitField0_ = (bitField0_ & ~0x00000020);
          model_ = getDefaultInstance().getModel();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Device model. Implementers should retrieve this value from the Sec-CH-UA-Model header
         * or an equivalent JavaScript accessor from NavigatorUAData interface.
         * This header or accessor are only available for browsers that support User-Agent Client Hints.
         * </pre>
         *
         * <code>optional string model = 6;</code>
         * @param value The bytes for model to set.
         * @return This builder for chaining.
         */
        public Builder setModelBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000020;
          model_ = value;
          onChanged();
          return this;
        }

        private int source_ ;
        /**
         * <pre>
         * The source of data used to create this object
         * Refer to enum com.iabtechlab.adcom.v1.enums.UserAgentSource for generic values
         * </pre>
         *
         * <code>optional int32 source = 7 [default = 0];</code>
         * @return Whether the source field is set.
         */
        @java.lang.Override
        public boolean hasSource() {
          return ((bitField0_ & 0x00000040) != 0);
        }
        /**
         * <pre>
         * The source of data used to create this object
         * Refer to enum com.iabtechlab.adcom.v1.enums.UserAgentSource for generic values
         * </pre>
         *
         * <code>optional int32 source = 7 [default = 0];</code>
         * @return The source.
         */
        @java.lang.Override
        public int getSource() {
          return source_;
        }
        /**
         * <pre>
         * The source of data used to create this object
         * Refer to enum com.iabtechlab.adcom.v1.enums.UserAgentSource for generic values
         * </pre>
         *
         * <code>optional int32 source = 7 [default = 0];</code>
         * @param value The source to set.
         * @return This builder for chaining.
         */
        public Builder setSource(int value) {
          bitField0_ |= 0x00000040;
          source_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * The source of data used to create this object
         * Refer to enum com.iabtechlab.adcom.v1.enums.UserAgentSource for generic values
         * </pre>
         *
         * <code>optional int32 source = 7 [default = 0];</code>
         * @return This builder for chaining.
         */
        public Builder clearSource() {
          bitField0_ = (bitField0_ & ~0x00000040);
          source_ = 0;
          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:com.iabtechlab.openrtb.v2.BidRequest.UserAgent)
      }

      // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.BidRequest.UserAgent)
      private static final com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent DEFAULT_INSTANCE;
      static {
        DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent();
      }

      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent getDefaultInstance() {
        return DEFAULT_INSTANCE;
      }

      @java.lang.Deprecated public static final com.google.protobuf.Parser<UserAgent>
          PARSER = new com.google.protobuf.AbstractParser<UserAgent>() {
        @java.lang.Override
        public UserAgent parsePartialFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return new UserAgent(input, extensionRegistry);
        }
      };

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

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

      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserAgent getDefaultInstanceForType() {
        return DEFAULT_INSTANCE;
      }

    }

    public interface BrandVersionOrBuilder extends
        // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.BidRequest.BrandVersion)
        com.google.protobuf.GeneratedMessageV3.
            ExtendableMessageOrBuilder<BrandVersion> {

      /**
       * <pre>
       * A brand identifier, for example, "Chrome" or "Windows". The value may be sourced
       * from the User-Agent Client Hints headers, representing either the
       * user agent brand (from the Sec-CH-UA-Full-Version header) or
       * the platform brand (from the Sec-CH-UA-Platform header).
       * </pre>
       *
       * <code>optional string brand = 1;</code>
       * @return Whether the brand field is set.
       */
      boolean hasBrand();
      /**
       * <pre>
       * A brand identifier, for example, "Chrome" or "Windows". The value may be sourced
       * from the User-Agent Client Hints headers, representing either the
       * user agent brand (from the Sec-CH-UA-Full-Version header) or
       * the platform brand (from the Sec-CH-UA-Platform header).
       * </pre>
       *
       * <code>optional string brand = 1;</code>
       * @return The brand.
       */
      java.lang.String getBrand();
      /**
       * <pre>
       * A brand identifier, for example, "Chrome" or "Windows". The value may be sourced
       * from the User-Agent Client Hints headers, representing either the
       * user agent brand (from the Sec-CH-UA-Full-Version header) or
       * the platform brand (from the Sec-CH-UA-Platform header).
       * </pre>
       *
       * <code>optional string brand = 1;</code>
       * @return The bytes for brand.
       */
      com.google.protobuf.ByteString
          getBrandBytes();

      /**
       * <pre>
       * A sequence of version components, in descending hierarchical order (major, minor, micro, …)
       * </pre>
       *
       * <code>repeated string version = 2;</code>
       * @return A list containing the version.
       */
      java.util.List<java.lang.String>
          getVersionList();
      /**
       * <pre>
       * A sequence of version components, in descending hierarchical order (major, minor, micro, …)
       * </pre>
       *
       * <code>repeated string version = 2;</code>
       * @return The count of version.
       */
      int getVersionCount();
      /**
       * <pre>
       * A sequence of version components, in descending hierarchical order (major, minor, micro, …)
       * </pre>
       *
       * <code>repeated string version = 2;</code>
       * @param index The index of the element to return.
       * @return The version at the given index.
       */
      java.lang.String getVersion(int index);
      /**
       * <pre>
       * A sequence of version components, in descending hierarchical order (major, minor, micro, …)
       * </pre>
       *
       * <code>repeated string version = 2;</code>
       * @param index The index of the value to return.
       * @return The bytes of the version at the given index.
       */
      com.google.protobuf.ByteString
          getVersionBytes(int index);
    }
    /**
     * <pre>
     * OpenRTB 2.6: Further identification based on User-Agent Client Hints, the BrandVersion object
     * is used to identify a device’s browser or similar software component, and the user agent’s
     * execution platform or operating system.
     * </pre>
     *
     * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.BrandVersion}
     */
    public static final class BrandVersion extends
        com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
          BrandVersion> implements
        // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.BidRequest.BrandVersion)
        BrandVersionOrBuilder {
    private static final long serialVersionUID = 0L;
      // Use BrandVersion.newBuilder() to construct.
      private BrandVersion(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion, ?> builder) {
        super(builder);
      }
      private BrandVersion() {
        brand_ = "";
        version_ = com.google.protobuf.LazyStringArrayList.EMPTY;
      }

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

      @java.lang.Override
      public final com.google.protobuf.UnknownFieldSet
      getUnknownFields() {
        return this.unknownFields;
      }
      private BrandVersion(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        this();
        if (extensionRegistry == null) {
          throw new java.lang.NullPointerException();
        }
        int mutable_bitField0_ = 0;
        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
            com.google.protobuf.UnknownFieldSet.newBuilder();
        try {
          boolean done = false;
          while (!done) {
            int tag = input.readTag();
            switch (tag) {
              case 0:
                done = true;
                break;
              case 10: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000001;
                brand_ = bs;
                break;
              }
              case 18: {
                com.google.protobuf.ByteString bs = input.readBytes();
                if (!((mutable_bitField0_ & 0x00000002) != 0)) {
                  version_ = new com.google.protobuf.LazyStringArrayList();
                  mutable_bitField0_ |= 0x00000002;
                }
                version_.add(bs);
                break;
              }
              default: {
                if (!parseUnknownField(
                    input, unknownFields, extensionRegistry, tag)) {
                  done = true;
                }
                break;
              }
            }
          }
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          throw e.setUnfinishedMessage(this);
        } catch (java.io.IOException e) {
          throw new com.google.protobuf.InvalidProtocolBufferException(
              e).setUnfinishedMessage(this);
        } finally {
          if (((mutable_bitField0_ & 0x00000002) != 0)) {
            version_ = version_.getUnmodifiableView();
          }
          this.unknownFields = unknownFields.build();
          makeExtensionsImmutable();
        }
      }
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_BrandVersion_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_BrandVersion_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion.Builder.class);
      }

      private int bitField0_;
      public static final int BRAND_FIELD_NUMBER = 1;
      private volatile java.lang.Object brand_;
      /**
       * <pre>
       * A brand identifier, for example, "Chrome" or "Windows". The value may be sourced
       * from the User-Agent Client Hints headers, representing either the
       * user agent brand (from the Sec-CH-UA-Full-Version header) or
       * the platform brand (from the Sec-CH-UA-Platform header).
       * </pre>
       *
       * <code>optional string brand = 1;</code>
       * @return Whether the brand field is set.
       */
      @java.lang.Override
      public boolean hasBrand() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <pre>
       * A brand identifier, for example, "Chrome" or "Windows". The value may be sourced
       * from the User-Agent Client Hints headers, representing either the
       * user agent brand (from the Sec-CH-UA-Full-Version header) or
       * the platform brand (from the Sec-CH-UA-Platform header).
       * </pre>
       *
       * <code>optional string brand = 1;</code>
       * @return The brand.
       */
      @java.lang.Override
      public java.lang.String getBrand() {
        java.lang.Object ref = brand_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            brand_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * A brand identifier, for example, "Chrome" or "Windows". The value may be sourced
       * from the User-Agent Client Hints headers, representing either the
       * user agent brand (from the Sec-CH-UA-Full-Version header) or
       * the platform brand (from the Sec-CH-UA-Platform header).
       * </pre>
       *
       * <code>optional string brand = 1;</code>
       * @return The bytes for brand.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getBrandBytes() {
        java.lang.Object ref = brand_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          brand_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int VERSION_FIELD_NUMBER = 2;
      private com.google.protobuf.LazyStringList version_;
      /**
       * <pre>
       * A sequence of version components, in descending hierarchical order (major, minor, micro, …)
       * </pre>
       *
       * <code>repeated string version = 2;</code>
       * @return A list containing the version.
       */
      public com.google.protobuf.ProtocolStringList
          getVersionList() {
        return version_;
      }
      /**
       * <pre>
       * A sequence of version components, in descending hierarchical order (major, minor, micro, …)
       * </pre>
       *
       * <code>repeated string version = 2;</code>
       * @return The count of version.
       */
      public int getVersionCount() {
        return version_.size();
      }
      /**
       * <pre>
       * A sequence of version components, in descending hierarchical order (major, minor, micro, …)
       * </pre>
       *
       * <code>repeated string version = 2;</code>
       * @param index The index of the element to return.
       * @return The version at the given index.
       */
      public java.lang.String getVersion(int index) {
        return version_.get(index);
      }
      /**
       * <pre>
       * A sequence of version components, in descending hierarchical order (major, minor, micro, …)
       * </pre>
       *
       * <code>repeated string version = 2;</code>
       * @param index The index of the value to return.
       * @return The bytes of the version at the given index.
       */
      public com.google.protobuf.ByteString
          getVersionBytes(int index) {
        return version_.getByteString(index);
      }

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

        if (!extensionsAreInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
        memoizedIsInitialized = 1;
        return true;
      }

      @java.lang.Override
      public void writeTo(com.google.protobuf.CodedOutputStream output)
                          throws java.io.IOException {
        com.google.protobuf.GeneratedMessageV3
          .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion>.ExtensionWriter
            extensionWriter = newExtensionWriter();
        if (((bitField0_ & 0x00000001) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 1, brand_);
        }
        for (int i = 0; i < version_.size(); i++) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 2, version_.getRaw(i));
        }
        extensionWriter.writeUntil(10000, output);
        unknownFields.writeTo(output);
      }

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

        size = 0;
        if (((bitField0_ & 0x00000001) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, brand_);
        }
        {
          int dataSize = 0;
          for (int i = 0; i < version_.size(); i++) {
            dataSize += computeStringSizeNoTag(version_.getRaw(i));
          }
          size += dataSize;
          size += 1 * getVersionList().size();
        }
        size += extensionsSerializedSize();
        size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion)) {
          return super.equals(obj);
        }
        com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion other = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion) obj;

        if (hasBrand() != other.hasBrand()) return false;
        if (hasBrand()) {
          if (!getBrand()
              .equals(other.getBrand())) return false;
        }
        if (!getVersionList()
            .equals(other.getVersionList())) return false;
        if (!unknownFields.equals(other.unknownFields)) return false;
        if (!getExtensionFields().equals(other.getExtensionFields()))
          return false;
        return true;
      }

      @java.lang.Override
      public int hashCode() {
        if (memoizedHashCode != 0) {
          return memoizedHashCode;
        }
        int hash = 41;
        hash = (19 * hash) + getDescriptor().hashCode();
        if (hasBrand()) {
          hash = (37 * hash) + BRAND_FIELD_NUMBER;
          hash = (53 * hash) + getBrand().hashCode();
        }
        if (getVersionCount() > 0) {
          hash = (37 * hash) + VERSION_FIELD_NUMBER;
          hash = (53 * hash) + getVersionList().hashCode();
        }
        hash = hashFields(hash, getExtensionFields());
        hash = (29 * hash) + unknownFields.hashCode();
        memoizedHashCode = hash;
        return hash;
      }

      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion parseFrom(
          java.nio.ByteBuffer data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion parseFrom(
          java.nio.ByteBuffer data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion parseFrom(
          com.google.protobuf.ByteString data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion parseFrom(
          com.google.protobuf.ByteString data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion parseFrom(byte[] data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion parseFrom(
          byte[] data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion parseFrom(java.io.InputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion parseDelimitedFrom(java.io.InputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseDelimitedWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion parseFrom(
          com.google.protobuf.CodedInputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion 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>
       * OpenRTB 2.6: Further identification based on User-Agent Client Hints, the BrandVersion object
       * is used to identify a device’s browser or similar software component, and the user agent’s
       * execution platform or operating system.
       * </pre>
       *
       * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.BrandVersion}
       */
      public static final class Builder extends
          com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion, Builder> implements
          // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.BidRequest.BrandVersion)
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersionOrBuilder {
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_BrandVersion_descriptor;
        }

        @java.lang.Override
        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_BrandVersion_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion.Builder.class);
        }

        // Construct using com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion.newBuilder()
        private Builder() {
          maybeForceBuilderInitialization();
        }

        private Builder(
            com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
          super(parent);
          maybeForceBuilderInitialization();
        }
        private void maybeForceBuilderInitialization() {
          if (com.google.protobuf.GeneratedMessageV3
                  .alwaysUseFieldBuilders) {
          }
        }
        @java.lang.Override
        public Builder clear() {
          super.clear();
          brand_ = "";
          bitField0_ = (bitField0_ & ~0x00000001);
          version_ = com.google.protobuf.LazyStringArrayList.EMPTY;
          bitField0_ = (bitField0_ & ~0x00000002);
          return this;
        }

        @java.lang.Override
        public com.google.protobuf.Descriptors.Descriptor
            getDescriptorForType() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_BrandVersion_descriptor;
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion getDefaultInstanceForType() {
          return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion.getDefaultInstance();
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion build() {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion result = buildPartial();
          if (!result.isInitialized()) {
            throw newUninitializedMessageException(result);
          }
          return result;
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion buildPartial() {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion result = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion(this);
          int from_bitField0_ = bitField0_;
          int to_bitField0_ = 0;
          if (((from_bitField0_ & 0x00000001) != 0)) {
            to_bitField0_ |= 0x00000001;
          }
          result.brand_ = brand_;
          if (((bitField0_ & 0x00000002) != 0)) {
            version_ = version_.getUnmodifiableView();
            bitField0_ = (bitField0_ & ~0x00000002);
          }
          result.version_ = version_;
          result.bitField0_ = to_bitField0_;
          onBuilt();
          return result;
        }

        @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 <Type> Builder setExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion, Type> extension,
            Type value) {
          return super.setExtension(extension, value);
        }
        @java.lang.Override
        public <Type> Builder setExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion, java.util.List<Type>> extension,
            int index, Type value) {
          return super.setExtension(extension, index, value);
        }
        @java.lang.Override
        public <Type> Builder addExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion, java.util.List<Type>> extension,
            Type value) {
          return super.addExtension(extension, value);
        }
        @java.lang.Override
        public <Type> Builder clearExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion, ?> extension) {
          return super.clearExtension(extension);
        }
        @java.lang.Override
        public Builder mergeFrom(com.google.protobuf.Message other) {
          if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion) {
            return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion)other);
          } else {
            super.mergeFrom(other);
            return this;
          }
        }

        public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion other) {
          if (other == com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion.getDefaultInstance()) return this;
          if (other.hasBrand()) {
            bitField0_ |= 0x00000001;
            brand_ = other.brand_;
            onChanged();
          }
          if (!other.version_.isEmpty()) {
            if (version_.isEmpty()) {
              version_ = other.version_;
              bitField0_ = (bitField0_ & ~0x00000002);
            } else {
              ensureVersionIsMutable();
              version_.addAll(other.version_);
            }
            onChanged();
          }
          this.mergeExtensionFields(other);
          this.mergeUnknownFields(other.unknownFields);
          onChanged();
          return this;
        }

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

        @java.lang.Override
        public Builder mergeFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws java.io.IOException {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion parsedMessage = null;
          try {
            parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion) e.getUnfinishedMessage();
            throw e.unwrapIOException();
          } finally {
            if (parsedMessage != null) {
              mergeFrom(parsedMessage);
            }
          }
          return this;
        }
        private int bitField0_;

        private java.lang.Object brand_ = "";
        /**
         * <pre>
         * A brand identifier, for example, "Chrome" or "Windows". The value may be sourced
         * from the User-Agent Client Hints headers, representing either the
         * user agent brand (from the Sec-CH-UA-Full-Version header) or
         * the platform brand (from the Sec-CH-UA-Platform header).
         * </pre>
         *
         * <code>optional string brand = 1;</code>
         * @return Whether the brand field is set.
         */
        public boolean hasBrand() {
          return ((bitField0_ & 0x00000001) != 0);
        }
        /**
         * <pre>
         * A brand identifier, for example, "Chrome" or "Windows". The value may be sourced
         * from the User-Agent Client Hints headers, representing either the
         * user agent brand (from the Sec-CH-UA-Full-Version header) or
         * the platform brand (from the Sec-CH-UA-Platform header).
         * </pre>
         *
         * <code>optional string brand = 1;</code>
         * @return The brand.
         */
        public java.lang.String getBrand() {
          java.lang.Object ref = brand_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              brand_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * A brand identifier, for example, "Chrome" or "Windows". The value may be sourced
         * from the User-Agent Client Hints headers, representing either the
         * user agent brand (from the Sec-CH-UA-Full-Version header) or
         * the platform brand (from the Sec-CH-UA-Platform header).
         * </pre>
         *
         * <code>optional string brand = 1;</code>
         * @return The bytes for brand.
         */
        public com.google.protobuf.ByteString
            getBrandBytes() {
          java.lang.Object ref = brand_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            brand_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * A brand identifier, for example, "Chrome" or "Windows". The value may be sourced
         * from the User-Agent Client Hints headers, representing either the
         * user agent brand (from the Sec-CH-UA-Full-Version header) or
         * the platform brand (from the Sec-CH-UA-Platform header).
         * </pre>
         *
         * <code>optional string brand = 1;</code>
         * @param value The brand to set.
         * @return This builder for chaining.
         */
        public Builder setBrand(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
          brand_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * A brand identifier, for example, "Chrome" or "Windows". The value may be sourced
         * from the User-Agent Client Hints headers, representing either the
         * user agent brand (from the Sec-CH-UA-Full-Version header) or
         * the platform brand (from the Sec-CH-UA-Platform header).
         * </pre>
         *
         * <code>optional string brand = 1;</code>
         * @return This builder for chaining.
         */
        public Builder clearBrand() {
          bitField0_ = (bitField0_ & ~0x00000001);
          brand_ = getDefaultInstance().getBrand();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * A brand identifier, for example, "Chrome" or "Windows". The value may be sourced
         * from the User-Agent Client Hints headers, representing either the
         * user agent brand (from the Sec-CH-UA-Full-Version header) or
         * the platform brand (from the Sec-CH-UA-Platform header).
         * </pre>
         *
         * <code>optional string brand = 1;</code>
         * @param value The bytes for brand to set.
         * @return This builder for chaining.
         */
        public Builder setBrandBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
          brand_ = value;
          onChanged();
          return this;
        }

        private com.google.protobuf.LazyStringList version_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        private void ensureVersionIsMutable() {
          if (!((bitField0_ & 0x00000002) != 0)) {
            version_ = new com.google.protobuf.LazyStringArrayList(version_);
            bitField0_ |= 0x00000002;
           }
        }
        /**
         * <pre>
         * A sequence of version components, in descending hierarchical order (major, minor, micro, …)
         * </pre>
         *
         * <code>repeated string version = 2;</code>
         * @return A list containing the version.
         */
        public com.google.protobuf.ProtocolStringList
            getVersionList() {
          return version_.getUnmodifiableView();
        }
        /**
         * <pre>
         * A sequence of version components, in descending hierarchical order (major, minor, micro, …)
         * </pre>
         *
         * <code>repeated string version = 2;</code>
         * @return The count of version.
         */
        public int getVersionCount() {
          return version_.size();
        }
        /**
         * <pre>
         * A sequence of version components, in descending hierarchical order (major, minor, micro, …)
         * </pre>
         *
         * <code>repeated string version = 2;</code>
         * @param index The index of the element to return.
         * @return The version at the given index.
         */
        public java.lang.String getVersion(int index) {
          return version_.get(index);
        }
        /**
         * <pre>
         * A sequence of version components, in descending hierarchical order (major, minor, micro, …)
         * </pre>
         *
         * <code>repeated string version = 2;</code>
         * @param index The index of the value to return.
         * @return The bytes of the version at the given index.
         */
        public com.google.protobuf.ByteString
            getVersionBytes(int index) {
          return version_.getByteString(index);
        }
        /**
         * <pre>
         * A sequence of version components, in descending hierarchical order (major, minor, micro, …)
         * </pre>
         *
         * <code>repeated string version = 2;</code>
         * @param index The index to set the value at.
         * @param value The version to set.
         * @return This builder for chaining.
         */
        public Builder setVersion(
            int index, java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  ensureVersionIsMutable();
          version_.set(index, value);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * A sequence of version components, in descending hierarchical order (major, minor, micro, …)
         * </pre>
         *
         * <code>repeated string version = 2;</code>
         * @param value The version to add.
         * @return This builder for chaining.
         */
        public Builder addVersion(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  ensureVersionIsMutable();
          version_.add(value);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * A sequence of version components, in descending hierarchical order (major, minor, micro, …)
         * </pre>
         *
         * <code>repeated string version = 2;</code>
         * @param values The version to add.
         * @return This builder for chaining.
         */
        public Builder addAllVersion(
            java.lang.Iterable<java.lang.String> values) {
          ensureVersionIsMutable();
          com.google.protobuf.AbstractMessageLite.Builder.addAll(
              values, version_);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * A sequence of version components, in descending hierarchical order (major, minor, micro, …)
         * </pre>
         *
         * <code>repeated string version = 2;</code>
         * @return This builder for chaining.
         */
        public Builder clearVersion() {
          version_ = com.google.protobuf.LazyStringArrayList.EMPTY;
          bitField0_ = (bitField0_ & ~0x00000002);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * A sequence of version components, in descending hierarchical order (major, minor, micro, …)
         * </pre>
         *
         * <code>repeated string version = 2;</code>
         * @param value The bytes of the version to add.
         * @return This builder for chaining.
         */
        public Builder addVersionBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  ensureVersionIsMutable();
          version_.add(value);
          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:com.iabtechlab.openrtb.v2.BidRequest.BrandVersion)
      }

      // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.BidRequest.BrandVersion)
      private static final com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion DEFAULT_INSTANCE;
      static {
        DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion();
      }

      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion getDefaultInstance() {
        return DEFAULT_INSTANCE;
      }

      @java.lang.Deprecated public static final com.google.protobuf.Parser<BrandVersion>
          PARSER = new com.google.protobuf.AbstractParser<BrandVersion>() {
        @java.lang.Override
        public BrandVersion parsePartialFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return new BrandVersion(input, extensionRegistry);
        }
      };

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

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

      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.BrandVersion getDefaultInstanceForType() {
        return DEFAULT_INSTANCE;
      }

    }

    public interface UserOrBuilder extends
        // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.BidRequest.User)
        com.google.protobuf.GeneratedMessageV3.
            ExtendableMessageOrBuilder<User> {

      /**
       * <pre>
       * Exchange-specific ID for the user. At least one of id or buyeruid
       * is recommended.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return Whether the id field is set.
       */
      boolean hasId();
      /**
       * <pre>
       * Exchange-specific ID for the user. At least one of id or buyeruid
       * is recommended.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return The id.
       */
      java.lang.String getId();
      /**
       * <pre>
       * Exchange-specific ID for the user. At least one of id or buyeruid
       * is recommended.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return The bytes for id.
       */
      com.google.protobuf.ByteString
          getIdBytes();

      /**
       * <pre>
       * Buyer-specific ID for the user as mapped by the exchange for the buyer.
       * At least one of buyeruid or id is recommended.
       * </pre>
       *
       * <code>optional string buyeruid = 2;</code>
       * @return Whether the buyeruid field is set.
       */
      boolean hasBuyeruid();
      /**
       * <pre>
       * Buyer-specific ID for the user as mapped by the exchange for the buyer.
       * At least one of buyeruid or id is recommended.
       * </pre>
       *
       * <code>optional string buyeruid = 2;</code>
       * @return The buyeruid.
       */
      java.lang.String getBuyeruid();
      /**
       * <pre>
       * Buyer-specific ID for the user as mapped by the exchange for the buyer.
       * At least one of buyeruid or id is recommended.
       * </pre>
       *
       * <code>optional string buyeruid = 2;</code>
       * @return The bytes for buyeruid.
       */
      com.google.protobuf.ByteString
          getBuyeruidBytes();

      /**
       * <pre>
       * Year of birth as a 4-digit integer.
       * </pre>
       *
       * <code>optional int32 yob = 3;</code>
       * @return Whether the yob field is set.
       */
      boolean hasYob();
      /**
       * <pre>
       * Year of birth as a 4-digit integer.
       * </pre>
       *
       * <code>optional int32 yob = 3;</code>
       * @return The yob.
       */
      int getYob();

      /**
       * <pre>
       * Gender as "M" male, "F" female, "O" Other. (Null indicates unknown)
       * </pre>
       *
       * <code>optional string gender = 4;</code>
       * @return Whether the gender field is set.
       */
      boolean hasGender();
      /**
       * <pre>
       * Gender as "M" male, "F" female, "O" Other. (Null indicates unknown)
       * </pre>
       *
       * <code>optional string gender = 4;</code>
       * @return The gender.
       */
      java.lang.String getGender();
      /**
       * <pre>
       * Gender as "M" male, "F" female, "O" Other. (Null indicates unknown)
       * </pre>
       *
       * <code>optional string gender = 4;</code>
       * @return The bytes for gender.
       */
      com.google.protobuf.ByteString
          getGenderBytes();

      /**
       * <pre>
       * Comma separated list of keywords, interests, or intent.
       * Note: OpenRTB 2.2 allowed an array-of-strings as alternate implementation
       * but this was fixed in 2.3+ where it's definitely a single string with CSV
       * content again. Compatibility with some OpenRTB 2.2 exchanges that adopted
       * the alternate representation may require custom handling of the JSON.
       * </pre>
       *
       * <code>optional string keywords = 5;</code>
       * @return Whether the keywords field is set.
       */
      boolean hasKeywords();
      /**
       * <pre>
       * Comma separated list of keywords, interests, or intent.
       * Note: OpenRTB 2.2 allowed an array-of-strings as alternate implementation
       * but this was fixed in 2.3+ where it's definitely a single string with CSV
       * content again. Compatibility with some OpenRTB 2.2 exchanges that adopted
       * the alternate representation may require custom handling of the JSON.
       * </pre>
       *
       * <code>optional string keywords = 5;</code>
       * @return The keywords.
       */
      java.lang.String getKeywords();
      /**
       * <pre>
       * Comma separated list of keywords, interests, or intent.
       * Note: OpenRTB 2.2 allowed an array-of-strings as alternate implementation
       * but this was fixed in 2.3+ where it's definitely a single string with CSV
       * content again. Compatibility with some OpenRTB 2.2 exchanges that adopted
       * the alternate representation may require custom handling of the JSON.
       * </pre>
       *
       * <code>optional string keywords = 5;</code>
       * @return The bytes for keywords.
       */
      com.google.protobuf.ByteString
          getKeywordsBytes();

      /**
       * <pre>
       * Optional feature to pass bidder data set in the exchange's cookie.
       * The string must be in base85 cookie safe characters and be in any format.
       * Proper JSON encoding must be used to include "escaped" quotation marks.
       * </pre>
       *
       * <code>optional string customdata = 6;</code>
       * @return Whether the customdata field is set.
       */
      boolean hasCustomdata();
      /**
       * <pre>
       * Optional feature to pass bidder data set in the exchange's cookie.
       * The string must be in base85 cookie safe characters and be in any format.
       * Proper JSON encoding must be used to include "escaped" quotation marks.
       * </pre>
       *
       * <code>optional string customdata = 6;</code>
       * @return The customdata.
       */
      java.lang.String getCustomdata();
      /**
       * <pre>
       * Optional feature to pass bidder data set in the exchange's cookie.
       * The string must be in base85 cookie safe characters and be in any format.
       * Proper JSON encoding must be used to include "escaped" quotation marks.
       * </pre>
       *
       * <code>optional string customdata = 6;</code>
       * @return The bytes for customdata.
       */
      com.google.protobuf.ByteString
          getCustomdataBytes();

      /**
       * <pre>
       * Location of the user's home base defined by a Geo object
       * (Section 3.2.12). This is not necessarily their current location.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Geo geo = 7;</code>
       * @return Whether the geo field is set.
       */
      boolean hasGeo();
      /**
       * <pre>
       * Location of the user's home base defined by a Geo object
       * (Section 3.2.12). This is not necessarily their current location.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Geo geo = 7;</code>
       * @return The geo.
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo getGeo();
      /**
       * <pre>
       * Location of the user's home base defined by a Geo object
       * (Section 3.2.12). This is not necessarily their current location.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Geo geo = 7;</code>
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.GeoOrBuilder getGeoOrBuilder();

      /**
       * <pre>
       * Additional user data. Each Data object (Section 3.2.14) represents a
       * different data source.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 8;</code>
       */
      java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data> 
          getDataList();
      /**
       * <pre>
       * Additional user data. Each Data object (Section 3.2.14) represents a
       * different data source.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 8;</code>
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data getData(int index);
      /**
       * <pre>
       * Additional user data. Each Data object (Section 3.2.14) represents a
       * different data source.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 8;</code>
       */
      int getDataCount();
      /**
       * <pre>
       * Additional user data. Each Data object (Section 3.2.14) represents a
       * different data source.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 8;</code>
       */
      java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.DataOrBuilder> 
          getDataOrBuilderList();
      /**
       * <pre>
       * Additional user data. Each Data object (Section 3.2.14) represents a
       * different data source.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 8;</code>
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.DataOrBuilder getDataOrBuilder(
          int index);

      /**
       * <pre>
       * When GDPR regulations are in effect this attribute contains the
       * Transparency and Consent Framework’s Consent String data structure.
       * </pre>
       *
       * <code>optional string consent = 10;</code>
       * @return Whether the consent field is set.
       */
      boolean hasConsent();
      /**
       * <pre>
       * When GDPR regulations are in effect this attribute contains the
       * Transparency and Consent Framework’s Consent String data structure.
       * </pre>
       *
       * <code>optional string consent = 10;</code>
       * @return The consent.
       */
      java.lang.String getConsent();
      /**
       * <pre>
       * When GDPR regulations are in effect this attribute contains the
       * Transparency and Consent Framework’s Consent String data structure.
       * </pre>
       *
       * <code>optional string consent = 10;</code>
       * @return The bytes for consent.
       */
      com.google.protobuf.ByteString
          getConsentBytes();
    }
    /**
     * <pre>
     * OpenRTB 2.0: This object contains information known or derived about
     * the human user of the device (i.e., the audience for advertising).
     * The user id is an exchange artifact and may be subject to rotation or other
     * privacy policies. However, this user ID must be stable long enough to serve
     * reasonably as the basis for frequency capping and retargeting.
     * </pre>
     *
     * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.User}
     */
    public static final class User extends
        com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
          User> implements
        // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.BidRequest.User)
        UserOrBuilder {
    private static final long serialVersionUID = 0L;
      // Use User.newBuilder() to construct.
      private User(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User, ?> builder) {
        super(builder);
      }
      private User() {
        id_ = "";
        buyeruid_ = "";
        gender_ = "";
        keywords_ = "";
        customdata_ = "";
        data_ = java.util.Collections.emptyList();
        consent_ = "";
      }

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

      @java.lang.Override
      public final com.google.protobuf.UnknownFieldSet
      getUnknownFields() {
        return this.unknownFields;
      }
      private User(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        this();
        if (extensionRegistry == null) {
          throw new java.lang.NullPointerException();
        }
        int mutable_bitField0_ = 0;
        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
            com.google.protobuf.UnknownFieldSet.newBuilder();
        try {
          boolean done = false;
          while (!done) {
            int tag = input.readTag();
            switch (tag) {
              case 0:
                done = true;
                break;
              case 10: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000001;
                id_ = bs;
                break;
              }
              case 18: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000002;
                buyeruid_ = bs;
                break;
              }
              case 24: {
                bitField0_ |= 0x00000004;
                yob_ = input.readInt32();
                break;
              }
              case 34: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000008;
                gender_ = bs;
                break;
              }
              case 42: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000010;
                keywords_ = bs;
                break;
              }
              case 50: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000020;
                customdata_ = bs;
                break;
              }
              case 58: {
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo.Builder subBuilder = null;
                if (((bitField0_ & 0x00000040) != 0)) {
                  subBuilder = geo_.toBuilder();
                }
                geo_ = input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo.PARSER, extensionRegistry);
                if (subBuilder != null) {
                  subBuilder.mergeFrom(geo_);
                  geo_ = subBuilder.buildPartial();
                }
                bitField0_ |= 0x00000040;
                break;
              }
              case 66: {
                if (!((mutable_bitField0_ & 0x00000080) != 0)) {
                  data_ = new java.util.ArrayList<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data>();
                  mutable_bitField0_ |= 0x00000080;
                }
                data_.add(
                    input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.PARSER, extensionRegistry));
                break;
              }
              case 82: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000080;
                consent_ = bs;
                break;
              }
              default: {
                if (!parseUnknownField(
                    input, unknownFields, extensionRegistry, tag)) {
                  done = true;
                }
                break;
              }
            }
          }
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          throw e.setUnfinishedMessage(this);
        } catch (java.io.IOException e) {
          throw new com.google.protobuf.InvalidProtocolBufferException(
              e).setUnfinishedMessage(this);
        } finally {
          if (((mutable_bitField0_ & 0x00000080) != 0)) {
            data_ = java.util.Collections.unmodifiableList(data_);
          }
          this.unknownFields = unknownFields.build();
          makeExtensionsImmutable();
        }
      }
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_User_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_User_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User.Builder.class);
      }

      private int bitField0_;
      public static final int ID_FIELD_NUMBER = 1;
      private volatile java.lang.Object id_;
      /**
       * <pre>
       * Exchange-specific ID for the user. At least one of id or buyeruid
       * is recommended.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return Whether the id field is set.
       */
      @java.lang.Override
      public boolean hasId() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <pre>
       * Exchange-specific ID for the user. At least one of id or buyeruid
       * is recommended.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return The id.
       */
      @java.lang.Override
      public java.lang.String getId() {
        java.lang.Object ref = id_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            id_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Exchange-specific ID for the user. At least one of id or buyeruid
       * is recommended.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return The bytes for id.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getIdBytes() {
        java.lang.Object ref = id_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          id_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int BUYERUID_FIELD_NUMBER = 2;
      private volatile java.lang.Object buyeruid_;
      /**
       * <pre>
       * Buyer-specific ID for the user as mapped by the exchange for the buyer.
       * At least one of buyeruid or id is recommended.
       * </pre>
       *
       * <code>optional string buyeruid = 2;</code>
       * @return Whether the buyeruid field is set.
       */
      @java.lang.Override
      public boolean hasBuyeruid() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <pre>
       * Buyer-specific ID for the user as mapped by the exchange for the buyer.
       * At least one of buyeruid or id is recommended.
       * </pre>
       *
       * <code>optional string buyeruid = 2;</code>
       * @return The buyeruid.
       */
      @java.lang.Override
      public java.lang.String getBuyeruid() {
        java.lang.Object ref = buyeruid_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            buyeruid_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Buyer-specific ID for the user as mapped by the exchange for the buyer.
       * At least one of buyeruid or id is recommended.
       * </pre>
       *
       * <code>optional string buyeruid = 2;</code>
       * @return The bytes for buyeruid.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getBuyeruidBytes() {
        java.lang.Object ref = buyeruid_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          buyeruid_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int YOB_FIELD_NUMBER = 3;
      private int yob_;
      /**
       * <pre>
       * Year of birth as a 4-digit integer.
       * </pre>
       *
       * <code>optional int32 yob = 3;</code>
       * @return Whether the yob field is set.
       */
      @java.lang.Override
      public boolean hasYob() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <pre>
       * Year of birth as a 4-digit integer.
       * </pre>
       *
       * <code>optional int32 yob = 3;</code>
       * @return The yob.
       */
      @java.lang.Override
      public int getYob() {
        return yob_;
      }

      public static final int GENDER_FIELD_NUMBER = 4;
      private volatile java.lang.Object gender_;
      /**
       * <pre>
       * Gender as "M" male, "F" female, "O" Other. (Null indicates unknown)
       * </pre>
       *
       * <code>optional string gender = 4;</code>
       * @return Whether the gender field is set.
       */
      @java.lang.Override
      public boolean hasGender() {
        return ((bitField0_ & 0x00000008) != 0);
      }
      /**
       * <pre>
       * Gender as "M" male, "F" female, "O" Other. (Null indicates unknown)
       * </pre>
       *
       * <code>optional string gender = 4;</code>
       * @return The gender.
       */
      @java.lang.Override
      public java.lang.String getGender() {
        java.lang.Object ref = gender_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            gender_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Gender as "M" male, "F" female, "O" Other. (Null indicates unknown)
       * </pre>
       *
       * <code>optional string gender = 4;</code>
       * @return The bytes for gender.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getGenderBytes() {
        java.lang.Object ref = gender_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          gender_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int KEYWORDS_FIELD_NUMBER = 5;
      private volatile java.lang.Object keywords_;
      /**
       * <pre>
       * Comma separated list of keywords, interests, or intent.
       * Note: OpenRTB 2.2 allowed an array-of-strings as alternate implementation
       * but this was fixed in 2.3+ where it's definitely a single string with CSV
       * content again. Compatibility with some OpenRTB 2.2 exchanges that adopted
       * the alternate representation may require custom handling of the JSON.
       * </pre>
       *
       * <code>optional string keywords = 5;</code>
       * @return Whether the keywords field is set.
       */
      @java.lang.Override
      public boolean hasKeywords() {
        return ((bitField0_ & 0x00000010) != 0);
      }
      /**
       * <pre>
       * Comma separated list of keywords, interests, or intent.
       * Note: OpenRTB 2.2 allowed an array-of-strings as alternate implementation
       * but this was fixed in 2.3+ where it's definitely a single string with CSV
       * content again. Compatibility with some OpenRTB 2.2 exchanges that adopted
       * the alternate representation may require custom handling of the JSON.
       * </pre>
       *
       * <code>optional string keywords = 5;</code>
       * @return The keywords.
       */
      @java.lang.Override
      public java.lang.String getKeywords() {
        java.lang.Object ref = keywords_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            keywords_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Comma separated list of keywords, interests, or intent.
       * Note: OpenRTB 2.2 allowed an array-of-strings as alternate implementation
       * but this was fixed in 2.3+ where it's definitely a single string with CSV
       * content again. Compatibility with some OpenRTB 2.2 exchanges that adopted
       * the alternate representation may require custom handling of the JSON.
       * </pre>
       *
       * <code>optional string keywords = 5;</code>
       * @return The bytes for keywords.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getKeywordsBytes() {
        java.lang.Object ref = keywords_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          keywords_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int CUSTOMDATA_FIELD_NUMBER = 6;
      private volatile java.lang.Object customdata_;
      /**
       * <pre>
       * Optional feature to pass bidder data set in the exchange's cookie.
       * The string must be in base85 cookie safe characters and be in any format.
       * Proper JSON encoding must be used to include "escaped" quotation marks.
       * </pre>
       *
       * <code>optional string customdata = 6;</code>
       * @return Whether the customdata field is set.
       */
      @java.lang.Override
      public boolean hasCustomdata() {
        return ((bitField0_ & 0x00000020) != 0);
      }
      /**
       * <pre>
       * Optional feature to pass bidder data set in the exchange's cookie.
       * The string must be in base85 cookie safe characters and be in any format.
       * Proper JSON encoding must be used to include "escaped" quotation marks.
       * </pre>
       *
       * <code>optional string customdata = 6;</code>
       * @return The customdata.
       */
      @java.lang.Override
      public java.lang.String getCustomdata() {
        java.lang.Object ref = customdata_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            customdata_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Optional feature to pass bidder data set in the exchange's cookie.
       * The string must be in base85 cookie safe characters and be in any format.
       * Proper JSON encoding must be used to include "escaped" quotation marks.
       * </pre>
       *
       * <code>optional string customdata = 6;</code>
       * @return The bytes for customdata.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getCustomdataBytes() {
        java.lang.Object ref = customdata_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          customdata_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int GEO_FIELD_NUMBER = 7;
      private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo geo_;
      /**
       * <pre>
       * Location of the user's home base defined by a Geo object
       * (Section 3.2.12). This is not necessarily their current location.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Geo geo = 7;</code>
       * @return Whether the geo field is set.
       */
      @java.lang.Override
      public boolean hasGeo() {
        return ((bitField0_ & 0x00000040) != 0);
      }
      /**
       * <pre>
       * Location of the user's home base defined by a Geo object
       * (Section 3.2.12). This is not necessarily their current location.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Geo geo = 7;</code>
       * @return The geo.
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo getGeo() {
        return geo_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo.getDefaultInstance() : geo_;
      }
      /**
       * <pre>
       * Location of the user's home base defined by a Geo object
       * (Section 3.2.12). This is not necessarily their current location.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Geo geo = 7;</code>
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.GeoOrBuilder getGeoOrBuilder() {
        return geo_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo.getDefaultInstance() : geo_;
      }

      public static final int DATA_FIELD_NUMBER = 8;
      private java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data> data_;
      /**
       * <pre>
       * Additional user data. Each Data object (Section 3.2.14) represents a
       * different data source.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 8;</code>
       */
      @java.lang.Override
      public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data> getDataList() {
        return data_;
      }
      /**
       * <pre>
       * Additional user data. Each Data object (Section 3.2.14) represents a
       * different data source.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 8;</code>
       */
      @java.lang.Override
      public java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.DataOrBuilder> 
          getDataOrBuilderList() {
        return data_;
      }
      /**
       * <pre>
       * Additional user data. Each Data object (Section 3.2.14) represents a
       * different data source.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 8;</code>
       */
      @java.lang.Override
      public int getDataCount() {
        return data_.size();
      }
      /**
       * <pre>
       * Additional user data. Each Data object (Section 3.2.14) represents a
       * different data source.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 8;</code>
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data getData(int index) {
        return data_.get(index);
      }
      /**
       * <pre>
       * Additional user data. Each Data object (Section 3.2.14) represents a
       * different data source.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 8;</code>
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.DataOrBuilder getDataOrBuilder(
          int index) {
        return data_.get(index);
      }

      public static final int CONSENT_FIELD_NUMBER = 10;
      private volatile java.lang.Object consent_;
      /**
       * <pre>
       * When GDPR regulations are in effect this attribute contains the
       * Transparency and Consent Framework’s Consent String data structure.
       * </pre>
       *
       * <code>optional string consent = 10;</code>
       * @return Whether the consent field is set.
       */
      @java.lang.Override
      public boolean hasConsent() {
        return ((bitField0_ & 0x00000080) != 0);
      }
      /**
       * <pre>
       * When GDPR regulations are in effect this attribute contains the
       * Transparency and Consent Framework’s Consent String data structure.
       * </pre>
       *
       * <code>optional string consent = 10;</code>
       * @return The consent.
       */
      @java.lang.Override
      public java.lang.String getConsent() {
        java.lang.Object ref = consent_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            consent_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * When GDPR regulations are in effect this attribute contains the
       * Transparency and Consent Framework’s Consent String data structure.
       * </pre>
       *
       * <code>optional string consent = 10;</code>
       * @return The bytes for consent.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getConsentBytes() {
        java.lang.Object ref = consent_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          consent_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

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

        if (hasGeo()) {
          if (!getGeo().isInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
        }
        for (int i = 0; i < getDataCount(); i++) {
          if (!getData(i).isInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
        }
        if (!extensionsAreInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
        memoizedIsInitialized = 1;
        return true;
      }

      @java.lang.Override
      public void writeTo(com.google.protobuf.CodedOutputStream output)
                          throws java.io.IOException {
        com.google.protobuf.GeneratedMessageV3
          .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User>.ExtensionWriter
            extensionWriter = newExtensionWriter();
        if (((bitField0_ & 0x00000001) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 1, id_);
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 2, buyeruid_);
        }
        if (((bitField0_ & 0x00000004) != 0)) {
          output.writeInt32(3, yob_);
        }
        if (((bitField0_ & 0x00000008) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 4, gender_);
        }
        if (((bitField0_ & 0x00000010) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 5, keywords_);
        }
        if (((bitField0_ & 0x00000020) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 6, customdata_);
        }
        if (((bitField0_ & 0x00000040) != 0)) {
          output.writeMessage(7, getGeo());
        }
        for (int i = 0; i < data_.size(); i++) {
          output.writeMessage(8, data_.get(i));
        }
        if (((bitField0_ & 0x00000080) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 10, consent_);
        }
        extensionWriter.writeUntil(10000, output);
        unknownFields.writeTo(output);
      }

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

        size = 0;
        if (((bitField0_ & 0x00000001) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, id_);
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, buyeruid_);
        }
        if (((bitField0_ & 0x00000004) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeInt32Size(3, yob_);
        }
        if (((bitField0_ & 0x00000008) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, gender_);
        }
        if (((bitField0_ & 0x00000010) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(5, keywords_);
        }
        if (((bitField0_ & 0x00000020) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(6, customdata_);
        }
        if (((bitField0_ & 0x00000040) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeMessageSize(7, getGeo());
        }
        for (int i = 0; i < data_.size(); i++) {
          size += com.google.protobuf.CodedOutputStream
            .computeMessageSize(8, data_.get(i));
        }
        if (((bitField0_ & 0x00000080) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(10, consent_);
        }
        size += extensionsSerializedSize();
        size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User)) {
          return super.equals(obj);
        }
        com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User other = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User) obj;

        if (hasId() != other.hasId()) return false;
        if (hasId()) {
          if (!getId()
              .equals(other.getId())) return false;
        }
        if (hasBuyeruid() != other.hasBuyeruid()) return false;
        if (hasBuyeruid()) {
          if (!getBuyeruid()
              .equals(other.getBuyeruid())) return false;
        }
        if (hasYob() != other.hasYob()) return false;
        if (hasYob()) {
          if (getYob()
              != other.getYob()) return false;
        }
        if (hasGender() != other.hasGender()) return false;
        if (hasGender()) {
          if (!getGender()
              .equals(other.getGender())) return false;
        }
        if (hasKeywords() != other.hasKeywords()) return false;
        if (hasKeywords()) {
          if (!getKeywords()
              .equals(other.getKeywords())) return false;
        }
        if (hasCustomdata() != other.hasCustomdata()) return false;
        if (hasCustomdata()) {
          if (!getCustomdata()
              .equals(other.getCustomdata())) return false;
        }
        if (hasGeo() != other.hasGeo()) return false;
        if (hasGeo()) {
          if (!getGeo()
              .equals(other.getGeo())) return false;
        }
        if (!getDataList()
            .equals(other.getDataList())) return false;
        if (hasConsent() != other.hasConsent()) return false;
        if (hasConsent()) {
          if (!getConsent()
              .equals(other.getConsent())) return false;
        }
        if (!unknownFields.equals(other.unknownFields)) return false;
        if (!getExtensionFields().equals(other.getExtensionFields()))
          return false;
        return true;
      }

      @java.lang.Override
      public int hashCode() {
        if (memoizedHashCode != 0) {
          return memoizedHashCode;
        }
        int hash = 41;
        hash = (19 * hash) + getDescriptor().hashCode();
        if (hasId()) {
          hash = (37 * hash) + ID_FIELD_NUMBER;
          hash = (53 * hash) + getId().hashCode();
        }
        if (hasBuyeruid()) {
          hash = (37 * hash) + BUYERUID_FIELD_NUMBER;
          hash = (53 * hash) + getBuyeruid().hashCode();
        }
        if (hasYob()) {
          hash = (37 * hash) + YOB_FIELD_NUMBER;
          hash = (53 * hash) + getYob();
        }
        if (hasGender()) {
          hash = (37 * hash) + GENDER_FIELD_NUMBER;
          hash = (53 * hash) + getGender().hashCode();
        }
        if (hasKeywords()) {
          hash = (37 * hash) + KEYWORDS_FIELD_NUMBER;
          hash = (53 * hash) + getKeywords().hashCode();
        }
        if (hasCustomdata()) {
          hash = (37 * hash) + CUSTOMDATA_FIELD_NUMBER;
          hash = (53 * hash) + getCustomdata().hashCode();
        }
        if (hasGeo()) {
          hash = (37 * hash) + GEO_FIELD_NUMBER;
          hash = (53 * hash) + getGeo().hashCode();
        }
        if (getDataCount() > 0) {
          hash = (37 * hash) + DATA_FIELD_NUMBER;
          hash = (53 * hash) + getDataList().hashCode();
        }
        if (hasConsent()) {
          hash = (37 * hash) + CONSENT_FIELD_NUMBER;
          hash = (53 * hash) + getConsent().hashCode();
        }
        hash = hashFields(hash, getExtensionFields());
        hash = (29 * hash) + unknownFields.hashCode();
        memoizedHashCode = hash;
        return hash;
      }

      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User parseFrom(
          java.nio.ByteBuffer data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User parseFrom(
          java.nio.ByteBuffer data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User parseFrom(
          com.google.protobuf.ByteString data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User parseFrom(
          com.google.protobuf.ByteString data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User parseFrom(byte[] data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User parseFrom(
          byte[] data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User parseFrom(java.io.InputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User parseDelimitedFrom(java.io.InputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseDelimitedWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User parseFrom(
          com.google.protobuf.CodedInputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User 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>
       * OpenRTB 2.0: This object contains information known or derived about
       * the human user of the device (i.e., the audience for advertising).
       * The user id is an exchange artifact and may be subject to rotation or other
       * privacy policies. However, this user ID must be stable long enough to serve
       * reasonably as the basis for frequency capping and retargeting.
       * </pre>
       *
       * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.User}
       */
      public static final class Builder extends
          com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User, Builder> implements
          // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.BidRequest.User)
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserOrBuilder {
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_User_descriptor;
        }

        @java.lang.Override
        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_User_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User.Builder.class);
        }

        // Construct using com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User.newBuilder()
        private Builder() {
          maybeForceBuilderInitialization();
        }

        private Builder(
            com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
          super(parent);
          maybeForceBuilderInitialization();
        }
        private void maybeForceBuilderInitialization() {
          if (com.google.protobuf.GeneratedMessageV3
                  .alwaysUseFieldBuilders) {
            getGeoFieldBuilder();
            getDataFieldBuilder();
          }
        }
        @java.lang.Override
        public Builder clear() {
          super.clear();
          id_ = "";
          bitField0_ = (bitField0_ & ~0x00000001);
          buyeruid_ = "";
          bitField0_ = (bitField0_ & ~0x00000002);
          yob_ = 0;
          bitField0_ = (bitField0_ & ~0x00000004);
          gender_ = "";
          bitField0_ = (bitField0_ & ~0x00000008);
          keywords_ = "";
          bitField0_ = (bitField0_ & ~0x00000010);
          customdata_ = "";
          bitField0_ = (bitField0_ & ~0x00000020);
          if (geoBuilder_ == null) {
            geo_ = null;
          } else {
            geoBuilder_.clear();
          }
          bitField0_ = (bitField0_ & ~0x00000040);
          if (dataBuilder_ == null) {
            data_ = java.util.Collections.emptyList();
            bitField0_ = (bitField0_ & ~0x00000080);
          } else {
            dataBuilder_.clear();
          }
          consent_ = "";
          bitField0_ = (bitField0_ & ~0x00000100);
          return this;
        }

        @java.lang.Override
        public com.google.protobuf.Descriptors.Descriptor
            getDescriptorForType() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_User_descriptor;
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User getDefaultInstanceForType() {
          return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User.getDefaultInstance();
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User build() {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User result = buildPartial();
          if (!result.isInitialized()) {
            throw newUninitializedMessageException(result);
          }
          return result;
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User buildPartial() {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User result = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User(this);
          int from_bitField0_ = bitField0_;
          int to_bitField0_ = 0;
          if (((from_bitField0_ & 0x00000001) != 0)) {
            to_bitField0_ |= 0x00000001;
          }
          result.id_ = id_;
          if (((from_bitField0_ & 0x00000002) != 0)) {
            to_bitField0_ |= 0x00000002;
          }
          result.buyeruid_ = buyeruid_;
          if (((from_bitField0_ & 0x00000004) != 0)) {
            result.yob_ = yob_;
            to_bitField0_ |= 0x00000004;
          }
          if (((from_bitField0_ & 0x00000008) != 0)) {
            to_bitField0_ |= 0x00000008;
          }
          result.gender_ = gender_;
          if (((from_bitField0_ & 0x00000010) != 0)) {
            to_bitField0_ |= 0x00000010;
          }
          result.keywords_ = keywords_;
          if (((from_bitField0_ & 0x00000020) != 0)) {
            to_bitField0_ |= 0x00000020;
          }
          result.customdata_ = customdata_;
          if (((from_bitField0_ & 0x00000040) != 0)) {
            if (geoBuilder_ == null) {
              result.geo_ = geo_;
            } else {
              result.geo_ = geoBuilder_.build();
            }
            to_bitField0_ |= 0x00000040;
          }
          if (dataBuilder_ == null) {
            if (((bitField0_ & 0x00000080) != 0)) {
              data_ = java.util.Collections.unmodifiableList(data_);
              bitField0_ = (bitField0_ & ~0x00000080);
            }
            result.data_ = data_;
          } else {
            result.data_ = dataBuilder_.build();
          }
          if (((from_bitField0_ & 0x00000100) != 0)) {
            to_bitField0_ |= 0x00000080;
          }
          result.consent_ = consent_;
          result.bitField0_ = to_bitField0_;
          onBuilt();
          return result;
        }

        @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 <Type> Builder setExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User, Type> extension,
            Type value) {
          return super.setExtension(extension, value);
        }
        @java.lang.Override
        public <Type> Builder setExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User, java.util.List<Type>> extension,
            int index, Type value) {
          return super.setExtension(extension, index, value);
        }
        @java.lang.Override
        public <Type> Builder addExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User, java.util.List<Type>> extension,
            Type value) {
          return super.addExtension(extension, value);
        }
        @java.lang.Override
        public <Type> Builder clearExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User, ?> extension) {
          return super.clearExtension(extension);
        }
        @java.lang.Override
        public Builder mergeFrom(com.google.protobuf.Message other) {
          if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User) {
            return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User)other);
          } else {
            super.mergeFrom(other);
            return this;
          }
        }

        public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User other) {
          if (other == com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User.getDefaultInstance()) return this;
          if (other.hasId()) {
            bitField0_ |= 0x00000001;
            id_ = other.id_;
            onChanged();
          }
          if (other.hasBuyeruid()) {
            bitField0_ |= 0x00000002;
            buyeruid_ = other.buyeruid_;
            onChanged();
          }
          if (other.hasYob()) {
            setYob(other.getYob());
          }
          if (other.hasGender()) {
            bitField0_ |= 0x00000008;
            gender_ = other.gender_;
            onChanged();
          }
          if (other.hasKeywords()) {
            bitField0_ |= 0x00000010;
            keywords_ = other.keywords_;
            onChanged();
          }
          if (other.hasCustomdata()) {
            bitField0_ |= 0x00000020;
            customdata_ = other.customdata_;
            onChanged();
          }
          if (other.hasGeo()) {
            mergeGeo(other.getGeo());
          }
          if (dataBuilder_ == null) {
            if (!other.data_.isEmpty()) {
              if (data_.isEmpty()) {
                data_ = other.data_;
                bitField0_ = (bitField0_ & ~0x00000080);
              } else {
                ensureDataIsMutable();
                data_.addAll(other.data_);
              }
              onChanged();
            }
          } else {
            if (!other.data_.isEmpty()) {
              if (dataBuilder_.isEmpty()) {
                dataBuilder_.dispose();
                dataBuilder_ = null;
                data_ = other.data_;
                bitField0_ = (bitField0_ & ~0x00000080);
                dataBuilder_ = 
                  com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
                     getDataFieldBuilder() : null;
              } else {
                dataBuilder_.addAllMessages(other.data_);
              }
            }
          }
          if (other.hasConsent()) {
            bitField0_ |= 0x00000100;
            consent_ = other.consent_;
            onChanged();
          }
          this.mergeExtensionFields(other);
          this.mergeUnknownFields(other.unknownFields);
          onChanged();
          return this;
        }

        @java.lang.Override
        public final boolean isInitialized() {
          if (hasGeo()) {
            if (!getGeo().isInitialized()) {
              return false;
            }
          }
          for (int i = 0; i < getDataCount(); i++) {
            if (!getData(i).isInitialized()) {
              return false;
            }
          }
          if (!extensionsAreInitialized()) {
            return false;
          }
          return true;
        }

        @java.lang.Override
        public Builder mergeFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws java.io.IOException {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User parsedMessage = null;
          try {
            parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User) e.getUnfinishedMessage();
            throw e.unwrapIOException();
          } finally {
            if (parsedMessage != null) {
              mergeFrom(parsedMessage);
            }
          }
          return this;
        }
        private int bitField0_;

        private java.lang.Object id_ = "";
        /**
         * <pre>
         * Exchange-specific ID for the user. At least one of id or buyeruid
         * is recommended.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @return Whether the id field is set.
         */
        public boolean hasId() {
          return ((bitField0_ & 0x00000001) != 0);
        }
        /**
         * <pre>
         * Exchange-specific ID for the user. At least one of id or buyeruid
         * is recommended.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @return The id.
         */
        public java.lang.String getId() {
          java.lang.Object ref = id_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              id_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Exchange-specific ID for the user. At least one of id or buyeruid
         * is recommended.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @return The bytes for id.
         */
        public com.google.protobuf.ByteString
            getIdBytes() {
          java.lang.Object ref = id_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            id_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Exchange-specific ID for the user. At least one of id or buyeruid
         * is recommended.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @param value The id to set.
         * @return This builder for chaining.
         */
        public Builder setId(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
          id_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Exchange-specific ID for the user. At least one of id or buyeruid
         * is recommended.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @return This builder for chaining.
         */
        public Builder clearId() {
          bitField0_ = (bitField0_ & ~0x00000001);
          id_ = getDefaultInstance().getId();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Exchange-specific ID for the user. At least one of id or buyeruid
         * is recommended.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @param value The bytes for id to set.
         * @return This builder for chaining.
         */
        public Builder setIdBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
          id_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object buyeruid_ = "";
        /**
         * <pre>
         * Buyer-specific ID for the user as mapped by the exchange for the buyer.
         * At least one of buyeruid or id is recommended.
         * </pre>
         *
         * <code>optional string buyeruid = 2;</code>
         * @return Whether the buyeruid field is set.
         */
        public boolean hasBuyeruid() {
          return ((bitField0_ & 0x00000002) != 0);
        }
        /**
         * <pre>
         * Buyer-specific ID for the user as mapped by the exchange for the buyer.
         * At least one of buyeruid or id is recommended.
         * </pre>
         *
         * <code>optional string buyeruid = 2;</code>
         * @return The buyeruid.
         */
        public java.lang.String getBuyeruid() {
          java.lang.Object ref = buyeruid_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              buyeruid_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Buyer-specific ID for the user as mapped by the exchange for the buyer.
         * At least one of buyeruid or id is recommended.
         * </pre>
         *
         * <code>optional string buyeruid = 2;</code>
         * @return The bytes for buyeruid.
         */
        public com.google.protobuf.ByteString
            getBuyeruidBytes() {
          java.lang.Object ref = buyeruid_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            buyeruid_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Buyer-specific ID for the user as mapped by the exchange for the buyer.
         * At least one of buyeruid or id is recommended.
         * </pre>
         *
         * <code>optional string buyeruid = 2;</code>
         * @param value The buyeruid to set.
         * @return This builder for chaining.
         */
        public Builder setBuyeruid(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
          buyeruid_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Buyer-specific ID for the user as mapped by the exchange for the buyer.
         * At least one of buyeruid or id is recommended.
         * </pre>
         *
         * <code>optional string buyeruid = 2;</code>
         * @return This builder for chaining.
         */
        public Builder clearBuyeruid() {
          bitField0_ = (bitField0_ & ~0x00000002);
          buyeruid_ = getDefaultInstance().getBuyeruid();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Buyer-specific ID for the user as mapped by the exchange for the buyer.
         * At least one of buyeruid or id is recommended.
         * </pre>
         *
         * <code>optional string buyeruid = 2;</code>
         * @param value The bytes for buyeruid to set.
         * @return This builder for chaining.
         */
        public Builder setBuyeruidBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
          buyeruid_ = value;
          onChanged();
          return this;
        }

        private int yob_ ;
        /**
         * <pre>
         * Year of birth as a 4-digit integer.
         * </pre>
         *
         * <code>optional int32 yob = 3;</code>
         * @return Whether the yob field is set.
         */
        @java.lang.Override
        public boolean hasYob() {
          return ((bitField0_ & 0x00000004) != 0);
        }
        /**
         * <pre>
         * Year of birth as a 4-digit integer.
         * </pre>
         *
         * <code>optional int32 yob = 3;</code>
         * @return The yob.
         */
        @java.lang.Override
        public int getYob() {
          return yob_;
        }
        /**
         * <pre>
         * Year of birth as a 4-digit integer.
         * </pre>
         *
         * <code>optional int32 yob = 3;</code>
         * @param value The yob to set.
         * @return This builder for chaining.
         */
        public Builder setYob(int value) {
          bitField0_ |= 0x00000004;
          yob_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Year of birth as a 4-digit integer.
         * </pre>
         *
         * <code>optional int32 yob = 3;</code>
         * @return This builder for chaining.
         */
        public Builder clearYob() {
          bitField0_ = (bitField0_ & ~0x00000004);
          yob_ = 0;
          onChanged();
          return this;
        }

        private java.lang.Object gender_ = "";
        /**
         * <pre>
         * Gender as "M" male, "F" female, "O" Other. (Null indicates unknown)
         * </pre>
         *
         * <code>optional string gender = 4;</code>
         * @return Whether the gender field is set.
         */
        public boolean hasGender() {
          return ((bitField0_ & 0x00000008) != 0);
        }
        /**
         * <pre>
         * Gender as "M" male, "F" female, "O" Other. (Null indicates unknown)
         * </pre>
         *
         * <code>optional string gender = 4;</code>
         * @return The gender.
         */
        public java.lang.String getGender() {
          java.lang.Object ref = gender_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              gender_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Gender as "M" male, "F" female, "O" Other. (Null indicates unknown)
         * </pre>
         *
         * <code>optional string gender = 4;</code>
         * @return The bytes for gender.
         */
        public com.google.protobuf.ByteString
            getGenderBytes() {
          java.lang.Object ref = gender_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            gender_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Gender as "M" male, "F" female, "O" Other. (Null indicates unknown)
         * </pre>
         *
         * <code>optional string gender = 4;</code>
         * @param value The gender to set.
         * @return This builder for chaining.
         */
        public Builder setGender(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
          gender_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Gender as "M" male, "F" female, "O" Other. (Null indicates unknown)
         * </pre>
         *
         * <code>optional string gender = 4;</code>
         * @return This builder for chaining.
         */
        public Builder clearGender() {
          bitField0_ = (bitField0_ & ~0x00000008);
          gender_ = getDefaultInstance().getGender();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Gender as "M" male, "F" female, "O" Other. (Null indicates unknown)
         * </pre>
         *
         * <code>optional string gender = 4;</code>
         * @param value The bytes for gender to set.
         * @return This builder for chaining.
         */
        public Builder setGenderBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
          gender_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object keywords_ = "";
        /**
         * <pre>
         * Comma separated list of keywords, interests, or intent.
         * Note: OpenRTB 2.2 allowed an array-of-strings as alternate implementation
         * but this was fixed in 2.3+ where it's definitely a single string with CSV
         * content again. Compatibility with some OpenRTB 2.2 exchanges that adopted
         * the alternate representation may require custom handling of the JSON.
         * </pre>
         *
         * <code>optional string keywords = 5;</code>
         * @return Whether the keywords field is set.
         */
        public boolean hasKeywords() {
          return ((bitField0_ & 0x00000010) != 0);
        }
        /**
         * <pre>
         * Comma separated list of keywords, interests, or intent.
         * Note: OpenRTB 2.2 allowed an array-of-strings as alternate implementation
         * but this was fixed in 2.3+ where it's definitely a single string with CSV
         * content again. Compatibility with some OpenRTB 2.2 exchanges that adopted
         * the alternate representation may require custom handling of the JSON.
         * </pre>
         *
         * <code>optional string keywords = 5;</code>
         * @return The keywords.
         */
        public java.lang.String getKeywords() {
          java.lang.Object ref = keywords_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              keywords_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Comma separated list of keywords, interests, or intent.
         * Note: OpenRTB 2.2 allowed an array-of-strings as alternate implementation
         * but this was fixed in 2.3+ where it's definitely a single string with CSV
         * content again. Compatibility with some OpenRTB 2.2 exchanges that adopted
         * the alternate representation may require custom handling of the JSON.
         * </pre>
         *
         * <code>optional string keywords = 5;</code>
         * @return The bytes for keywords.
         */
        public com.google.protobuf.ByteString
            getKeywordsBytes() {
          java.lang.Object ref = keywords_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            keywords_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Comma separated list of keywords, interests, or intent.
         * Note: OpenRTB 2.2 allowed an array-of-strings as alternate implementation
         * but this was fixed in 2.3+ where it's definitely a single string with CSV
         * content again. Compatibility with some OpenRTB 2.2 exchanges that adopted
         * the alternate representation may require custom handling of the JSON.
         * </pre>
         *
         * <code>optional string keywords = 5;</code>
         * @param value The keywords to set.
         * @return This builder for chaining.
         */
        public Builder setKeywords(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
          keywords_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Comma separated list of keywords, interests, or intent.
         * Note: OpenRTB 2.2 allowed an array-of-strings as alternate implementation
         * but this was fixed in 2.3+ where it's definitely a single string with CSV
         * content again. Compatibility with some OpenRTB 2.2 exchanges that adopted
         * the alternate representation may require custom handling of the JSON.
         * </pre>
         *
         * <code>optional string keywords = 5;</code>
         * @return This builder for chaining.
         */
        public Builder clearKeywords() {
          bitField0_ = (bitField0_ & ~0x00000010);
          keywords_ = getDefaultInstance().getKeywords();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Comma separated list of keywords, interests, or intent.
         * Note: OpenRTB 2.2 allowed an array-of-strings as alternate implementation
         * but this was fixed in 2.3+ where it's definitely a single string with CSV
         * content again. Compatibility with some OpenRTB 2.2 exchanges that adopted
         * the alternate representation may require custom handling of the JSON.
         * </pre>
         *
         * <code>optional string keywords = 5;</code>
         * @param value The bytes for keywords to set.
         * @return This builder for chaining.
         */
        public Builder setKeywordsBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
          keywords_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object customdata_ = "";
        /**
         * <pre>
         * Optional feature to pass bidder data set in the exchange's cookie.
         * The string must be in base85 cookie safe characters and be in any format.
         * Proper JSON encoding must be used to include "escaped" quotation marks.
         * </pre>
         *
         * <code>optional string customdata = 6;</code>
         * @return Whether the customdata field is set.
         */
        public boolean hasCustomdata() {
          return ((bitField0_ & 0x00000020) != 0);
        }
        /**
         * <pre>
         * Optional feature to pass bidder data set in the exchange's cookie.
         * The string must be in base85 cookie safe characters and be in any format.
         * Proper JSON encoding must be used to include "escaped" quotation marks.
         * </pre>
         *
         * <code>optional string customdata = 6;</code>
         * @return The customdata.
         */
        public java.lang.String getCustomdata() {
          java.lang.Object ref = customdata_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              customdata_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Optional feature to pass bidder data set in the exchange's cookie.
         * The string must be in base85 cookie safe characters and be in any format.
         * Proper JSON encoding must be used to include "escaped" quotation marks.
         * </pre>
         *
         * <code>optional string customdata = 6;</code>
         * @return The bytes for customdata.
         */
        public com.google.protobuf.ByteString
            getCustomdataBytes() {
          java.lang.Object ref = customdata_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            customdata_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Optional feature to pass bidder data set in the exchange's cookie.
         * The string must be in base85 cookie safe characters and be in any format.
         * Proper JSON encoding must be used to include "escaped" quotation marks.
         * </pre>
         *
         * <code>optional string customdata = 6;</code>
         * @param value The customdata to set.
         * @return This builder for chaining.
         */
        public Builder setCustomdata(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000020;
          customdata_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Optional feature to pass bidder data set in the exchange's cookie.
         * The string must be in base85 cookie safe characters and be in any format.
         * Proper JSON encoding must be used to include "escaped" quotation marks.
         * </pre>
         *
         * <code>optional string customdata = 6;</code>
         * @return This builder for chaining.
         */
        public Builder clearCustomdata() {
          bitField0_ = (bitField0_ & ~0x00000020);
          customdata_ = getDefaultInstance().getCustomdata();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Optional feature to pass bidder data set in the exchange's cookie.
         * The string must be in base85 cookie safe characters and be in any format.
         * Proper JSON encoding must be used to include "escaped" quotation marks.
         * </pre>
         *
         * <code>optional string customdata = 6;</code>
         * @param value The bytes for customdata to set.
         * @return This builder for chaining.
         */
        public Builder setCustomdataBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000020;
          customdata_ = value;
          onChanged();
          return this;
        }

        private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo geo_;
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.GeoOrBuilder> geoBuilder_;
        /**
         * <pre>
         * Location of the user's home base defined by a Geo object
         * (Section 3.2.12). This is not necessarily their current location.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Geo geo = 7;</code>
         * @return Whether the geo field is set.
         */
        public boolean hasGeo() {
          return ((bitField0_ & 0x00000040) != 0);
        }
        /**
         * <pre>
         * Location of the user's home base defined by a Geo object
         * (Section 3.2.12). This is not necessarily their current location.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Geo geo = 7;</code>
         * @return The geo.
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo getGeo() {
          if (geoBuilder_ == null) {
            return geo_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo.getDefaultInstance() : geo_;
          } else {
            return geoBuilder_.getMessage();
          }
        }
        /**
         * <pre>
         * Location of the user's home base defined by a Geo object
         * (Section 3.2.12). This is not necessarily their current location.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Geo geo = 7;</code>
         */
        public Builder setGeo(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo value) {
          if (geoBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            geo_ = value;
            onChanged();
          } else {
            geoBuilder_.setMessage(value);
          }
          bitField0_ |= 0x00000040;
          return this;
        }
        /**
         * <pre>
         * Location of the user's home base defined by a Geo object
         * (Section 3.2.12). This is not necessarily their current location.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Geo geo = 7;</code>
         */
        public Builder setGeo(
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo.Builder builderForValue) {
          if (geoBuilder_ == null) {
            geo_ = builderForValue.build();
            onChanged();
          } else {
            geoBuilder_.setMessage(builderForValue.build());
          }
          bitField0_ |= 0x00000040;
          return this;
        }
        /**
         * <pre>
         * Location of the user's home base defined by a Geo object
         * (Section 3.2.12). This is not necessarily their current location.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Geo geo = 7;</code>
         */
        public Builder mergeGeo(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo value) {
          if (geoBuilder_ == null) {
            if (((bitField0_ & 0x00000040) != 0) &&
                geo_ != null &&
                geo_ != com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo.getDefaultInstance()) {
              geo_ =
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo.newBuilder(geo_).mergeFrom(value).buildPartial();
            } else {
              geo_ = value;
            }
            onChanged();
          } else {
            geoBuilder_.mergeFrom(value);
          }
          bitField0_ |= 0x00000040;
          return this;
        }
        /**
         * <pre>
         * Location of the user's home base defined by a Geo object
         * (Section 3.2.12). This is not necessarily their current location.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Geo geo = 7;</code>
         */
        public Builder clearGeo() {
          if (geoBuilder_ == null) {
            geo_ = null;
            onChanged();
          } else {
            geoBuilder_.clear();
          }
          bitField0_ = (bitField0_ & ~0x00000040);
          return this;
        }
        /**
         * <pre>
         * Location of the user's home base defined by a Geo object
         * (Section 3.2.12). This is not necessarily their current location.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Geo geo = 7;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo.Builder getGeoBuilder() {
          bitField0_ |= 0x00000040;
          onChanged();
          return getGeoFieldBuilder().getBuilder();
        }
        /**
         * <pre>
         * Location of the user's home base defined by a Geo object
         * (Section 3.2.12). This is not necessarily their current location.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Geo geo = 7;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.GeoOrBuilder getGeoOrBuilder() {
          if (geoBuilder_ != null) {
            return geoBuilder_.getMessageOrBuilder();
          } else {
            return geo_ == null ?
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo.getDefaultInstance() : geo_;
          }
        }
        /**
         * <pre>
         * Location of the user's home base defined by a Geo object
         * (Section 3.2.12). This is not necessarily their current location.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Geo geo = 7;</code>
         */
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.GeoOrBuilder> 
            getGeoFieldBuilder() {
          if (geoBuilder_ == null) {
            geoBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Geo.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.GeoOrBuilder>(
                    getGeo(),
                    getParentForChildren(),
                    isClean());
            geo_ = null;
          }
          return geoBuilder_;
        }

        private java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data> data_ =
          java.util.Collections.emptyList();
        private void ensureDataIsMutable() {
          if (!((bitField0_ & 0x00000080) != 0)) {
            data_ = new java.util.ArrayList<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data>(data_);
            bitField0_ |= 0x00000080;
           }
        }

        private com.google.protobuf.RepeatedFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.DataOrBuilder> dataBuilder_;

        /**
         * <pre>
         * Additional user data. Each Data object (Section 3.2.14) represents a
         * different data source.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 8;</code>
         */
        public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data> getDataList() {
          if (dataBuilder_ == null) {
            return java.util.Collections.unmodifiableList(data_);
          } else {
            return dataBuilder_.getMessageList();
          }
        }
        /**
         * <pre>
         * Additional user data. Each Data object (Section 3.2.14) represents a
         * different data source.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 8;</code>
         */
        public int getDataCount() {
          if (dataBuilder_ == null) {
            return data_.size();
          } else {
            return dataBuilder_.getCount();
          }
        }
        /**
         * <pre>
         * Additional user data. Each Data object (Section 3.2.14) represents a
         * different data source.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 8;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data getData(int index) {
          if (dataBuilder_ == null) {
            return data_.get(index);
          } else {
            return dataBuilder_.getMessage(index);
          }
        }
        /**
         * <pre>
         * Additional user data. Each Data object (Section 3.2.14) represents a
         * different data source.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 8;</code>
         */
        public Builder setData(
            int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data value) {
          if (dataBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            ensureDataIsMutable();
            data_.set(index, value);
            onChanged();
          } else {
            dataBuilder_.setMessage(index, value);
          }
          return this;
        }
        /**
         * <pre>
         * Additional user data. Each Data object (Section 3.2.14) represents a
         * different data source.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 8;</code>
         */
        public Builder setData(
            int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Builder builderForValue) {
          if (dataBuilder_ == null) {
            ensureDataIsMutable();
            data_.set(index, builderForValue.build());
            onChanged();
          } else {
            dataBuilder_.setMessage(index, builderForValue.build());
          }
          return this;
        }
        /**
         * <pre>
         * Additional user data. Each Data object (Section 3.2.14) represents a
         * different data source.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 8;</code>
         */
        public Builder addData(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data value) {
          if (dataBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            ensureDataIsMutable();
            data_.add(value);
            onChanged();
          } else {
            dataBuilder_.addMessage(value);
          }
          return this;
        }
        /**
         * <pre>
         * Additional user data. Each Data object (Section 3.2.14) represents a
         * different data source.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 8;</code>
         */
        public Builder addData(
            int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data value) {
          if (dataBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            ensureDataIsMutable();
            data_.add(index, value);
            onChanged();
          } else {
            dataBuilder_.addMessage(index, value);
          }
          return this;
        }
        /**
         * <pre>
         * Additional user data. Each Data object (Section 3.2.14) represents a
         * different data source.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 8;</code>
         */
        public Builder addData(
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Builder builderForValue) {
          if (dataBuilder_ == null) {
            ensureDataIsMutable();
            data_.add(builderForValue.build());
            onChanged();
          } else {
            dataBuilder_.addMessage(builderForValue.build());
          }
          return this;
        }
        /**
         * <pre>
         * Additional user data. Each Data object (Section 3.2.14) represents a
         * different data source.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 8;</code>
         */
        public Builder addData(
            int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Builder builderForValue) {
          if (dataBuilder_ == null) {
            ensureDataIsMutable();
            data_.add(index, builderForValue.build());
            onChanged();
          } else {
            dataBuilder_.addMessage(index, builderForValue.build());
          }
          return this;
        }
        /**
         * <pre>
         * Additional user data. Each Data object (Section 3.2.14) represents a
         * different data source.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 8;</code>
         */
        public Builder addAllData(
            java.lang.Iterable<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data> values) {
          if (dataBuilder_ == null) {
            ensureDataIsMutable();
            com.google.protobuf.AbstractMessageLite.Builder.addAll(
                values, data_);
            onChanged();
          } else {
            dataBuilder_.addAllMessages(values);
          }
          return this;
        }
        /**
         * <pre>
         * Additional user data. Each Data object (Section 3.2.14) represents a
         * different data source.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 8;</code>
         */
        public Builder clearData() {
          if (dataBuilder_ == null) {
            data_ = java.util.Collections.emptyList();
            bitField0_ = (bitField0_ & ~0x00000080);
            onChanged();
          } else {
            dataBuilder_.clear();
          }
          return this;
        }
        /**
         * <pre>
         * Additional user data. Each Data object (Section 3.2.14) represents a
         * different data source.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 8;</code>
         */
        public Builder removeData(int index) {
          if (dataBuilder_ == null) {
            ensureDataIsMutable();
            data_.remove(index);
            onChanged();
          } else {
            dataBuilder_.remove(index);
          }
          return this;
        }
        /**
         * <pre>
         * Additional user data. Each Data object (Section 3.2.14) represents a
         * different data source.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 8;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Builder getDataBuilder(
            int index) {
          return getDataFieldBuilder().getBuilder(index);
        }
        /**
         * <pre>
         * Additional user data. Each Data object (Section 3.2.14) represents a
         * different data source.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 8;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.DataOrBuilder getDataOrBuilder(
            int index) {
          if (dataBuilder_ == null) {
            return data_.get(index);  } else {
            return dataBuilder_.getMessageOrBuilder(index);
          }
        }
        /**
         * <pre>
         * Additional user data. Each Data object (Section 3.2.14) represents a
         * different data source.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 8;</code>
         */
        public java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.DataOrBuilder> 
             getDataOrBuilderList() {
          if (dataBuilder_ != null) {
            return dataBuilder_.getMessageOrBuilderList();
          } else {
            return java.util.Collections.unmodifiableList(data_);
          }
        }
        /**
         * <pre>
         * Additional user data. Each Data object (Section 3.2.14) represents a
         * different data source.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 8;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Builder addDataBuilder() {
          return getDataFieldBuilder().addBuilder(
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.getDefaultInstance());
        }
        /**
         * <pre>
         * Additional user data. Each Data object (Section 3.2.14) represents a
         * different data source.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 8;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Builder addDataBuilder(
            int index) {
          return getDataFieldBuilder().addBuilder(
              index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.getDefaultInstance());
        }
        /**
         * <pre>
         * Additional user data. Each Data object (Section 3.2.14) represents a
         * different data source.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data data = 8;</code>
         */
        public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Builder> 
             getDataBuilderList() {
          return getDataFieldBuilder().getBuilderList();
        }
        private com.google.protobuf.RepeatedFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.DataOrBuilder> 
            getDataFieldBuilder() {
          if (dataBuilder_ == null) {
            dataBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.DataOrBuilder>(
                    data_,
                    ((bitField0_ & 0x00000080) != 0),
                    getParentForChildren(),
                    isClean());
            data_ = null;
          }
          return dataBuilder_;
        }

        private java.lang.Object consent_ = "";
        /**
         * <pre>
         * When GDPR regulations are in effect this attribute contains the
         * Transparency and Consent Framework’s Consent String data structure.
         * </pre>
         *
         * <code>optional string consent = 10;</code>
         * @return Whether the consent field is set.
         */
        public boolean hasConsent() {
          return ((bitField0_ & 0x00000100) != 0);
        }
        /**
         * <pre>
         * When GDPR regulations are in effect this attribute contains the
         * Transparency and Consent Framework’s Consent String data structure.
         * </pre>
         *
         * <code>optional string consent = 10;</code>
         * @return The consent.
         */
        public java.lang.String getConsent() {
          java.lang.Object ref = consent_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              consent_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * When GDPR regulations are in effect this attribute contains the
         * Transparency and Consent Framework’s Consent String data structure.
         * </pre>
         *
         * <code>optional string consent = 10;</code>
         * @return The bytes for consent.
         */
        public com.google.protobuf.ByteString
            getConsentBytes() {
          java.lang.Object ref = consent_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            consent_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * When GDPR regulations are in effect this attribute contains the
         * Transparency and Consent Framework’s Consent String data structure.
         * </pre>
         *
         * <code>optional string consent = 10;</code>
         * @param value The consent to set.
         * @return This builder for chaining.
         */
        public Builder setConsent(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000100;
          consent_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * When GDPR regulations are in effect this attribute contains the
         * Transparency and Consent Framework’s Consent String data structure.
         * </pre>
         *
         * <code>optional string consent = 10;</code>
         * @return This builder for chaining.
         */
        public Builder clearConsent() {
          bitField0_ = (bitField0_ & ~0x00000100);
          consent_ = getDefaultInstance().getConsent();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * When GDPR regulations are in effect this attribute contains the
         * Transparency and Consent Framework’s Consent String data structure.
         * </pre>
         *
         * <code>optional string consent = 10;</code>
         * @param value The bytes for consent to set.
         * @return This builder for chaining.
         */
        public Builder setConsentBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000100;
          consent_ = value;
          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:com.iabtechlab.openrtb.v2.BidRequest.User)
      }

      // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.BidRequest.User)
      private static final com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User DEFAULT_INSTANCE;
      static {
        DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User();
      }

      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User getDefaultInstance() {
        return DEFAULT_INSTANCE;
      }

      @java.lang.Deprecated public static final com.google.protobuf.Parser<User>
          PARSER = new com.google.protobuf.AbstractParser<User>() {
        @java.lang.Override
        public User parsePartialFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return new User(input, extensionRegistry);
        }
      };

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

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

      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User getDefaultInstanceForType() {
        return DEFAULT_INSTANCE;
      }

    }

    public interface DataOrBuilder extends
        // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.BidRequest.Data)
        com.google.protobuf.GeneratedMessageV3.
            ExtendableMessageOrBuilder<Data> {

      /**
       * <pre>
       * Exchange-specific ID for the data provider.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return Whether the id field is set.
       */
      boolean hasId();
      /**
       * <pre>
       * Exchange-specific ID for the data provider.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return The id.
       */
      java.lang.String getId();
      /**
       * <pre>
       * Exchange-specific ID for the data provider.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return The bytes for id.
       */
      com.google.protobuf.ByteString
          getIdBytes();

      /**
       * <pre>
       * Exchange-specific name for the data provider.
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return Whether the name field is set.
       */
      boolean hasName();
      /**
       * <pre>
       * Exchange-specific name for the data provider.
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return The name.
       */
      java.lang.String getName();
      /**
       * <pre>
       * Exchange-specific name for the data provider.
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return The bytes for name.
       */
      com.google.protobuf.ByteString
          getNameBytes();

      /**
       * <pre>
       * Array of Segment (Section 3.2.15) objects that contain the actual
       * data values.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data.Segment segment = 3;</code>
       */
      java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment> 
          getSegmentList();
      /**
       * <pre>
       * Array of Segment (Section 3.2.15) objects that contain the actual
       * data values.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data.Segment segment = 3;</code>
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment getSegment(int index);
      /**
       * <pre>
       * Array of Segment (Section 3.2.15) objects that contain the actual
       * data values.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data.Segment segment = 3;</code>
       */
      int getSegmentCount();
      /**
       * <pre>
       * Array of Segment (Section 3.2.15) objects that contain the actual
       * data values.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data.Segment segment = 3;</code>
       */
      java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.SegmentOrBuilder> 
          getSegmentOrBuilderList();
      /**
       * <pre>
       * Array of Segment (Section 3.2.15) objects that contain the actual
       * data values.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data.Segment segment = 3;</code>
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.SegmentOrBuilder getSegmentOrBuilder(
          int index);
    }
    /**
     * <pre>
     * OpenRTB 2.0: The data and segment objects together allow additional data
     * about the user to be specified. This data may be from multiple sources
     * whether from the exchange itself or third party providers as specified by
     * the id field. A bid request can mix data objects from multiple providers or
     * can have multiple data objects.
     * The specific data providers in use should be published by the exchange
     * a priori to its bidders.
     * This is used to send detected verticals to the buyer.
     * For exchange bidding, this is also used to send key
     * value pairs from the publisher to the buyer.
     * https://support.google.com/admanager/answer/177381
     * </pre>
     *
     * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Data}
     */
    public static final class Data extends
        com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
          Data> implements
        // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.BidRequest.Data)
        DataOrBuilder {
    private static final long serialVersionUID = 0L;
      // Use Data.newBuilder() to construct.
      private Data(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data, ?> builder) {
        super(builder);
      }
      private Data() {
        id_ = "";
        name_ = "";
        segment_ = java.util.Collections.emptyList();
      }

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

      @java.lang.Override
      public final com.google.protobuf.UnknownFieldSet
      getUnknownFields() {
        return this.unknownFields;
      }
      private Data(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        this();
        if (extensionRegistry == null) {
          throw new java.lang.NullPointerException();
        }
        int mutable_bitField0_ = 0;
        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
            com.google.protobuf.UnknownFieldSet.newBuilder();
        try {
          boolean done = false;
          while (!done) {
            int tag = input.readTag();
            switch (tag) {
              case 0:
                done = true;
                break;
              case 10: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000001;
                id_ = bs;
                break;
              }
              case 18: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000002;
                name_ = bs;
                break;
              }
              case 26: {
                if (!((mutable_bitField0_ & 0x00000004) != 0)) {
                  segment_ = new java.util.ArrayList<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment>();
                  mutable_bitField0_ |= 0x00000004;
                }
                segment_.add(
                    input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment.PARSER, extensionRegistry));
                break;
              }
              default: {
                if (!parseUnknownField(
                    input, unknownFields, extensionRegistry, tag)) {
                  done = true;
                }
                break;
              }
            }
          }
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          throw e.setUnfinishedMessage(this);
        } catch (java.io.IOException e) {
          throw new com.google.protobuf.InvalidProtocolBufferException(
              e).setUnfinishedMessage(this);
        } finally {
          if (((mutable_bitField0_ & 0x00000004) != 0)) {
            segment_ = java.util.Collections.unmodifiableList(segment_);
          }
          this.unknownFields = unknownFields.build();
          makeExtensionsImmutable();
        }
      }
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Data_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Data_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Builder.class);
      }

      public interface SegmentOrBuilder extends
          // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.BidRequest.Data.Segment)
          com.google.protobuf.GeneratedMessageV3.
              ExtendableMessageOrBuilder<Segment> {

        /**
         * <pre>
         * ID of the data segment specific to the data provider.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @return Whether the id field is set.
         */
        boolean hasId();
        /**
         * <pre>
         * ID of the data segment specific to the data provider.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @return The id.
         */
        java.lang.String getId();
        /**
         * <pre>
         * ID of the data segment specific to the data provider.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @return The bytes for id.
         */
        com.google.protobuf.ByteString
            getIdBytes();

        /**
         * <pre>
         * Name of the data segment specific to the data provider.
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @return Whether the name field is set.
         */
        boolean hasName();
        /**
         * <pre>
         * Name of the data segment specific to the data provider.
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @return The name.
         */
        java.lang.String getName();
        /**
         * <pre>
         * Name of the data segment specific to the data provider.
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @return The bytes for name.
         */
        com.google.protobuf.ByteString
            getNameBytes();

        /**
         * <pre>
         * String representation of the data segment value.
         * </pre>
         *
         * <code>optional string value = 3;</code>
         * @return Whether the value field is set.
         */
        boolean hasValue();
        /**
         * <pre>
         * String representation of the data segment value.
         * </pre>
         *
         * <code>optional string value = 3;</code>
         * @return The value.
         */
        java.lang.String getValue();
        /**
         * <pre>
         * String representation of the data segment value.
         * </pre>
         *
         * <code>optional string value = 3;</code>
         * @return The bytes for value.
         */
        com.google.protobuf.ByteString
            getValueBytes();
      }
      /**
       * <pre>
       * OpenRTB 2.0: Segment objects are essentially key-value pairs that
       * convey specific units of data about the user. The parent Data object
       * is a collection of such values from a given data provider.
       * The specific segment names and value options must be published by the
       * exchange a priori to its bidders.
       * </pre>
       *
       * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Data.Segment}
       */
      public static final class Segment extends
          com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
            Segment> implements
          // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.BidRequest.Data.Segment)
          SegmentOrBuilder {
      private static final long serialVersionUID = 0L;
        // Use Segment.newBuilder() to construct.
        private Segment(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment, ?> builder) {
          super(builder);
        }
        private Segment() {
          id_ = "";
          name_ = "";
          value_ = "";
        }

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

        @java.lang.Override
        public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
          return this.unknownFields;
        }
        private Segment(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          this();
          if (extensionRegistry == null) {
            throw new java.lang.NullPointerException();
          }
          int mutable_bitField0_ = 0;
          com.google.protobuf.UnknownFieldSet.Builder unknownFields =
              com.google.protobuf.UnknownFieldSet.newBuilder();
          try {
            boolean done = false;
            while (!done) {
              int tag = input.readTag();
              switch (tag) {
                case 0:
                  done = true;
                  break;
                case 10: {
                  com.google.protobuf.ByteString bs = input.readBytes();
                  bitField0_ |= 0x00000001;
                  id_ = bs;
                  break;
                }
                case 18: {
                  com.google.protobuf.ByteString bs = input.readBytes();
                  bitField0_ |= 0x00000002;
                  name_ = bs;
                  break;
                }
                case 26: {
                  com.google.protobuf.ByteString bs = input.readBytes();
                  bitField0_ |= 0x00000004;
                  value_ = bs;
                  break;
                }
                default: {
                  if (!parseUnknownField(
                      input, unknownFields, extensionRegistry, tag)) {
                    done = true;
                  }
                  break;
                }
              }
            }
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            throw e.setUnfinishedMessage(this);
          } catch (java.io.IOException e) {
            throw new com.google.protobuf.InvalidProtocolBufferException(
                e).setUnfinishedMessage(this);
          } finally {
            this.unknownFields = unknownFields.build();
            makeExtensionsImmutable();
          }
        }
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Data_Segment_descriptor;
        }

        @java.lang.Override
        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Data_Segment_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment.Builder.class);
        }

        private int bitField0_;
        public static final int ID_FIELD_NUMBER = 1;
        private volatile java.lang.Object id_;
        /**
         * <pre>
         * ID of the data segment specific to the data provider.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @return Whether the id field is set.
         */
        @java.lang.Override
        public boolean hasId() {
          return ((bitField0_ & 0x00000001) != 0);
        }
        /**
         * <pre>
         * ID of the data segment specific to the data provider.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @return The id.
         */
        @java.lang.Override
        public java.lang.String getId() {
          java.lang.Object ref = id_;
          if (ref instanceof java.lang.String) {
            return (java.lang.String) ref;
          } else {
            com.google.protobuf.ByteString bs = 
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              id_ = s;
            }
            return s;
          }
        }
        /**
         * <pre>
         * ID of the data segment specific to the data provider.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @return The bytes for id.
         */
        @java.lang.Override
        public com.google.protobuf.ByteString
            getIdBytes() {
          java.lang.Object ref = id_;
          if (ref instanceof java.lang.String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            id_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }

        public static final int NAME_FIELD_NUMBER = 2;
        private volatile java.lang.Object name_;
        /**
         * <pre>
         * Name of the data segment specific to the data provider.
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @return Whether the name field is set.
         */
        @java.lang.Override
        public boolean hasName() {
          return ((bitField0_ & 0x00000002) != 0);
        }
        /**
         * <pre>
         * Name of the data segment specific to the data provider.
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @return The name.
         */
        @java.lang.Override
        public java.lang.String getName() {
          java.lang.Object ref = name_;
          if (ref instanceof java.lang.String) {
            return (java.lang.String) ref;
          } else {
            com.google.protobuf.ByteString bs = 
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              name_ = s;
            }
            return s;
          }
        }
        /**
         * <pre>
         * Name of the data segment specific to the data provider.
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @return The bytes for name.
         */
        @java.lang.Override
        public com.google.protobuf.ByteString
            getNameBytes() {
          java.lang.Object ref = name_;
          if (ref instanceof java.lang.String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            name_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }

        public static final int VALUE_FIELD_NUMBER = 3;
        private volatile java.lang.Object value_;
        /**
         * <pre>
         * String representation of the data segment value.
         * </pre>
         *
         * <code>optional string value = 3;</code>
         * @return Whether the value field is set.
         */
        @java.lang.Override
        public boolean hasValue() {
          return ((bitField0_ & 0x00000004) != 0);
        }
        /**
         * <pre>
         * String representation of the data segment value.
         * </pre>
         *
         * <code>optional string value = 3;</code>
         * @return The value.
         */
        @java.lang.Override
        public java.lang.String getValue() {
          java.lang.Object ref = value_;
          if (ref instanceof java.lang.String) {
            return (java.lang.String) ref;
          } else {
            com.google.protobuf.ByteString bs = 
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              value_ = s;
            }
            return s;
          }
        }
        /**
         * <pre>
         * String representation of the data segment value.
         * </pre>
         *
         * <code>optional string value = 3;</code>
         * @return The bytes for value.
         */
        @java.lang.Override
        public com.google.protobuf.ByteString
            getValueBytes() {
          java.lang.Object ref = value_;
          if (ref instanceof java.lang.String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            value_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }

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

          if (!extensionsAreInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
          memoizedIsInitialized = 1;
          return true;
        }

        @java.lang.Override
        public void writeTo(com.google.protobuf.CodedOutputStream output)
                            throws java.io.IOException {
          com.google.protobuf.GeneratedMessageV3
            .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment>.ExtensionWriter
              extensionWriter = newExtensionWriter();
          if (((bitField0_ & 0x00000001) != 0)) {
            com.google.protobuf.GeneratedMessageV3.writeString(output, 1, id_);
          }
          if (((bitField0_ & 0x00000002) != 0)) {
            com.google.protobuf.GeneratedMessageV3.writeString(output, 2, name_);
          }
          if (((bitField0_ & 0x00000004) != 0)) {
            com.google.protobuf.GeneratedMessageV3.writeString(output, 3, value_);
          }
          extensionWriter.writeUntil(10000, output);
          unknownFields.writeTo(output);
        }

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

          size = 0;
          if (((bitField0_ & 0x00000001) != 0)) {
            size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, id_);
          }
          if (((bitField0_ & 0x00000002) != 0)) {
            size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, name_);
          }
          if (((bitField0_ & 0x00000004) != 0)) {
            size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, value_);
          }
          size += extensionsSerializedSize();
          size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment)) {
            return super.equals(obj);
          }
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment other = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment) obj;

          if (hasId() != other.hasId()) return false;
          if (hasId()) {
            if (!getId()
                .equals(other.getId())) return false;
          }
          if (hasName() != other.hasName()) return false;
          if (hasName()) {
            if (!getName()
                .equals(other.getName())) return false;
          }
          if (hasValue() != other.hasValue()) return false;
          if (hasValue()) {
            if (!getValue()
                .equals(other.getValue())) return false;
          }
          if (!unknownFields.equals(other.unknownFields)) return false;
          if (!getExtensionFields().equals(other.getExtensionFields()))
            return false;
          return true;
        }

        @java.lang.Override
        public int hashCode() {
          if (memoizedHashCode != 0) {
            return memoizedHashCode;
          }
          int hash = 41;
          hash = (19 * hash) + getDescriptor().hashCode();
          if (hasId()) {
            hash = (37 * hash) + ID_FIELD_NUMBER;
            hash = (53 * hash) + getId().hashCode();
          }
          if (hasName()) {
            hash = (37 * hash) + NAME_FIELD_NUMBER;
            hash = (53 * hash) + getName().hashCode();
          }
          if (hasValue()) {
            hash = (37 * hash) + VALUE_FIELD_NUMBER;
            hash = (53 * hash) + getValue().hashCode();
          }
          hash = hashFields(hash, getExtensionFields());
          hash = (29 * hash) + unknownFields.hashCode();
          memoizedHashCode = hash;
          return hash;
        }

        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment parseFrom(
            java.nio.ByteBuffer data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment parseFrom(
            java.nio.ByteBuffer data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment parseFrom(
            com.google.protobuf.ByteString data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment parseFrom(
            com.google.protobuf.ByteString data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment parseFrom(byte[] data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment parseFrom(
            byte[] data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment parseFrom(java.io.InputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment parseDelimitedFrom(java.io.InputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseDelimitedWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment parseFrom(
            com.google.protobuf.CodedInputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment 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>
         * OpenRTB 2.0: Segment objects are essentially key-value pairs that
         * convey specific units of data about the user. The parent Data object
         * is a collection of such values from a given data provider.
         * The specific segment names and value options must be published by the
         * exchange a priori to its bidders.
         * </pre>
         *
         * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Data.Segment}
         */
        public static final class Builder extends
            com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment, Builder> implements
            // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.BidRequest.Data.Segment)
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.SegmentOrBuilder {
          public static final com.google.protobuf.Descriptors.Descriptor
              getDescriptor() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Data_Segment_descriptor;
          }

          @java.lang.Override
          protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
              internalGetFieldAccessorTable() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Data_Segment_fieldAccessorTable
                .ensureFieldAccessorsInitialized(
                    com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment.Builder.class);
          }

          // Construct using com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment.newBuilder()
          private Builder() {
            maybeForceBuilderInitialization();
          }

          private Builder(
              com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
            super(parent);
            maybeForceBuilderInitialization();
          }
          private void maybeForceBuilderInitialization() {
            if (com.google.protobuf.GeneratedMessageV3
                    .alwaysUseFieldBuilders) {
            }
          }
          @java.lang.Override
          public Builder clear() {
            super.clear();
            id_ = "";
            bitField0_ = (bitField0_ & ~0x00000001);
            name_ = "";
            bitField0_ = (bitField0_ & ~0x00000002);
            value_ = "";
            bitField0_ = (bitField0_ & ~0x00000004);
            return this;
          }

          @java.lang.Override
          public com.google.protobuf.Descriptors.Descriptor
              getDescriptorForType() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Data_Segment_descriptor;
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment getDefaultInstanceForType() {
            return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment.getDefaultInstance();
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment build() {
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment result = buildPartial();
            if (!result.isInitialized()) {
              throw newUninitializedMessageException(result);
            }
            return result;
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment buildPartial() {
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment result = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment(this);
            int from_bitField0_ = bitField0_;
            int to_bitField0_ = 0;
            if (((from_bitField0_ & 0x00000001) != 0)) {
              to_bitField0_ |= 0x00000001;
            }
            result.id_ = id_;
            if (((from_bitField0_ & 0x00000002) != 0)) {
              to_bitField0_ |= 0x00000002;
            }
            result.name_ = name_;
            if (((from_bitField0_ & 0x00000004) != 0)) {
              to_bitField0_ |= 0x00000004;
            }
            result.value_ = value_;
            result.bitField0_ = to_bitField0_;
            onBuilt();
            return result;
          }

          @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 <Type> Builder setExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment, Type> extension,
              Type value) {
            return super.setExtension(extension, value);
          }
          @java.lang.Override
          public <Type> Builder setExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment, java.util.List<Type>> extension,
              int index, Type value) {
            return super.setExtension(extension, index, value);
          }
          @java.lang.Override
          public <Type> Builder addExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment, java.util.List<Type>> extension,
              Type value) {
            return super.addExtension(extension, value);
          }
          @java.lang.Override
          public <Type> Builder clearExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment, ?> extension) {
            return super.clearExtension(extension);
          }
          @java.lang.Override
          public Builder mergeFrom(com.google.protobuf.Message other) {
            if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment) {
              return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment)other);
            } else {
              super.mergeFrom(other);
              return this;
            }
          }

          public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment other) {
            if (other == com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment.getDefaultInstance()) return this;
            if (other.hasId()) {
              bitField0_ |= 0x00000001;
              id_ = other.id_;
              onChanged();
            }
            if (other.hasName()) {
              bitField0_ |= 0x00000002;
              name_ = other.name_;
              onChanged();
            }
            if (other.hasValue()) {
              bitField0_ |= 0x00000004;
              value_ = other.value_;
              onChanged();
            }
            this.mergeExtensionFields(other);
            this.mergeUnknownFields(other.unknownFields);
            onChanged();
            return this;
          }

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

          @java.lang.Override
          public Builder mergeFrom(
              com.google.protobuf.CodedInputStream input,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment parsedMessage = null;
            try {
              parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
              parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment) e.getUnfinishedMessage();
              throw e.unwrapIOException();
            } finally {
              if (parsedMessage != null) {
                mergeFrom(parsedMessage);
              }
            }
            return this;
          }
          private int bitField0_;

          private java.lang.Object id_ = "";
          /**
           * <pre>
           * ID of the data segment specific to the data provider.
           * </pre>
           *
           * <code>optional string id = 1;</code>
           * @return Whether the id field is set.
           */
          public boolean hasId() {
            return ((bitField0_ & 0x00000001) != 0);
          }
          /**
           * <pre>
           * ID of the data segment specific to the data provider.
           * </pre>
           *
           * <code>optional string id = 1;</code>
           * @return The id.
           */
          public java.lang.String getId() {
            java.lang.Object ref = id_;
            if (!(ref instanceof java.lang.String)) {
              com.google.protobuf.ByteString bs =
                  (com.google.protobuf.ByteString) ref;
              java.lang.String s = bs.toStringUtf8();
              if (bs.isValidUtf8()) {
                id_ = s;
              }
              return s;
            } else {
              return (java.lang.String) ref;
            }
          }
          /**
           * <pre>
           * ID of the data segment specific to the data provider.
           * </pre>
           *
           * <code>optional string id = 1;</code>
           * @return The bytes for id.
           */
          public com.google.protobuf.ByteString
              getIdBytes() {
            java.lang.Object ref = id_;
            if (ref instanceof String) {
              com.google.protobuf.ByteString b = 
                  com.google.protobuf.ByteString.copyFromUtf8(
                      (java.lang.String) ref);
              id_ = b;
              return b;
            } else {
              return (com.google.protobuf.ByteString) ref;
            }
          }
          /**
           * <pre>
           * ID of the data segment specific to the data provider.
           * </pre>
           *
           * <code>optional string id = 1;</code>
           * @param value The id to set.
           * @return This builder for chaining.
           */
          public Builder setId(
              java.lang.String value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
            id_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * ID of the data segment specific to the data provider.
           * </pre>
           *
           * <code>optional string id = 1;</code>
           * @return This builder for chaining.
           */
          public Builder clearId() {
            bitField0_ = (bitField0_ & ~0x00000001);
            id_ = getDefaultInstance().getId();
            onChanged();
            return this;
          }
          /**
           * <pre>
           * ID of the data segment specific to the data provider.
           * </pre>
           *
           * <code>optional string id = 1;</code>
           * @param value The bytes for id to set.
           * @return This builder for chaining.
           */
          public Builder setIdBytes(
              com.google.protobuf.ByteString value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
            id_ = value;
            onChanged();
            return this;
          }

          private java.lang.Object name_ = "";
          /**
           * <pre>
           * Name of the data segment specific to the data provider.
           * </pre>
           *
           * <code>optional string name = 2;</code>
           * @return Whether the name field is set.
           */
          public boolean hasName() {
            return ((bitField0_ & 0x00000002) != 0);
          }
          /**
           * <pre>
           * Name of the data segment specific to the data provider.
           * </pre>
           *
           * <code>optional string name = 2;</code>
           * @return The name.
           */
          public java.lang.String getName() {
            java.lang.Object ref = name_;
            if (!(ref instanceof java.lang.String)) {
              com.google.protobuf.ByteString bs =
                  (com.google.protobuf.ByteString) ref;
              java.lang.String s = bs.toStringUtf8();
              if (bs.isValidUtf8()) {
                name_ = s;
              }
              return s;
            } else {
              return (java.lang.String) ref;
            }
          }
          /**
           * <pre>
           * Name of the data segment specific to the data provider.
           * </pre>
           *
           * <code>optional string name = 2;</code>
           * @return The bytes for name.
           */
          public com.google.protobuf.ByteString
              getNameBytes() {
            java.lang.Object ref = name_;
            if (ref instanceof String) {
              com.google.protobuf.ByteString b = 
                  com.google.protobuf.ByteString.copyFromUtf8(
                      (java.lang.String) ref);
              name_ = b;
              return b;
            } else {
              return (com.google.protobuf.ByteString) ref;
            }
          }
          /**
           * <pre>
           * Name of the data segment specific to the data provider.
           * </pre>
           *
           * <code>optional string name = 2;</code>
           * @param value The name to set.
           * @return This builder for chaining.
           */
          public Builder setName(
              java.lang.String value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
            name_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Name of the data segment specific to the data provider.
           * </pre>
           *
           * <code>optional string name = 2;</code>
           * @return This builder for chaining.
           */
          public Builder clearName() {
            bitField0_ = (bitField0_ & ~0x00000002);
            name_ = getDefaultInstance().getName();
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Name of the data segment specific to the data provider.
           * </pre>
           *
           * <code>optional string name = 2;</code>
           * @param value The bytes for name to set.
           * @return This builder for chaining.
           */
          public Builder setNameBytes(
              com.google.protobuf.ByteString value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
            name_ = value;
            onChanged();
            return this;
          }

          private java.lang.Object value_ = "";
          /**
           * <pre>
           * String representation of the data segment value.
           * </pre>
           *
           * <code>optional string value = 3;</code>
           * @return Whether the value field is set.
           */
          public boolean hasValue() {
            return ((bitField0_ & 0x00000004) != 0);
          }
          /**
           * <pre>
           * String representation of the data segment value.
           * </pre>
           *
           * <code>optional string value = 3;</code>
           * @return The value.
           */
          public java.lang.String getValue() {
            java.lang.Object ref = value_;
            if (!(ref instanceof java.lang.String)) {
              com.google.protobuf.ByteString bs =
                  (com.google.protobuf.ByteString) ref;
              java.lang.String s = bs.toStringUtf8();
              if (bs.isValidUtf8()) {
                value_ = s;
              }
              return s;
            } else {
              return (java.lang.String) ref;
            }
          }
          /**
           * <pre>
           * String representation of the data segment value.
           * </pre>
           *
           * <code>optional string value = 3;</code>
           * @return The bytes for value.
           */
          public com.google.protobuf.ByteString
              getValueBytes() {
            java.lang.Object ref = value_;
            if (ref instanceof String) {
              com.google.protobuf.ByteString b = 
                  com.google.protobuf.ByteString.copyFromUtf8(
                      (java.lang.String) ref);
              value_ = b;
              return b;
            } else {
              return (com.google.protobuf.ByteString) ref;
            }
          }
          /**
           * <pre>
           * String representation of the data segment value.
           * </pre>
           *
           * <code>optional string value = 3;</code>
           * @param value The value to set.
           * @return This builder for chaining.
           */
          public Builder setValue(
              java.lang.String value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
            value_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * String representation of the data segment value.
           * </pre>
           *
           * <code>optional string value = 3;</code>
           * @return This builder for chaining.
           */
          public Builder clearValue() {
            bitField0_ = (bitField0_ & ~0x00000004);
            value_ = getDefaultInstance().getValue();
            onChanged();
            return this;
          }
          /**
           * <pre>
           * String representation of the data segment value.
           * </pre>
           *
           * <code>optional string value = 3;</code>
           * @param value The bytes for value to set.
           * @return This builder for chaining.
           */
          public Builder setValueBytes(
              com.google.protobuf.ByteString value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
            value_ = value;
            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:com.iabtechlab.openrtb.v2.BidRequest.Data.Segment)
        }

        // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.BidRequest.Data.Segment)
        private static final com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment DEFAULT_INSTANCE;
        static {
          DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment();
        }

        public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment getDefaultInstance() {
          return DEFAULT_INSTANCE;
        }

        @java.lang.Deprecated public static final com.google.protobuf.Parser<Segment>
            PARSER = new com.google.protobuf.AbstractParser<Segment>() {
          @java.lang.Override
          public Segment parsePartialFrom(
              com.google.protobuf.CodedInputStream input,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.protobuf.InvalidProtocolBufferException {
            return new Segment(input, extensionRegistry);
          }
        };

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

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

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment getDefaultInstanceForType() {
          return DEFAULT_INSTANCE;
        }

      }

      private int bitField0_;
      public static final int ID_FIELD_NUMBER = 1;
      private volatile java.lang.Object id_;
      /**
       * <pre>
       * Exchange-specific ID for the data provider.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return Whether the id field is set.
       */
      @java.lang.Override
      public boolean hasId() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <pre>
       * Exchange-specific ID for the data provider.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return The id.
       */
      @java.lang.Override
      public java.lang.String getId() {
        java.lang.Object ref = id_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            id_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Exchange-specific ID for the data provider.
       * </pre>
       *
       * <code>optional string id = 1;</code>
       * @return The bytes for id.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getIdBytes() {
        java.lang.Object ref = id_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          id_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int NAME_FIELD_NUMBER = 2;
      private volatile java.lang.Object name_;
      /**
       * <pre>
       * Exchange-specific name for the data provider.
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return Whether the name field is set.
       */
      @java.lang.Override
      public boolean hasName() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <pre>
       * Exchange-specific name for the data provider.
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return The name.
       */
      @java.lang.Override
      public java.lang.String getName() {
        java.lang.Object ref = name_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            name_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Exchange-specific name for the data provider.
       * </pre>
       *
       * <code>optional string name = 2;</code>
       * @return The bytes for name.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getNameBytes() {
        java.lang.Object ref = name_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          name_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int SEGMENT_FIELD_NUMBER = 3;
      private java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment> segment_;
      /**
       * <pre>
       * Array of Segment (Section 3.2.15) objects that contain the actual
       * data values.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data.Segment segment = 3;</code>
       */
      @java.lang.Override
      public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment> getSegmentList() {
        return segment_;
      }
      /**
       * <pre>
       * Array of Segment (Section 3.2.15) objects that contain the actual
       * data values.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data.Segment segment = 3;</code>
       */
      @java.lang.Override
      public java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.SegmentOrBuilder> 
          getSegmentOrBuilderList() {
        return segment_;
      }
      /**
       * <pre>
       * Array of Segment (Section 3.2.15) objects that contain the actual
       * data values.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data.Segment segment = 3;</code>
       */
      @java.lang.Override
      public int getSegmentCount() {
        return segment_.size();
      }
      /**
       * <pre>
       * Array of Segment (Section 3.2.15) objects that contain the actual
       * data values.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data.Segment segment = 3;</code>
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment getSegment(int index) {
        return segment_.get(index);
      }
      /**
       * <pre>
       * Array of Segment (Section 3.2.15) objects that contain the actual
       * data values.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data.Segment segment = 3;</code>
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.SegmentOrBuilder getSegmentOrBuilder(
          int index) {
        return segment_.get(index);
      }

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

        for (int i = 0; i < getSegmentCount(); i++) {
          if (!getSegment(i).isInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
        }
        if (!extensionsAreInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
        memoizedIsInitialized = 1;
        return true;
      }

      @java.lang.Override
      public void writeTo(com.google.protobuf.CodedOutputStream output)
                          throws java.io.IOException {
        com.google.protobuf.GeneratedMessageV3
          .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data>.ExtensionWriter
            extensionWriter = newExtensionWriter();
        if (((bitField0_ & 0x00000001) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 1, id_);
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 2, name_);
        }
        for (int i = 0; i < segment_.size(); i++) {
          output.writeMessage(3, segment_.get(i));
        }
        extensionWriter.writeUntil(10000, output);
        unknownFields.writeTo(output);
      }

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

        size = 0;
        if (((bitField0_ & 0x00000001) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, id_);
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, name_);
        }
        for (int i = 0; i < segment_.size(); i++) {
          size += com.google.protobuf.CodedOutputStream
            .computeMessageSize(3, segment_.get(i));
        }
        size += extensionsSerializedSize();
        size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data)) {
          return super.equals(obj);
        }
        com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data other = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data) obj;

        if (hasId() != other.hasId()) return false;
        if (hasId()) {
          if (!getId()
              .equals(other.getId())) return false;
        }
        if (hasName() != other.hasName()) return false;
        if (hasName()) {
          if (!getName()
              .equals(other.getName())) return false;
        }
        if (!getSegmentList()
            .equals(other.getSegmentList())) return false;
        if (!unknownFields.equals(other.unknownFields)) return false;
        if (!getExtensionFields().equals(other.getExtensionFields()))
          return false;
        return true;
      }

      @java.lang.Override
      public int hashCode() {
        if (memoizedHashCode != 0) {
          return memoizedHashCode;
        }
        int hash = 41;
        hash = (19 * hash) + getDescriptor().hashCode();
        if (hasId()) {
          hash = (37 * hash) + ID_FIELD_NUMBER;
          hash = (53 * hash) + getId().hashCode();
        }
        if (hasName()) {
          hash = (37 * hash) + NAME_FIELD_NUMBER;
          hash = (53 * hash) + getName().hashCode();
        }
        if (getSegmentCount() > 0) {
          hash = (37 * hash) + SEGMENT_FIELD_NUMBER;
          hash = (53 * hash) + getSegmentList().hashCode();
        }
        hash = hashFields(hash, getExtensionFields());
        hash = (29 * hash) + unknownFields.hashCode();
        memoizedHashCode = hash;
        return hash;
      }

      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data parseFrom(
          java.nio.ByteBuffer data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data parseFrom(
          java.nio.ByteBuffer data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data parseFrom(
          com.google.protobuf.ByteString data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data parseFrom(
          com.google.protobuf.ByteString data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data parseFrom(byte[] data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data parseFrom(
          byte[] data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data parseFrom(java.io.InputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data parseDelimitedFrom(java.io.InputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseDelimitedWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data parseFrom(
          com.google.protobuf.CodedInputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data 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>
       * OpenRTB 2.0: The data and segment objects together allow additional data
       * about the user to be specified. This data may be from multiple sources
       * whether from the exchange itself or third party providers as specified by
       * the id field. A bid request can mix data objects from multiple providers or
       * can have multiple data objects.
       * The specific data providers in use should be published by the exchange
       * a priori to its bidders.
       * This is used to send detected verticals to the buyer.
       * For exchange bidding, this is also used to send key
       * value pairs from the publisher to the buyer.
       * https://support.google.com/admanager/answer/177381
       * </pre>
       *
       * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Data}
       */
      public static final class Builder extends
          com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data, Builder> implements
          // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.BidRequest.Data)
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.DataOrBuilder {
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Data_descriptor;
        }

        @java.lang.Override
        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Data_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Builder.class);
        }

        // Construct using com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.newBuilder()
        private Builder() {
          maybeForceBuilderInitialization();
        }

        private Builder(
            com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
          super(parent);
          maybeForceBuilderInitialization();
        }
        private void maybeForceBuilderInitialization() {
          if (com.google.protobuf.GeneratedMessageV3
                  .alwaysUseFieldBuilders) {
            getSegmentFieldBuilder();
          }
        }
        @java.lang.Override
        public Builder clear() {
          super.clear();
          id_ = "";
          bitField0_ = (bitField0_ & ~0x00000001);
          name_ = "";
          bitField0_ = (bitField0_ & ~0x00000002);
          if (segmentBuilder_ == null) {
            segment_ = java.util.Collections.emptyList();
            bitField0_ = (bitField0_ & ~0x00000004);
          } else {
            segmentBuilder_.clear();
          }
          return this;
        }

        @java.lang.Override
        public com.google.protobuf.Descriptors.Descriptor
            getDescriptorForType() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Data_descriptor;
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data getDefaultInstanceForType() {
          return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.getDefaultInstance();
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data build() {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data result = buildPartial();
          if (!result.isInitialized()) {
            throw newUninitializedMessageException(result);
          }
          return result;
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data buildPartial() {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data result = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data(this);
          int from_bitField0_ = bitField0_;
          int to_bitField0_ = 0;
          if (((from_bitField0_ & 0x00000001) != 0)) {
            to_bitField0_ |= 0x00000001;
          }
          result.id_ = id_;
          if (((from_bitField0_ & 0x00000002) != 0)) {
            to_bitField0_ |= 0x00000002;
          }
          result.name_ = name_;
          if (segmentBuilder_ == null) {
            if (((bitField0_ & 0x00000004) != 0)) {
              segment_ = java.util.Collections.unmodifiableList(segment_);
              bitField0_ = (bitField0_ & ~0x00000004);
            }
            result.segment_ = segment_;
          } else {
            result.segment_ = segmentBuilder_.build();
          }
          result.bitField0_ = to_bitField0_;
          onBuilt();
          return result;
        }

        @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 <Type> Builder setExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data, Type> extension,
            Type value) {
          return super.setExtension(extension, value);
        }
        @java.lang.Override
        public <Type> Builder setExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data, java.util.List<Type>> extension,
            int index, Type value) {
          return super.setExtension(extension, index, value);
        }
        @java.lang.Override
        public <Type> Builder addExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data, java.util.List<Type>> extension,
            Type value) {
          return super.addExtension(extension, value);
        }
        @java.lang.Override
        public <Type> Builder clearExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data, ?> extension) {
          return super.clearExtension(extension);
        }
        @java.lang.Override
        public Builder mergeFrom(com.google.protobuf.Message other) {
          if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data) {
            return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data)other);
          } else {
            super.mergeFrom(other);
            return this;
          }
        }

        public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data other) {
          if (other == com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.getDefaultInstance()) return this;
          if (other.hasId()) {
            bitField0_ |= 0x00000001;
            id_ = other.id_;
            onChanged();
          }
          if (other.hasName()) {
            bitField0_ |= 0x00000002;
            name_ = other.name_;
            onChanged();
          }
          if (segmentBuilder_ == null) {
            if (!other.segment_.isEmpty()) {
              if (segment_.isEmpty()) {
                segment_ = other.segment_;
                bitField0_ = (bitField0_ & ~0x00000004);
              } else {
                ensureSegmentIsMutable();
                segment_.addAll(other.segment_);
              }
              onChanged();
            }
          } else {
            if (!other.segment_.isEmpty()) {
              if (segmentBuilder_.isEmpty()) {
                segmentBuilder_.dispose();
                segmentBuilder_ = null;
                segment_ = other.segment_;
                bitField0_ = (bitField0_ & ~0x00000004);
                segmentBuilder_ = 
                  com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
                     getSegmentFieldBuilder() : null;
              } else {
                segmentBuilder_.addAllMessages(other.segment_);
              }
            }
          }
          this.mergeExtensionFields(other);
          this.mergeUnknownFields(other.unknownFields);
          onChanged();
          return this;
        }

        @java.lang.Override
        public final boolean isInitialized() {
          for (int i = 0; i < getSegmentCount(); i++) {
            if (!getSegment(i).isInitialized()) {
              return false;
            }
          }
          if (!extensionsAreInitialized()) {
            return false;
          }
          return true;
        }

        @java.lang.Override
        public Builder mergeFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws java.io.IOException {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data parsedMessage = null;
          try {
            parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data) e.getUnfinishedMessage();
            throw e.unwrapIOException();
          } finally {
            if (parsedMessage != null) {
              mergeFrom(parsedMessage);
            }
          }
          return this;
        }
        private int bitField0_;

        private java.lang.Object id_ = "";
        /**
         * <pre>
         * Exchange-specific ID for the data provider.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @return Whether the id field is set.
         */
        public boolean hasId() {
          return ((bitField0_ & 0x00000001) != 0);
        }
        /**
         * <pre>
         * Exchange-specific ID for the data provider.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @return The id.
         */
        public java.lang.String getId() {
          java.lang.Object ref = id_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              id_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Exchange-specific ID for the data provider.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @return The bytes for id.
         */
        public com.google.protobuf.ByteString
            getIdBytes() {
          java.lang.Object ref = id_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            id_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Exchange-specific ID for the data provider.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @param value The id to set.
         * @return This builder for chaining.
         */
        public Builder setId(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
          id_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Exchange-specific ID for the data provider.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @return This builder for chaining.
         */
        public Builder clearId() {
          bitField0_ = (bitField0_ & ~0x00000001);
          id_ = getDefaultInstance().getId();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Exchange-specific ID for the data provider.
         * </pre>
         *
         * <code>optional string id = 1;</code>
         * @param value The bytes for id to set.
         * @return This builder for chaining.
         */
        public Builder setIdBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
          id_ = value;
          onChanged();
          return this;
        }

        private java.lang.Object name_ = "";
        /**
         * <pre>
         * Exchange-specific name for the data provider.
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @return Whether the name field is set.
         */
        public boolean hasName() {
          return ((bitField0_ & 0x00000002) != 0);
        }
        /**
         * <pre>
         * Exchange-specific name for the data provider.
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @return The name.
         */
        public java.lang.String getName() {
          java.lang.Object ref = name_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              name_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Exchange-specific name for the data provider.
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @return The bytes for name.
         */
        public com.google.protobuf.ByteString
            getNameBytes() {
          java.lang.Object ref = name_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            name_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Exchange-specific name for the data provider.
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @param value The name to set.
         * @return This builder for chaining.
         */
        public Builder setName(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
          name_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Exchange-specific name for the data provider.
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @return This builder for chaining.
         */
        public Builder clearName() {
          bitField0_ = (bitField0_ & ~0x00000002);
          name_ = getDefaultInstance().getName();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Exchange-specific name for the data provider.
         * </pre>
         *
         * <code>optional string name = 2;</code>
         * @param value The bytes for name to set.
         * @return This builder for chaining.
         */
        public Builder setNameBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
          name_ = value;
          onChanged();
          return this;
        }

        private java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment> segment_ =
          java.util.Collections.emptyList();
        private void ensureSegmentIsMutable() {
          if (!((bitField0_ & 0x00000004) != 0)) {
            segment_ = new java.util.ArrayList<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment>(segment_);
            bitField0_ |= 0x00000004;
           }
        }

        private com.google.protobuf.RepeatedFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.SegmentOrBuilder> segmentBuilder_;

        /**
         * <pre>
         * Array of Segment (Section 3.2.15) objects that contain the actual
         * data values.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data.Segment segment = 3;</code>
         */
        public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment> getSegmentList() {
          if (segmentBuilder_ == null) {
            return java.util.Collections.unmodifiableList(segment_);
          } else {
            return segmentBuilder_.getMessageList();
          }
        }
        /**
         * <pre>
         * Array of Segment (Section 3.2.15) objects that contain the actual
         * data values.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data.Segment segment = 3;</code>
         */
        public int getSegmentCount() {
          if (segmentBuilder_ == null) {
            return segment_.size();
          } else {
            return segmentBuilder_.getCount();
          }
        }
        /**
         * <pre>
         * Array of Segment (Section 3.2.15) objects that contain the actual
         * data values.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data.Segment segment = 3;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment getSegment(int index) {
          if (segmentBuilder_ == null) {
            return segment_.get(index);
          } else {
            return segmentBuilder_.getMessage(index);
          }
        }
        /**
         * <pre>
         * Array of Segment (Section 3.2.15) objects that contain the actual
         * data values.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data.Segment segment = 3;</code>
         */
        public Builder setSegment(
            int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment value) {
          if (segmentBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            ensureSegmentIsMutable();
            segment_.set(index, value);
            onChanged();
          } else {
            segmentBuilder_.setMessage(index, value);
          }
          return this;
        }
        /**
         * <pre>
         * Array of Segment (Section 3.2.15) objects that contain the actual
         * data values.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data.Segment segment = 3;</code>
         */
        public Builder setSegment(
            int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment.Builder builderForValue) {
          if (segmentBuilder_ == null) {
            ensureSegmentIsMutable();
            segment_.set(index, builderForValue.build());
            onChanged();
          } else {
            segmentBuilder_.setMessage(index, builderForValue.build());
          }
          return this;
        }
        /**
         * <pre>
         * Array of Segment (Section 3.2.15) objects that contain the actual
         * data values.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data.Segment segment = 3;</code>
         */
        public Builder addSegment(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment value) {
          if (segmentBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            ensureSegmentIsMutable();
            segment_.add(value);
            onChanged();
          } else {
            segmentBuilder_.addMessage(value);
          }
          return this;
        }
        /**
         * <pre>
         * Array of Segment (Section 3.2.15) objects that contain the actual
         * data values.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data.Segment segment = 3;</code>
         */
        public Builder addSegment(
            int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment value) {
          if (segmentBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            ensureSegmentIsMutable();
            segment_.add(index, value);
            onChanged();
          } else {
            segmentBuilder_.addMessage(index, value);
          }
          return this;
        }
        /**
         * <pre>
         * Array of Segment (Section 3.2.15) objects that contain the actual
         * data values.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data.Segment segment = 3;</code>
         */
        public Builder addSegment(
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment.Builder builderForValue) {
          if (segmentBuilder_ == null) {
            ensureSegmentIsMutable();
            segment_.add(builderForValue.build());
            onChanged();
          } else {
            segmentBuilder_.addMessage(builderForValue.build());
          }
          return this;
        }
        /**
         * <pre>
         * Array of Segment (Section 3.2.15) objects that contain the actual
         * data values.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data.Segment segment = 3;</code>
         */
        public Builder addSegment(
            int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment.Builder builderForValue) {
          if (segmentBuilder_ == null) {
            ensureSegmentIsMutable();
            segment_.add(index, builderForValue.build());
            onChanged();
          } else {
            segmentBuilder_.addMessage(index, builderForValue.build());
          }
          return this;
        }
        /**
         * <pre>
         * Array of Segment (Section 3.2.15) objects that contain the actual
         * data values.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data.Segment segment = 3;</code>
         */
        public Builder addAllSegment(
            java.lang.Iterable<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment> values) {
          if (segmentBuilder_ == null) {
            ensureSegmentIsMutable();
            com.google.protobuf.AbstractMessageLite.Builder.addAll(
                values, segment_);
            onChanged();
          } else {
            segmentBuilder_.addAllMessages(values);
          }
          return this;
        }
        /**
         * <pre>
         * Array of Segment (Section 3.2.15) objects that contain the actual
         * data values.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data.Segment segment = 3;</code>
         */
        public Builder clearSegment() {
          if (segmentBuilder_ == null) {
            segment_ = java.util.Collections.emptyList();
            bitField0_ = (bitField0_ & ~0x00000004);
            onChanged();
          } else {
            segmentBuilder_.clear();
          }
          return this;
        }
        /**
         * <pre>
         * Array of Segment (Section 3.2.15) objects that contain the actual
         * data values.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data.Segment segment = 3;</code>
         */
        public Builder removeSegment(int index) {
          if (segmentBuilder_ == null) {
            ensureSegmentIsMutable();
            segment_.remove(index);
            onChanged();
          } else {
            segmentBuilder_.remove(index);
          }
          return this;
        }
        /**
         * <pre>
         * Array of Segment (Section 3.2.15) objects that contain the actual
         * data values.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data.Segment segment = 3;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment.Builder getSegmentBuilder(
            int index) {
          return getSegmentFieldBuilder().getBuilder(index);
        }
        /**
         * <pre>
         * Array of Segment (Section 3.2.15) objects that contain the actual
         * data values.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data.Segment segment = 3;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.SegmentOrBuilder getSegmentOrBuilder(
            int index) {
          if (segmentBuilder_ == null) {
            return segment_.get(index);  } else {
            return segmentBuilder_.getMessageOrBuilder(index);
          }
        }
        /**
         * <pre>
         * Array of Segment (Section 3.2.15) objects that contain the actual
         * data values.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data.Segment segment = 3;</code>
         */
        public java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.SegmentOrBuilder> 
             getSegmentOrBuilderList() {
          if (segmentBuilder_ != null) {
            return segmentBuilder_.getMessageOrBuilderList();
          } else {
            return java.util.Collections.unmodifiableList(segment_);
          }
        }
        /**
         * <pre>
         * Array of Segment (Section 3.2.15) objects that contain the actual
         * data values.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data.Segment segment = 3;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment.Builder addSegmentBuilder() {
          return getSegmentFieldBuilder().addBuilder(
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment.getDefaultInstance());
        }
        /**
         * <pre>
         * Array of Segment (Section 3.2.15) objects that contain the actual
         * data values.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data.Segment segment = 3;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment.Builder addSegmentBuilder(
            int index) {
          return getSegmentFieldBuilder().addBuilder(
              index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment.getDefaultInstance());
        }
        /**
         * <pre>
         * Array of Segment (Section 3.2.15) objects that contain the actual
         * data values.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Data.Segment segment = 3;</code>
         */
        public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment.Builder> 
             getSegmentBuilderList() {
          return getSegmentFieldBuilder().getBuilderList();
        }
        private com.google.protobuf.RepeatedFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.SegmentOrBuilder> 
            getSegmentFieldBuilder() {
          if (segmentBuilder_ == null) {
            segmentBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.Segment.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data.SegmentOrBuilder>(
                    segment_,
                    ((bitField0_ & 0x00000004) != 0),
                    getParentForChildren(),
                    isClean());
            segment_ = null;
          }
          return segmentBuilder_;
        }
        @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:com.iabtechlab.openrtb.v2.BidRequest.Data)
      }

      // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.BidRequest.Data)
      private static final com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data DEFAULT_INSTANCE;
      static {
        DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data();
      }

      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data getDefaultInstance() {
        return DEFAULT_INSTANCE;
      }

      @java.lang.Deprecated public static final com.google.protobuf.Parser<Data>
          PARSER = new com.google.protobuf.AbstractParser<Data>() {
        @java.lang.Override
        public Data parsePartialFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return new Data(input, extensionRegistry);
        }
      };

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

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

      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Data getDefaultInstanceForType() {
        return DEFAULT_INSTANCE;
      }

    }

    public interface RegsOrBuilder extends
        // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.BidRequest.Regs)
        com.google.protobuf.GeneratedMessageV3.
            ExtendableMessageOrBuilder<Regs> {

      /**
       * <pre>
       * Flag indicating if this request is subject to the COPPA regulations
       * established by the USA FTC, where 0 = no, 1 = yes.
       * </pre>
       *
       * <code>optional bool coppa = 1;</code>
       * @return Whether the coppa field is set.
       */
      boolean hasCoppa();
      /**
       * <pre>
       * Flag indicating if this request is subject to the COPPA regulations
       * established by the USA FTC, where 0 = no, 1 = yes.
       * </pre>
       *
       * <code>optional bool coppa = 1;</code>
       * @return The coppa.
       */
      boolean getCoppa();

      /**
       * <pre>
       * Global Privacy Platform string containing encoded consumer privacy choices.
       * </pre>
       *
       * <code>optional string gpp = 2;</code>
       * @return Whether the gpp field is set.
       */
      boolean hasGpp();
      /**
       * <pre>
       * Global Privacy Platform string containing encoded consumer privacy choices.
       * </pre>
       *
       * <code>optional string gpp = 2;</code>
       * @return The gpp.
       */
      java.lang.String getGpp();
      /**
       * <pre>
       * Global Privacy Platform string containing encoded consumer privacy choices.
       * </pre>
       *
       * <code>optional string gpp = 2;</code>
       * @return The bytes for gpp.
       */
      com.google.protobuf.ByteString
          getGppBytes();

      /**
       * <pre>
       * Array of GPP string section ID(s) in force for the current transaction.
       * In most cases, this field should have a single section ID. In rare
       * occasions where such a single section ID can not be determined, the
       * field may contain up to 2 values, separated by a comma.
       * </pre>
       *
       * <code>repeated int32 gpp_sid = 3 [packed = true];</code>
       * @return A list containing the gppSid.
       */
      java.util.List<java.lang.Integer> getGppSidList();
      /**
       * <pre>
       * Array of GPP string section ID(s) in force for the current transaction.
       * In most cases, this field should have a single section ID. In rare
       * occasions where such a single section ID can not be determined, the
       * field may contain up to 2 values, separated by a comma.
       * </pre>
       *
       * <code>repeated int32 gpp_sid = 3 [packed = true];</code>
       * @return The count of gppSid.
       */
      int getGppSidCount();
      /**
       * <pre>
       * Array of GPP string section ID(s) in force for the current transaction.
       * In most cases, this field should have a single section ID. In rare
       * occasions where such a single section ID can not be determined, the
       * field may contain up to 2 values, separated by a comma.
       * </pre>
       *
       * <code>repeated int32 gpp_sid = 3 [packed = true];</code>
       * @param index The index of the element to return.
       * @return The gppSid at the given index.
       */
      int getGppSid(int index);

      /**
       * <pre>
       * Flag that indicates whether or not the request is subject to GDPR regulations.
       * </pre>
       *
       * <code>optional bool gdpr = 4;</code>
       * @return Whether the gdpr field is set.
       */
      boolean hasGdpr();
      /**
       * <pre>
       * Flag that indicates whether or not the request is subject to GDPR regulations.
       * </pre>
       *
       * <code>optional bool gdpr = 4;</code>
       * @return The gdpr.
       */
      boolean getGdpr();

      /**
       * <pre>
       * Communicates signals regarding consumer privacy under US privacy regulation.
       * </pre>
       *
       * <code>optional string us_privacy = 5;</code>
       * @return Whether the usPrivacy field is set.
       */
      boolean hasUsPrivacy();
      /**
       * <pre>
       * Communicates signals regarding consumer privacy under US privacy regulation.
       * </pre>
       *
       * <code>optional string us_privacy = 5;</code>
       * @return The usPrivacy.
       */
      java.lang.String getUsPrivacy();
      /**
       * <pre>
       * Communicates signals regarding consumer privacy under US privacy regulation.
       * </pre>
       *
       * <code>optional string us_privacy = 5;</code>
       * @return The bytes for usPrivacy.
       */
      com.google.protobuf.ByteString
          getUsPrivacyBytes();
    }
    /**
     * <pre>
     * OpenRTB 2.2: This object contains any legal, governmental, or industry
     * regulations that apply to the request. The coppa flag signals whether
     * or not the request falls under the United States Federal Trade Commission's
     * regulations for the United States Children's Online Privacy Protection Act
     * ("COPPA"). Refer to Section 7.1 for more information.
     * </pre>
     *
     * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Regs}
     */
    public static final class Regs extends
        com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
          Regs> implements
        // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.BidRequest.Regs)
        RegsOrBuilder {
    private static final long serialVersionUID = 0L;
      // Use Regs.newBuilder() to construct.
      private Regs(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs, ?> builder) {
        super(builder);
      }
      private Regs() {
        gpp_ = "";
        gppSid_ = emptyIntList();
        usPrivacy_ = "";
      }

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

      @java.lang.Override
      public final com.google.protobuf.UnknownFieldSet
      getUnknownFields() {
        return this.unknownFields;
      }
      private Regs(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        this();
        if (extensionRegistry == null) {
          throw new java.lang.NullPointerException();
        }
        int mutable_bitField0_ = 0;
        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
            com.google.protobuf.UnknownFieldSet.newBuilder();
        try {
          boolean done = false;
          while (!done) {
            int tag = input.readTag();
            switch (tag) {
              case 0:
                done = true;
                break;
              case 8: {
                bitField0_ |= 0x00000001;
                coppa_ = input.readBool();
                break;
              }
              case 18: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000002;
                gpp_ = bs;
                break;
              }
              case 24: {
                if (!((mutable_bitField0_ & 0x00000004) != 0)) {
                  gppSid_ = newIntList();
                  mutable_bitField0_ |= 0x00000004;
                }
                gppSid_.addInt(input.readInt32());
                break;
              }
              case 26: {
                int length = input.readRawVarint32();
                int limit = input.pushLimit(length);
                if (!((mutable_bitField0_ & 0x00000004) != 0) && input.getBytesUntilLimit() > 0) {
                  gppSid_ = newIntList();
                  mutable_bitField0_ |= 0x00000004;
                }
                while (input.getBytesUntilLimit() > 0) {
                  gppSid_.addInt(input.readInt32());
                }
                input.popLimit(limit);
                break;
              }
              case 32: {
                bitField0_ |= 0x00000004;
                gdpr_ = input.readBool();
                break;
              }
              case 42: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000008;
                usPrivacy_ = bs;
                break;
              }
              default: {
                if (!parseUnknownField(
                    input, unknownFields, extensionRegistry, tag)) {
                  done = true;
                }
                break;
              }
            }
          }
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          throw e.setUnfinishedMessage(this);
        } catch (java.io.IOException e) {
          throw new com.google.protobuf.InvalidProtocolBufferException(
              e).setUnfinishedMessage(this);
        } finally {
          if (((mutable_bitField0_ & 0x00000004) != 0)) {
            gppSid_.makeImmutable(); // C
          }
          this.unknownFields = unknownFields.build();
          makeExtensionsImmutable();
        }
      }
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Regs_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Regs_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs.Builder.class);
      }

      private int bitField0_;
      public static final int COPPA_FIELD_NUMBER = 1;
      private boolean coppa_;
      /**
       * <pre>
       * Flag indicating if this request is subject to the COPPA regulations
       * established by the USA FTC, where 0 = no, 1 = yes.
       * </pre>
       *
       * <code>optional bool coppa = 1;</code>
       * @return Whether the coppa field is set.
       */
      @java.lang.Override
      public boolean hasCoppa() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <pre>
       * Flag indicating if this request is subject to the COPPA regulations
       * established by the USA FTC, where 0 = no, 1 = yes.
       * </pre>
       *
       * <code>optional bool coppa = 1;</code>
       * @return The coppa.
       */
      @java.lang.Override
      public boolean getCoppa() {
        return coppa_;
      }

      public static final int GPP_FIELD_NUMBER = 2;
      private volatile java.lang.Object gpp_;
      /**
       * <pre>
       * Global Privacy Platform string containing encoded consumer privacy choices.
       * </pre>
       *
       * <code>optional string gpp = 2;</code>
       * @return Whether the gpp field is set.
       */
      @java.lang.Override
      public boolean hasGpp() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <pre>
       * Global Privacy Platform string containing encoded consumer privacy choices.
       * </pre>
       *
       * <code>optional string gpp = 2;</code>
       * @return The gpp.
       */
      @java.lang.Override
      public java.lang.String getGpp() {
        java.lang.Object ref = gpp_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            gpp_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Global Privacy Platform string containing encoded consumer privacy choices.
       * </pre>
       *
       * <code>optional string gpp = 2;</code>
       * @return The bytes for gpp.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getGppBytes() {
        java.lang.Object ref = gpp_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          gpp_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int GPP_SID_FIELD_NUMBER = 3;
      private com.google.protobuf.Internal.IntList gppSid_;
      /**
       * <pre>
       * Array of GPP string section ID(s) in force for the current transaction.
       * In most cases, this field should have a single section ID. In rare
       * occasions where such a single section ID can not be determined, the
       * field may contain up to 2 values, separated by a comma.
       * </pre>
       *
       * <code>repeated int32 gpp_sid = 3 [packed = true];</code>
       * @return A list containing the gppSid.
       */
      @java.lang.Override
      public java.util.List<java.lang.Integer>
          getGppSidList() {
        return gppSid_;
      }
      /**
       * <pre>
       * Array of GPP string section ID(s) in force for the current transaction.
       * In most cases, this field should have a single section ID. In rare
       * occasions where such a single section ID can not be determined, the
       * field may contain up to 2 values, separated by a comma.
       * </pre>
       *
       * <code>repeated int32 gpp_sid = 3 [packed = true];</code>
       * @return The count of gppSid.
       */
      public int getGppSidCount() {
        return gppSid_.size();
      }
      /**
       * <pre>
       * Array of GPP string section ID(s) in force for the current transaction.
       * In most cases, this field should have a single section ID. In rare
       * occasions where such a single section ID can not be determined, the
       * field may contain up to 2 values, separated by a comma.
       * </pre>
       *
       * <code>repeated int32 gpp_sid = 3 [packed = true];</code>
       * @param index The index of the element to return.
       * @return The gppSid at the given index.
       */
      public int getGppSid(int index) {
        return gppSid_.getInt(index);
      }
      private int gppSidMemoizedSerializedSize = -1;

      public static final int GDPR_FIELD_NUMBER = 4;
      private boolean gdpr_;
      /**
       * <pre>
       * Flag that indicates whether or not the request is subject to GDPR regulations.
       * </pre>
       *
       * <code>optional bool gdpr = 4;</code>
       * @return Whether the gdpr field is set.
       */
      @java.lang.Override
      public boolean hasGdpr() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <pre>
       * Flag that indicates whether or not the request is subject to GDPR regulations.
       * </pre>
       *
       * <code>optional bool gdpr = 4;</code>
       * @return The gdpr.
       */
      @java.lang.Override
      public boolean getGdpr() {
        return gdpr_;
      }

      public static final int US_PRIVACY_FIELD_NUMBER = 5;
      private volatile java.lang.Object usPrivacy_;
      /**
       * <pre>
       * Communicates signals regarding consumer privacy under US privacy regulation.
       * </pre>
       *
       * <code>optional string us_privacy = 5;</code>
       * @return Whether the usPrivacy field is set.
       */
      @java.lang.Override
      public boolean hasUsPrivacy() {
        return ((bitField0_ & 0x00000008) != 0);
      }
      /**
       * <pre>
       * Communicates signals regarding consumer privacy under US privacy regulation.
       * </pre>
       *
       * <code>optional string us_privacy = 5;</code>
       * @return The usPrivacy.
       */
      @java.lang.Override
      public java.lang.String getUsPrivacy() {
        java.lang.Object ref = usPrivacy_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            usPrivacy_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Communicates signals regarding consumer privacy under US privacy regulation.
       * </pre>
       *
       * <code>optional string us_privacy = 5;</code>
       * @return The bytes for usPrivacy.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getUsPrivacyBytes() {
        java.lang.Object ref = usPrivacy_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          usPrivacy_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

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

        if (!extensionsAreInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
        memoizedIsInitialized = 1;
        return true;
      }

      @java.lang.Override
      public void writeTo(com.google.protobuf.CodedOutputStream output)
                          throws java.io.IOException {
        getSerializedSize();
        com.google.protobuf.GeneratedMessageV3
          .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs>.ExtensionWriter
            extensionWriter = newExtensionWriter();
        if (((bitField0_ & 0x00000001) != 0)) {
          output.writeBool(1, coppa_);
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 2, gpp_);
        }
        if (getGppSidList().size() > 0) {
          output.writeUInt32NoTag(26);
          output.writeUInt32NoTag(gppSidMemoizedSerializedSize);
        }
        for (int i = 0; i < gppSid_.size(); i++) {
          output.writeInt32NoTag(gppSid_.getInt(i));
        }
        if (((bitField0_ & 0x00000004) != 0)) {
          output.writeBool(4, gdpr_);
        }
        if (((bitField0_ & 0x00000008) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 5, usPrivacy_);
        }
        extensionWriter.writeUntil(10000, output);
        unknownFields.writeTo(output);
      }

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

        size = 0;
        if (((bitField0_ & 0x00000001) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeBoolSize(1, coppa_);
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, gpp_);
        }
        {
          int dataSize = 0;
          for (int i = 0; i < gppSid_.size(); i++) {
            dataSize += com.google.protobuf.CodedOutputStream
              .computeInt32SizeNoTag(gppSid_.getInt(i));
          }
          size += dataSize;
          if (!getGppSidList().isEmpty()) {
            size += 1;
            size += com.google.protobuf.CodedOutputStream
                .computeInt32SizeNoTag(dataSize);
          }
          gppSidMemoizedSerializedSize = dataSize;
        }
        if (((bitField0_ & 0x00000004) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeBoolSize(4, gdpr_);
        }
        if (((bitField0_ & 0x00000008) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(5, usPrivacy_);
        }
        size += extensionsSerializedSize();
        size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs)) {
          return super.equals(obj);
        }
        com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs other = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs) obj;

        if (hasCoppa() != other.hasCoppa()) return false;
        if (hasCoppa()) {
          if (getCoppa()
              != other.getCoppa()) return false;
        }
        if (hasGpp() != other.hasGpp()) return false;
        if (hasGpp()) {
          if (!getGpp()
              .equals(other.getGpp())) return false;
        }
        if (!getGppSidList()
            .equals(other.getGppSidList())) return false;
        if (hasGdpr() != other.hasGdpr()) return false;
        if (hasGdpr()) {
          if (getGdpr()
              != other.getGdpr()) return false;
        }
        if (hasUsPrivacy() != other.hasUsPrivacy()) return false;
        if (hasUsPrivacy()) {
          if (!getUsPrivacy()
              .equals(other.getUsPrivacy())) return false;
        }
        if (!unknownFields.equals(other.unknownFields)) return false;
        if (!getExtensionFields().equals(other.getExtensionFields()))
          return false;
        return true;
      }

      @java.lang.Override
      public int hashCode() {
        if (memoizedHashCode != 0) {
          return memoizedHashCode;
        }
        int hash = 41;
        hash = (19 * hash) + getDescriptor().hashCode();
        if (hasCoppa()) {
          hash = (37 * hash) + COPPA_FIELD_NUMBER;
          hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
              getCoppa());
        }
        if (hasGpp()) {
          hash = (37 * hash) + GPP_FIELD_NUMBER;
          hash = (53 * hash) + getGpp().hashCode();
        }
        if (getGppSidCount() > 0) {
          hash = (37 * hash) + GPP_SID_FIELD_NUMBER;
          hash = (53 * hash) + getGppSidList().hashCode();
        }
        if (hasGdpr()) {
          hash = (37 * hash) + GDPR_FIELD_NUMBER;
          hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
              getGdpr());
        }
        if (hasUsPrivacy()) {
          hash = (37 * hash) + US_PRIVACY_FIELD_NUMBER;
          hash = (53 * hash) + getUsPrivacy().hashCode();
        }
        hash = hashFields(hash, getExtensionFields());
        hash = (29 * hash) + unknownFields.hashCode();
        memoizedHashCode = hash;
        return hash;
      }

      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs parseFrom(
          java.nio.ByteBuffer data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs parseFrom(
          java.nio.ByteBuffer data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs parseFrom(
          com.google.protobuf.ByteString data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs parseFrom(
          com.google.protobuf.ByteString data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs parseFrom(byte[] data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs parseFrom(
          byte[] data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs parseFrom(java.io.InputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs parseDelimitedFrom(java.io.InputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseDelimitedWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs parseFrom(
          com.google.protobuf.CodedInputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs 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>
       * OpenRTB 2.2: This object contains any legal, governmental, or industry
       * regulations that apply to the request. The coppa flag signals whether
       * or not the request falls under the United States Federal Trade Commission's
       * regulations for the United States Children's Online Privacy Protection Act
       * ("COPPA"). Refer to Section 7.1 for more information.
       * </pre>
       *
       * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest.Regs}
       */
      public static final class Builder extends
          com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs, Builder> implements
          // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.BidRequest.Regs)
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.RegsOrBuilder {
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Regs_descriptor;
        }

        @java.lang.Override
        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Regs_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs.Builder.class);
        }

        // Construct using com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs.newBuilder()
        private Builder() {
          maybeForceBuilderInitialization();
        }

        private Builder(
            com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
          super(parent);
          maybeForceBuilderInitialization();
        }
        private void maybeForceBuilderInitialization() {
          if (com.google.protobuf.GeneratedMessageV3
                  .alwaysUseFieldBuilders) {
          }
        }
        @java.lang.Override
        public Builder clear() {
          super.clear();
          coppa_ = false;
          bitField0_ = (bitField0_ & ~0x00000001);
          gpp_ = "";
          bitField0_ = (bitField0_ & ~0x00000002);
          gppSid_ = emptyIntList();
          bitField0_ = (bitField0_ & ~0x00000004);
          gdpr_ = false;
          bitField0_ = (bitField0_ & ~0x00000008);
          usPrivacy_ = "";
          bitField0_ = (bitField0_ & ~0x00000010);
          return this;
        }

        @java.lang.Override
        public com.google.protobuf.Descriptors.Descriptor
            getDescriptorForType() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_Regs_descriptor;
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs getDefaultInstanceForType() {
          return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs.getDefaultInstance();
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs build() {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs result = buildPartial();
          if (!result.isInitialized()) {
            throw newUninitializedMessageException(result);
          }
          return result;
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs buildPartial() {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs result = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs(this);
          int from_bitField0_ = bitField0_;
          int to_bitField0_ = 0;
          if (((from_bitField0_ & 0x00000001) != 0)) {
            result.coppa_ = coppa_;
            to_bitField0_ |= 0x00000001;
          }
          if (((from_bitField0_ & 0x00000002) != 0)) {
            to_bitField0_ |= 0x00000002;
          }
          result.gpp_ = gpp_;
          if (((bitField0_ & 0x00000004) != 0)) {
            gppSid_.makeImmutable();
            bitField0_ = (bitField0_ & ~0x00000004);
          }
          result.gppSid_ = gppSid_;
          if (((from_bitField0_ & 0x00000008) != 0)) {
            result.gdpr_ = gdpr_;
            to_bitField0_ |= 0x00000004;
          }
          if (((from_bitField0_ & 0x00000010) != 0)) {
            to_bitField0_ |= 0x00000008;
          }
          result.usPrivacy_ = usPrivacy_;
          result.bitField0_ = to_bitField0_;
          onBuilt();
          return result;
        }

        @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 <Type> Builder setExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs, Type> extension,
            Type value) {
          return super.setExtension(extension, value);
        }
        @java.lang.Override
        public <Type> Builder setExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs, java.util.List<Type>> extension,
            int index, Type value) {
          return super.setExtension(extension, index, value);
        }
        @java.lang.Override
        public <Type> Builder addExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs, java.util.List<Type>> extension,
            Type value) {
          return super.addExtension(extension, value);
        }
        @java.lang.Override
        public <Type> Builder clearExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs, ?> extension) {
          return super.clearExtension(extension);
        }
        @java.lang.Override
        public Builder mergeFrom(com.google.protobuf.Message other) {
          if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs) {
            return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs)other);
          } else {
            super.mergeFrom(other);
            return this;
          }
        }

        public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs other) {
          if (other == com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs.getDefaultInstance()) return this;
          if (other.hasCoppa()) {
            setCoppa(other.getCoppa());
          }
          if (other.hasGpp()) {
            bitField0_ |= 0x00000002;
            gpp_ = other.gpp_;
            onChanged();
          }
          if (!other.gppSid_.isEmpty()) {
            if (gppSid_.isEmpty()) {
              gppSid_ = other.gppSid_;
              bitField0_ = (bitField0_ & ~0x00000004);
            } else {
              ensureGppSidIsMutable();
              gppSid_.addAll(other.gppSid_);
            }
            onChanged();
          }
          if (other.hasGdpr()) {
            setGdpr(other.getGdpr());
          }
          if (other.hasUsPrivacy()) {
            bitField0_ |= 0x00000010;
            usPrivacy_ = other.usPrivacy_;
            onChanged();
          }
          this.mergeExtensionFields(other);
          this.mergeUnknownFields(other.unknownFields);
          onChanged();
          return this;
        }

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

        @java.lang.Override
        public Builder mergeFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws java.io.IOException {
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs parsedMessage = null;
          try {
            parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs) e.getUnfinishedMessage();
            throw e.unwrapIOException();
          } finally {
            if (parsedMessage != null) {
              mergeFrom(parsedMessage);
            }
          }
          return this;
        }
        private int bitField0_;

        private boolean coppa_ ;
        /**
         * <pre>
         * Flag indicating if this request is subject to the COPPA regulations
         * established by the USA FTC, where 0 = no, 1 = yes.
         * </pre>
         *
         * <code>optional bool coppa = 1;</code>
         * @return Whether the coppa field is set.
         */
        @java.lang.Override
        public boolean hasCoppa() {
          return ((bitField0_ & 0x00000001) != 0);
        }
        /**
         * <pre>
         * Flag indicating if this request is subject to the COPPA regulations
         * established by the USA FTC, where 0 = no, 1 = yes.
         * </pre>
         *
         * <code>optional bool coppa = 1;</code>
         * @return The coppa.
         */
        @java.lang.Override
        public boolean getCoppa() {
          return coppa_;
        }
        /**
         * <pre>
         * Flag indicating if this request is subject to the COPPA regulations
         * established by the USA FTC, where 0 = no, 1 = yes.
         * </pre>
         *
         * <code>optional bool coppa = 1;</code>
         * @param value The coppa to set.
         * @return This builder for chaining.
         */
        public Builder setCoppa(boolean value) {
          bitField0_ |= 0x00000001;
          coppa_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Flag indicating if this request is subject to the COPPA regulations
         * established by the USA FTC, where 0 = no, 1 = yes.
         * </pre>
         *
         * <code>optional bool coppa = 1;</code>
         * @return This builder for chaining.
         */
        public Builder clearCoppa() {
          bitField0_ = (bitField0_ & ~0x00000001);
          coppa_ = false;
          onChanged();
          return this;
        }

        private java.lang.Object gpp_ = "";
        /**
         * <pre>
         * Global Privacy Platform string containing encoded consumer privacy choices.
         * </pre>
         *
         * <code>optional string gpp = 2;</code>
         * @return Whether the gpp field is set.
         */
        public boolean hasGpp() {
          return ((bitField0_ & 0x00000002) != 0);
        }
        /**
         * <pre>
         * Global Privacy Platform string containing encoded consumer privacy choices.
         * </pre>
         *
         * <code>optional string gpp = 2;</code>
         * @return The gpp.
         */
        public java.lang.String getGpp() {
          java.lang.Object ref = gpp_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              gpp_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Global Privacy Platform string containing encoded consumer privacy choices.
         * </pre>
         *
         * <code>optional string gpp = 2;</code>
         * @return The bytes for gpp.
         */
        public com.google.protobuf.ByteString
            getGppBytes() {
          java.lang.Object ref = gpp_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            gpp_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Global Privacy Platform string containing encoded consumer privacy choices.
         * </pre>
         *
         * <code>optional string gpp = 2;</code>
         * @param value The gpp to set.
         * @return This builder for chaining.
         */
        public Builder setGpp(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
          gpp_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Global Privacy Platform string containing encoded consumer privacy choices.
         * </pre>
         *
         * <code>optional string gpp = 2;</code>
         * @return This builder for chaining.
         */
        public Builder clearGpp() {
          bitField0_ = (bitField0_ & ~0x00000002);
          gpp_ = getDefaultInstance().getGpp();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Global Privacy Platform string containing encoded consumer privacy choices.
         * </pre>
         *
         * <code>optional string gpp = 2;</code>
         * @param value The bytes for gpp to set.
         * @return This builder for chaining.
         */
        public Builder setGppBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
          gpp_ = value;
          onChanged();
          return this;
        }

        private com.google.protobuf.Internal.IntList gppSid_ = emptyIntList();
        private void ensureGppSidIsMutable() {
          if (!((bitField0_ & 0x00000004) != 0)) {
            gppSid_ = mutableCopy(gppSid_);
            bitField0_ |= 0x00000004;
           }
        }
        /**
         * <pre>
         * Array of GPP string section ID(s) in force for the current transaction.
         * In most cases, this field should have a single section ID. In rare
         * occasions where such a single section ID can not be determined, the
         * field may contain up to 2 values, separated by a comma.
         * </pre>
         *
         * <code>repeated int32 gpp_sid = 3 [packed = true];</code>
         * @return A list containing the gppSid.
         */
        public java.util.List<java.lang.Integer>
            getGppSidList() {
          return ((bitField0_ & 0x00000004) != 0) ?
                   java.util.Collections.unmodifiableList(gppSid_) : gppSid_;
        }
        /**
         * <pre>
         * Array of GPP string section ID(s) in force for the current transaction.
         * In most cases, this field should have a single section ID. In rare
         * occasions where such a single section ID can not be determined, the
         * field may contain up to 2 values, separated by a comma.
         * </pre>
         *
         * <code>repeated int32 gpp_sid = 3 [packed = true];</code>
         * @return The count of gppSid.
         */
        public int getGppSidCount() {
          return gppSid_.size();
        }
        /**
         * <pre>
         * Array of GPP string section ID(s) in force for the current transaction.
         * In most cases, this field should have a single section ID. In rare
         * occasions where such a single section ID can not be determined, the
         * field may contain up to 2 values, separated by a comma.
         * </pre>
         *
         * <code>repeated int32 gpp_sid = 3 [packed = true];</code>
         * @param index The index of the element to return.
         * @return The gppSid at the given index.
         */
        public int getGppSid(int index) {
          return gppSid_.getInt(index);
        }
        /**
         * <pre>
         * Array of GPP string section ID(s) in force for the current transaction.
         * In most cases, this field should have a single section ID. In rare
         * occasions where such a single section ID can not be determined, the
         * field may contain up to 2 values, separated by a comma.
         * </pre>
         *
         * <code>repeated int32 gpp_sid = 3 [packed = true];</code>
         * @param index The index to set the value at.
         * @param value The gppSid to set.
         * @return This builder for chaining.
         */
        public Builder setGppSid(
            int index, int value) {
          ensureGppSidIsMutable();
          gppSid_.setInt(index, value);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Array of GPP string section ID(s) in force for the current transaction.
         * In most cases, this field should have a single section ID. In rare
         * occasions where such a single section ID can not be determined, the
         * field may contain up to 2 values, separated by a comma.
         * </pre>
         *
         * <code>repeated int32 gpp_sid = 3 [packed = true];</code>
         * @param value The gppSid to add.
         * @return This builder for chaining.
         */
        public Builder addGppSid(int value) {
          ensureGppSidIsMutable();
          gppSid_.addInt(value);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Array of GPP string section ID(s) in force for the current transaction.
         * In most cases, this field should have a single section ID. In rare
         * occasions where such a single section ID can not be determined, the
         * field may contain up to 2 values, separated by a comma.
         * </pre>
         *
         * <code>repeated int32 gpp_sid = 3 [packed = true];</code>
         * @param values The gppSid to add.
         * @return This builder for chaining.
         */
        public Builder addAllGppSid(
            java.lang.Iterable<? extends java.lang.Integer> values) {
          ensureGppSidIsMutable();
          com.google.protobuf.AbstractMessageLite.Builder.addAll(
              values, gppSid_);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Array of GPP string section ID(s) in force for the current transaction.
         * In most cases, this field should have a single section ID. In rare
         * occasions where such a single section ID can not be determined, the
         * field may contain up to 2 values, separated by a comma.
         * </pre>
         *
         * <code>repeated int32 gpp_sid = 3 [packed = true];</code>
         * @return This builder for chaining.
         */
        public Builder clearGppSid() {
          gppSid_ = emptyIntList();
          bitField0_ = (bitField0_ & ~0x00000004);
          onChanged();
          return this;
        }

        private boolean gdpr_ ;
        /**
         * <pre>
         * Flag that indicates whether or not the request is subject to GDPR regulations.
         * </pre>
         *
         * <code>optional bool gdpr = 4;</code>
         * @return Whether the gdpr field is set.
         */
        @java.lang.Override
        public boolean hasGdpr() {
          return ((bitField0_ & 0x00000008) != 0);
        }
        /**
         * <pre>
         * Flag that indicates whether or not the request is subject to GDPR regulations.
         * </pre>
         *
         * <code>optional bool gdpr = 4;</code>
         * @return The gdpr.
         */
        @java.lang.Override
        public boolean getGdpr() {
          return gdpr_;
        }
        /**
         * <pre>
         * Flag that indicates whether or not the request is subject to GDPR regulations.
         * </pre>
         *
         * <code>optional bool gdpr = 4;</code>
         * @param value The gdpr to set.
         * @return This builder for chaining.
         */
        public Builder setGdpr(boolean value) {
          bitField0_ |= 0x00000008;
          gdpr_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Flag that indicates whether or not the request is subject to GDPR regulations.
         * </pre>
         *
         * <code>optional bool gdpr = 4;</code>
         * @return This builder for chaining.
         */
        public Builder clearGdpr() {
          bitField0_ = (bitField0_ & ~0x00000008);
          gdpr_ = false;
          onChanged();
          return this;
        }

        private java.lang.Object usPrivacy_ = "";
        /**
         * <pre>
         * Communicates signals regarding consumer privacy under US privacy regulation.
         * </pre>
         *
         * <code>optional string us_privacy = 5;</code>
         * @return Whether the usPrivacy field is set.
         */
        public boolean hasUsPrivacy() {
          return ((bitField0_ & 0x00000010) != 0);
        }
        /**
         * <pre>
         * Communicates signals regarding consumer privacy under US privacy regulation.
         * </pre>
         *
         * <code>optional string us_privacy = 5;</code>
         * @return The usPrivacy.
         */
        public java.lang.String getUsPrivacy() {
          java.lang.Object ref = usPrivacy_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              usPrivacy_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Communicates signals regarding consumer privacy under US privacy regulation.
         * </pre>
         *
         * <code>optional string us_privacy = 5;</code>
         * @return The bytes for usPrivacy.
         */
        public com.google.protobuf.ByteString
            getUsPrivacyBytes() {
          java.lang.Object ref = usPrivacy_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            usPrivacy_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Communicates signals regarding consumer privacy under US privacy regulation.
         * </pre>
         *
         * <code>optional string us_privacy = 5;</code>
         * @param value The usPrivacy to set.
         * @return This builder for chaining.
         */
        public Builder setUsPrivacy(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
          usPrivacy_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Communicates signals regarding consumer privacy under US privacy regulation.
         * </pre>
         *
         * <code>optional string us_privacy = 5;</code>
         * @return This builder for chaining.
         */
        public Builder clearUsPrivacy() {
          bitField0_ = (bitField0_ & ~0x00000010);
          usPrivacy_ = getDefaultInstance().getUsPrivacy();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Communicates signals regarding consumer privacy under US privacy regulation.
         * </pre>
         *
         * <code>optional string us_privacy = 5;</code>
         * @param value The bytes for usPrivacy to set.
         * @return This builder for chaining.
         */
        public Builder setUsPrivacyBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
          usPrivacy_ = value;
          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:com.iabtechlab.openrtb.v2.BidRequest.Regs)
      }

      // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.BidRequest.Regs)
      private static final com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs DEFAULT_INSTANCE;
      static {
        DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs();
      }

      public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs getDefaultInstance() {
        return DEFAULT_INSTANCE;
      }

      @java.lang.Deprecated public static final com.google.protobuf.Parser<Regs>
          PARSER = new com.google.protobuf.AbstractParser<Regs>() {
        @java.lang.Override
        public Regs parsePartialFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return new Regs(input, extensionRegistry);
        }
      };

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

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

      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs getDefaultInstanceForType() {
        return DEFAULT_INSTANCE;
      }

    }

    private int bitField0_;
    private int distributionchannelOneofCase_ = 0;
    private java.lang.Object distributionchannelOneof_;
    public enum DistributionchannelOneofCase
        implements com.google.protobuf.Internal.EnumLite,
            com.google.protobuf.AbstractMessage.InternalOneOfEnum {
      SITE(3),
      APP(4),
      DOOH(22),
      DISTRIBUTIONCHANNELONEOF_NOT_SET(0);
      private final int value;
      private DistributionchannelOneofCase(int value) {
        this.value = value;
      }
      /**
       * @param value The number of the enum to look for.
       * @return The enum associated with the given number.
       * @deprecated Use {@link #forNumber(int)} instead.
       */
      @java.lang.Deprecated
      public static DistributionchannelOneofCase valueOf(int value) {
        return forNumber(value);
      }

      public static DistributionchannelOneofCase forNumber(int value) {
        switch (value) {
          case 3: return SITE;
          case 4: return APP;
          case 22: return DOOH;
          case 0: return DISTRIBUTIONCHANNELONEOF_NOT_SET;
          default: return null;
        }
      }
      public int getNumber() {
        return this.value;
      }
    };

    public DistributionchannelOneofCase
    getDistributionchannelOneofCase() {
      return DistributionchannelOneofCase.forNumber(
          distributionchannelOneofCase_);
    }

    public static final int ID_FIELD_NUMBER = 1;
    private volatile java.lang.Object id_;
    /**
     * <pre>
     * Unique ID of the bid request, provided by the exchange.
     * REQUIRED by the OpenRTB specification.
     * </pre>
     *
     * <code>required string id = 1;</code>
     * @return Whether the id field is set.
     */
    @java.lang.Override
    public boolean hasId() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <pre>
     * Unique ID of the bid request, provided by the exchange.
     * REQUIRED by the OpenRTB specification.
     * </pre>
     *
     * <code>required string id = 1;</code>
     * @return The id.
     */
    @java.lang.Override
    public java.lang.String getId() {
      java.lang.Object ref = id_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          id_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * Unique ID of the bid request, provided by the exchange.
     * REQUIRED by the OpenRTB specification.
     * </pre>
     *
     * <code>required string id = 1;</code>
     * @return The bytes for id.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getIdBytes() {
      java.lang.Object ref = id_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        id_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int IMP_FIELD_NUMBER = 2;
    private java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp> imp_;
    /**
     * <pre>
     * Array of Imp objects (Section 3.2.2) representing the impressions offered.
     * At least 1 Imp object is required.
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp imp = 2;</code>
     */
    @java.lang.Override
    public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp> getImpList() {
      return imp_;
    }
    /**
     * <pre>
     * Array of Imp objects (Section 3.2.2) representing the impressions offered.
     * At least 1 Imp object is required.
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp imp = 2;</code>
     */
    @java.lang.Override
    public java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.ImpOrBuilder> 
        getImpOrBuilderList() {
      return imp_;
    }
    /**
     * <pre>
     * Array of Imp objects (Section 3.2.2) representing the impressions offered.
     * At least 1 Imp object is required.
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp imp = 2;</code>
     */
    @java.lang.Override
    public int getImpCount() {
      return imp_.size();
    }
    /**
     * <pre>
     * Array of Imp objects (Section 3.2.2) representing the impressions offered.
     * At least 1 Imp object is required.
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp imp = 2;</code>
     */
    @java.lang.Override
    public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp getImp(int index) {
      return imp_.get(index);
    }
    /**
     * <pre>
     * Array of Imp objects (Section 3.2.2) representing the impressions offered.
     * At least 1 Imp object is required.
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp imp = 2;</code>
     */
    @java.lang.Override
    public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.ImpOrBuilder getImpOrBuilder(
        int index) {
      return imp_.get(index);
    }

    public static final int SITE_FIELD_NUMBER = 3;
    /**
     * <pre>
     * Details via a Site object (Section 3.2.6) about the publisher's website.
     * Only applicable and recommended for websites.
     * </pre>
     *
     * <code>.com.iabtechlab.openrtb.v2.BidRequest.Site site = 3;</code>
     * @return Whether the site field is set.
     */
    @java.lang.Override
    public boolean hasSite() {
      return distributionchannelOneofCase_ == 3;
    }
    /**
     * <pre>
     * Details via a Site object (Section 3.2.6) about the publisher's website.
     * Only applicable and recommended for websites.
     * </pre>
     *
     * <code>.com.iabtechlab.openrtb.v2.BidRequest.Site site = 3;</code>
     * @return The site.
     */
    @java.lang.Override
    public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site getSite() {
      if (distributionchannelOneofCase_ == 3) {
         return (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site) distributionchannelOneof_;
      }
      return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site.getDefaultInstance();
    }
    /**
     * <pre>
     * Details via a Site object (Section 3.2.6) about the publisher's website.
     * Only applicable and recommended for websites.
     * </pre>
     *
     * <code>.com.iabtechlab.openrtb.v2.BidRequest.Site site = 3;</code>
     */
    @java.lang.Override
    public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.SiteOrBuilder getSiteOrBuilder() {
      if (distributionchannelOneofCase_ == 3) {
         return (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site) distributionchannelOneof_;
      }
      return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site.getDefaultInstance();
    }

    public static final int APP_FIELD_NUMBER = 4;
    /**
     * <pre>
     * Details via an App object (Section 3.2.7) about the publisher's app
     * (non-browser applications). Only applicable and recommended for apps.
     * </pre>
     *
     * <code>.com.iabtechlab.openrtb.v2.BidRequest.App app = 4;</code>
     * @return Whether the app field is set.
     */
    @java.lang.Override
    public boolean hasApp() {
      return distributionchannelOneofCase_ == 4;
    }
    /**
     * <pre>
     * Details via an App object (Section 3.2.7) about the publisher's app
     * (non-browser applications). Only applicable and recommended for apps.
     * </pre>
     *
     * <code>.com.iabtechlab.openrtb.v2.BidRequest.App app = 4;</code>
     * @return The app.
     */
    @java.lang.Override
    public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App getApp() {
      if (distributionchannelOneofCase_ == 4) {
         return (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App) distributionchannelOneof_;
      }
      return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App.getDefaultInstance();
    }
    /**
     * <pre>
     * Details via an App object (Section 3.2.7) about the publisher's app
     * (non-browser applications). Only applicable and recommended for apps.
     * </pre>
     *
     * <code>.com.iabtechlab.openrtb.v2.BidRequest.App app = 4;</code>
     */
    @java.lang.Override
    public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.AppOrBuilder getAppOrBuilder() {
      if (distributionchannelOneofCase_ == 4) {
         return (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App) distributionchannelOneof_;
      }
      return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App.getDefaultInstance();
    }

    public static final int DOOH_FIELD_NUMBER = 22;
    /**
     * <pre>
     * This object should be included if the ad supported content is a Digital
     * Out-Of-Home screen. A bid request with a DOOH object must not contain a
     * site or app object.
     * </pre>
     *
     * <code>.com.iabtechlab.openrtb.v2.BidRequest.Dooh dooh = 22;</code>
     * @return Whether the dooh field is set.
     */
    @java.lang.Override
    public boolean hasDooh() {
      return distributionchannelOneofCase_ == 22;
    }
    /**
     * <pre>
     * This object should be included if the ad supported content is a Digital
     * Out-Of-Home screen. A bid request with a DOOH object must not contain a
     * site or app object.
     * </pre>
     *
     * <code>.com.iabtechlab.openrtb.v2.BidRequest.Dooh dooh = 22;</code>
     * @return The dooh.
     */
    @java.lang.Override
    public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh getDooh() {
      if (distributionchannelOneofCase_ == 22) {
         return (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh) distributionchannelOneof_;
      }
      return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh.getDefaultInstance();
    }
    /**
     * <pre>
     * This object should be included if the ad supported content is a Digital
     * Out-Of-Home screen. A bid request with a DOOH object must not contain a
     * site or app object.
     * </pre>
     *
     * <code>.com.iabtechlab.openrtb.v2.BidRequest.Dooh dooh = 22;</code>
     */
    @java.lang.Override
    public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.DoohOrBuilder getDoohOrBuilder() {
      if (distributionchannelOneofCase_ == 22) {
         return (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh) distributionchannelOneof_;
      }
      return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh.getDefaultInstance();
    }

    public static final int DEVICE_FIELD_NUMBER = 5;
    private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device device_;
    /**
     * <pre>
     * Details via a Device object (Section 3.2.11) about the user's
     * device to which the impression will be delivered.
     * </pre>
     *
     * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Device device = 5;</code>
     * @return Whether the device field is set.
     */
    @java.lang.Override
    public boolean hasDevice() {
      return ((bitField0_ & 0x00000010) != 0);
    }
    /**
     * <pre>
     * Details via a Device object (Section 3.2.11) about the user's
     * device to which the impression will be delivered.
     * </pre>
     *
     * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Device device = 5;</code>
     * @return The device.
     */
    @java.lang.Override
    public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device getDevice() {
      return device_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device.getDefaultInstance() : device_;
    }
    /**
     * <pre>
     * Details via a Device object (Section 3.2.11) about the user's
     * device to which the impression will be delivered.
     * </pre>
     *
     * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Device device = 5;</code>
     */
    @java.lang.Override
    public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.DeviceOrBuilder getDeviceOrBuilder() {
      return device_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device.getDefaultInstance() : device_;
    }

    public static final int REGS_FIELD_NUMBER = 14;
    private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs regs_;
    /**
     * <pre>
     * A Regs object (Section 3.2.16) that specifies any industry, legal,
     * or governmental regulations in force for this request.
     * </pre>
     *
     * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Regs regs = 14;</code>
     * @return Whether the regs field is set.
     */
    @java.lang.Override
    public boolean hasRegs() {
      return ((bitField0_ & 0x00000020) != 0);
    }
    /**
     * <pre>
     * A Regs object (Section 3.2.16) that specifies any industry, legal,
     * or governmental regulations in force for this request.
     * </pre>
     *
     * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Regs regs = 14;</code>
     * @return The regs.
     */
    @java.lang.Override
    public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs getRegs() {
      return regs_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs.getDefaultInstance() : regs_;
    }
    /**
     * <pre>
     * A Regs object (Section 3.2.16) that specifies any industry, legal,
     * or governmental regulations in force for this request.
     * </pre>
     *
     * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Regs regs = 14;</code>
     */
    @java.lang.Override
    public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.RegsOrBuilder getRegsOrBuilder() {
      return regs_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs.getDefaultInstance() : regs_;
    }

    public static final int USER_FIELD_NUMBER = 6;
    private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User user_;
    /**
     * <pre>
     * Details via a User object (Section 3.2.13) about the human
     * user of the device; the advertising audience.
     * </pre>
     *
     * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.User user = 6;</code>
     * @return Whether the user field is set.
     */
    @java.lang.Override
    public boolean hasUser() {
      return ((bitField0_ & 0x00000040) != 0);
    }
    /**
     * <pre>
     * Details via a User object (Section 3.2.13) about the human
     * user of the device; the advertising audience.
     * </pre>
     *
     * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.User user = 6;</code>
     * @return The user.
     */
    @java.lang.Override
    public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User getUser() {
      return user_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User.getDefaultInstance() : user_;
    }
    /**
     * <pre>
     * Details via a User object (Section 3.2.13) about the human
     * user of the device; the advertising audience.
     * </pre>
     *
     * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.User user = 6;</code>
     */
    @java.lang.Override
    public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserOrBuilder getUserOrBuilder() {
      return user_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User.getDefaultInstance() : user_;
    }

    public static final int AT_FIELD_NUMBER = 7;
    private int at_;
    /**
     * <pre>
     * Auction type, where 1 = First Price, 2 = Second Price Plus.
     * Refer to enum com.iabtechlab.openrtb.v3.AuctionType for generic values.
     * Exchange-specific auction types can be defined using values &gt; 500.
     * </pre>
     *
     * <code>optional int32 at = 7 [default = 2];</code>
     * @return Whether the at field is set.
     */
    @java.lang.Override
    public boolean hasAt() {
      return ((bitField0_ & 0x00000080) != 0);
    }
    /**
     * <pre>
     * Auction type, where 1 = First Price, 2 = Second Price Plus.
     * Refer to enum com.iabtechlab.openrtb.v3.AuctionType for generic values.
     * Exchange-specific auction types can be defined using values &gt; 500.
     * </pre>
     *
     * <code>optional int32 at = 7 [default = 2];</code>
     * @return The at.
     */
    @java.lang.Override
    public int getAt() {
      return at_;
    }

    public static final int TMAX_FIELD_NUMBER = 8;
    private int tmax_;
    /**
     * <pre>
     * Maximum time in milliseconds to submit a bid to avoid timeout.
     * This value is commonly communicated offline.
     * </pre>
     *
     * <code>optional int32 tmax = 8;</code>
     * @return Whether the tmax field is set.
     */
    @java.lang.Override
    public boolean hasTmax() {
      return ((bitField0_ & 0x00000100) != 0);
    }
    /**
     * <pre>
     * Maximum time in milliseconds to submit a bid to avoid timeout.
     * This value is commonly communicated offline.
     * </pre>
     *
     * <code>optional int32 tmax = 8;</code>
     * @return The tmax.
     */
    @java.lang.Override
    public int getTmax() {
      return tmax_;
    }

    public static final int WSEAT_FIELD_NUMBER = 9;
    private com.google.protobuf.LazyStringList wseat_;
    /**
     * <pre>
     * Whitelist of buyer seats (e.g., advertisers, agencies) allowed to
     * bid on this impression. IDs of seats and knowledge of the
     * buyer's customers to which they refer must be coordinated
     * between bidders and the exchange a priori.
     * Omission implies no seat restrictions.
     * </pre>
     *
     * <code>repeated string wseat = 9;</code>
     * @return A list containing the wseat.
     */
    public com.google.protobuf.ProtocolStringList
        getWseatList() {
      return wseat_;
    }
    /**
     * <pre>
     * Whitelist of buyer seats (e.g., advertisers, agencies) allowed to
     * bid on this impression. IDs of seats and knowledge of the
     * buyer's customers to which they refer must be coordinated
     * between bidders and the exchange a priori.
     * Omission implies no seat restrictions.
     * </pre>
     *
     * <code>repeated string wseat = 9;</code>
     * @return The count of wseat.
     */
    public int getWseatCount() {
      return wseat_.size();
    }
    /**
     * <pre>
     * Whitelist of buyer seats (e.g., advertisers, agencies) allowed to
     * bid on this impression. IDs of seats and knowledge of the
     * buyer's customers to which they refer must be coordinated
     * between bidders and the exchange a priori.
     * Omission implies no seat restrictions.
     * </pre>
     *
     * <code>repeated string wseat = 9;</code>
     * @param index The index of the element to return.
     * @return The wseat at the given index.
     */
    public java.lang.String getWseat(int index) {
      return wseat_.get(index);
    }
    /**
     * <pre>
     * Whitelist of buyer seats (e.g., advertisers, agencies) allowed to
     * bid on this impression. IDs of seats and knowledge of the
     * buyer's customers to which they refer must be coordinated
     * between bidders and the exchange a priori.
     * Omission implies no seat restrictions.
     * </pre>
     *
     * <code>repeated string wseat = 9;</code>
     * @param index The index of the value to return.
     * @return The bytes of the wseat at the given index.
     */
    public com.google.protobuf.ByteString
        getWseatBytes(int index) {
      return wseat_.getByteString(index);
    }

    public static final int ALLIMPS_FIELD_NUMBER = 10;
    private boolean allimps_;
    /**
     * <pre>
     * Flag to indicate if Exchange can verify that the impressions offered
     * represent all of the impressions available in context (e.g., all on the
     * web page, all video spots such as pre/mid/post roll) to support
     * road-blocking. 0 = no or unknown, 1 = yes, the impressions offered
     * represent all that are available.
     * </pre>
     *
     * <code>optional bool allimps = 10 [default = false];</code>
     * @return Whether the allimps field is set.
     */
    @java.lang.Override
    public boolean hasAllimps() {
      return ((bitField0_ & 0x00000200) != 0);
    }
    /**
     * <pre>
     * Flag to indicate if Exchange can verify that the impressions offered
     * represent all of the impressions available in context (e.g., all on the
     * web page, all video spots such as pre/mid/post roll) to support
     * road-blocking. 0 = no or unknown, 1 = yes, the impressions offered
     * represent all that are available.
     * </pre>
     *
     * <code>optional bool allimps = 10 [default = false];</code>
     * @return The allimps.
     */
    @java.lang.Override
    public boolean getAllimps() {
      return allimps_;
    }

    public static final int CUR_FIELD_NUMBER = 11;
    private com.google.protobuf.LazyStringList cur_;
    /**
     * <pre>
     * Array of allowed currencies for bids on this bid request using ISO-4217
     * alpha codes. Recommended only if the exchange accepts multiple currencies.
     * </pre>
     *
     * <code>repeated string cur = 11;</code>
     * @return A list containing the cur.
     */
    public com.google.protobuf.ProtocolStringList
        getCurList() {
      return cur_;
    }
    /**
     * <pre>
     * Array of allowed currencies for bids on this bid request using ISO-4217
     * alpha codes. Recommended only if the exchange accepts multiple currencies.
     * </pre>
     *
     * <code>repeated string cur = 11;</code>
     * @return The count of cur.
     */
    public int getCurCount() {
      return cur_.size();
    }
    /**
     * <pre>
     * Array of allowed currencies for bids on this bid request using ISO-4217
     * alpha codes. Recommended only if the exchange accepts multiple currencies.
     * </pre>
     *
     * <code>repeated string cur = 11;</code>
     * @param index The index of the element to return.
     * @return The cur at the given index.
     */
    public java.lang.String getCur(int index) {
      return cur_.get(index);
    }
    /**
     * <pre>
     * Array of allowed currencies for bids on this bid request using ISO-4217
     * alpha codes. Recommended only if the exchange accepts multiple currencies.
     * </pre>
     *
     * <code>repeated string cur = 11;</code>
     * @param index The index of the value to return.
     * @return The bytes of the cur at the given index.
     */
    public com.google.protobuf.ByteString
        getCurBytes(int index) {
      return cur_.getByteString(index);
    }

    public static final int BCAT_FIELD_NUMBER = 12;
    private com.google.protobuf.LazyStringList bcat_;
    /**
     * <pre>
     * Blocked advertiser categories using the IAB content categories.
     * </pre>
     *
     * <code>repeated string bcat = 12;</code>
     * @return A list containing the bcat.
     */
    public com.google.protobuf.ProtocolStringList
        getBcatList() {
      return bcat_;
    }
    /**
     * <pre>
     * Blocked advertiser categories using the IAB content categories.
     * </pre>
     *
     * <code>repeated string bcat = 12;</code>
     * @return The count of bcat.
     */
    public int getBcatCount() {
      return bcat_.size();
    }
    /**
     * <pre>
     * Blocked advertiser categories using the IAB content categories.
     * </pre>
     *
     * <code>repeated string bcat = 12;</code>
     * @param index The index of the element to return.
     * @return The bcat at the given index.
     */
    public java.lang.String getBcat(int index) {
      return bcat_.get(index);
    }
    /**
     * <pre>
     * Blocked advertiser categories using the IAB content categories.
     * </pre>
     *
     * <code>repeated string bcat = 12;</code>
     * @param index The index of the value to return.
     * @return The bytes of the bcat at the given index.
     */
    public com.google.protobuf.ByteString
        getBcatBytes(int index) {
      return bcat_.getByteString(index);
    }

    public static final int CATTAX_FIELD_NUMBER = 21;
    private int cattax_;
    /**
     * <pre>
     * The taxonomy in use for bcat.
     * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
     * </pre>
     *
     * <code>optional int32 cattax = 21 [default = 1];</code>
     * @return Whether the cattax field is set.
     */
    @java.lang.Override
    public boolean hasCattax() {
      return ((bitField0_ & 0x00000400) != 0);
    }
    /**
     * <pre>
     * The taxonomy in use for bcat.
     * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
     * </pre>
     *
     * <code>optional int32 cattax = 21 [default = 1];</code>
     * @return The cattax.
     */
    @java.lang.Override
    public int getCattax() {
      return cattax_;
    }

    public static final int BADV_FIELD_NUMBER = 13;
    private com.google.protobuf.LazyStringList badv_;
    /**
     * <pre>
     * Block list of advertisers by their domains (e.g., "ford.com").
     * </pre>
     *
     * <code>repeated string badv = 13;</code>
     * @return A list containing the badv.
     */
    public com.google.protobuf.ProtocolStringList
        getBadvList() {
      return badv_;
    }
    /**
     * <pre>
     * Block list of advertisers by their domains (e.g., "ford.com").
     * </pre>
     *
     * <code>repeated string badv = 13;</code>
     * @return The count of badv.
     */
    public int getBadvCount() {
      return badv_.size();
    }
    /**
     * <pre>
     * Block list of advertisers by their domains (e.g., "ford.com").
     * </pre>
     *
     * <code>repeated string badv = 13;</code>
     * @param index The index of the element to return.
     * @return The badv at the given index.
     */
    public java.lang.String getBadv(int index) {
      return badv_.get(index);
    }
    /**
     * <pre>
     * Block list of advertisers by their domains (e.g., "ford.com").
     * </pre>
     *
     * <code>repeated string badv = 13;</code>
     * @param index The index of the value to return.
     * @return The bytes of the badv at the given index.
     */
    public com.google.protobuf.ByteString
        getBadvBytes(int index) {
      return badv_.getByteString(index);
    }

    public static final int BAPP_FIELD_NUMBER = 16;
    private com.google.protobuf.LazyStringList bapp_;
    /**
     * <pre>
     * Block list of applications by their platform-specific exchange
     * independent application identifiers. On Android, these should
     * be bundle or package names (e.g., com.foo.mygame).
     * On iOS, these are numeric IDs.
     * </pre>
     *
     * <code>repeated string bapp = 16;</code>
     * @return A list containing the bapp.
     */
    public com.google.protobuf.ProtocolStringList
        getBappList() {
      return bapp_;
    }
    /**
     * <pre>
     * Block list of applications by their platform-specific exchange
     * independent application identifiers. On Android, these should
     * be bundle or package names (e.g., com.foo.mygame).
     * On iOS, these are numeric IDs.
     * </pre>
     *
     * <code>repeated string bapp = 16;</code>
     * @return The count of bapp.
     */
    public int getBappCount() {
      return bapp_.size();
    }
    /**
     * <pre>
     * Block list of applications by their platform-specific exchange
     * independent application identifiers. On Android, these should
     * be bundle or package names (e.g., com.foo.mygame).
     * On iOS, these are numeric IDs.
     * </pre>
     *
     * <code>repeated string bapp = 16;</code>
     * @param index The index of the element to return.
     * @return The bapp at the given index.
     */
    public java.lang.String getBapp(int index) {
      return bapp_.get(index);
    }
    /**
     * <pre>
     * Block list of applications by their platform-specific exchange
     * independent application identifiers. On Android, these should
     * be bundle or package names (e.g., com.foo.mygame).
     * On iOS, these are numeric IDs.
     * </pre>
     *
     * <code>repeated string bapp = 16;</code>
     * @param index The index of the value to return.
     * @return The bytes of the bapp at the given index.
     */
    public com.google.protobuf.ByteString
        getBappBytes(int index) {
      return bapp_.getByteString(index);
    }

    public static final int TEST_FIELD_NUMBER = 15;
    private boolean test_;
    /**
     * <pre>
     * Indicator of test mode in which auctions are not billable,
     * where 0 = live mode, 1 = test mode.
     * </pre>
     *
     * <code>optional bool test = 15 [default = false];</code>
     * @return Whether the test field is set.
     */
    @java.lang.Override
    public boolean hasTest() {
      return ((bitField0_ & 0x00000800) != 0);
    }
    /**
     * <pre>
     * Indicator of test mode in which auctions are not billable,
     * where 0 = live mode, 1 = test mode.
     * </pre>
     *
     * <code>optional bool test = 15 [default = false];</code>
     * @return The test.
     */
    @java.lang.Override
    public boolean getTest() {
      return test_;
    }

    public static final int BSEAT_FIELD_NUMBER = 17;
    private com.google.protobuf.LazyStringList bseat_;
    /**
     * <pre>
     * Block list of buyer seats (e.g., advertisers, agencies) restricted
     * from bidding on this impression. IDs of seats and knowledge
     * of the buyer's customers to which they refer must be
     * coordinated between bidders and the exchange a priori.
     * At most, only one of wseat and bseat should be used in the
     * same request. Omission of both implies no seat restrictions.
     * </pre>
     *
     * <code>repeated string bseat = 17;</code>
     * @return A list containing the bseat.
     */
    public com.google.protobuf.ProtocolStringList
        getBseatList() {
      return bseat_;
    }
    /**
     * <pre>
     * Block list of buyer seats (e.g., advertisers, agencies) restricted
     * from bidding on this impression. IDs of seats and knowledge
     * of the buyer's customers to which they refer must be
     * coordinated between bidders and the exchange a priori.
     * At most, only one of wseat and bseat should be used in the
     * same request. Omission of both implies no seat restrictions.
     * </pre>
     *
     * <code>repeated string bseat = 17;</code>
     * @return The count of bseat.
     */
    public int getBseatCount() {
      return bseat_.size();
    }
    /**
     * <pre>
     * Block list of buyer seats (e.g., advertisers, agencies) restricted
     * from bidding on this impression. IDs of seats and knowledge
     * of the buyer's customers to which they refer must be
     * coordinated between bidders and the exchange a priori.
     * At most, only one of wseat and bseat should be used in the
     * same request. Omission of both implies no seat restrictions.
     * </pre>
     *
     * <code>repeated string bseat = 17;</code>
     * @param index The index of the element to return.
     * @return The bseat at the given index.
     */
    public java.lang.String getBseat(int index) {
      return bseat_.get(index);
    }
    /**
     * <pre>
     * Block list of buyer seats (e.g., advertisers, agencies) restricted
     * from bidding on this impression. IDs of seats and knowledge
     * of the buyer's customers to which they refer must be
     * coordinated between bidders and the exchange a priori.
     * At most, only one of wseat and bseat should be used in the
     * same request. Omission of both implies no seat restrictions.
     * </pre>
     *
     * <code>repeated string bseat = 17;</code>
     * @param index The index of the value to return.
     * @return The bytes of the bseat at the given index.
     */
    public com.google.protobuf.ByteString
        getBseatBytes(int index) {
      return bseat_.getByteString(index);
    }

    public static final int WLANG_FIELD_NUMBER = 18;
    private com.google.protobuf.LazyStringList wlang_;
    /**
     * <pre>
     * White list of languages for creatives using ISO-639-1-alpha-2.
     * Omission implies no specific restrictions, but buyers would be
     * advised to consider language attribute in the Device and/or
     * Content objects if available.
     * </pre>
     *
     * <code>repeated string wlang = 18;</code>
     * @return A list containing the wlang.
     */
    public com.google.protobuf.ProtocolStringList
        getWlangList() {
      return wlang_;
    }
    /**
     * <pre>
     * White list of languages for creatives using ISO-639-1-alpha-2.
     * Omission implies no specific restrictions, but buyers would be
     * advised to consider language attribute in the Device and/or
     * Content objects if available.
     * </pre>
     *
     * <code>repeated string wlang = 18;</code>
     * @return The count of wlang.
     */
    public int getWlangCount() {
      return wlang_.size();
    }
    /**
     * <pre>
     * White list of languages for creatives using ISO-639-1-alpha-2.
     * Omission implies no specific restrictions, but buyers would be
     * advised to consider language attribute in the Device and/or
     * Content objects if available.
     * </pre>
     *
     * <code>repeated string wlang = 18;</code>
     * @param index The index of the element to return.
     * @return The wlang at the given index.
     */
    public java.lang.String getWlang(int index) {
      return wlang_.get(index);
    }
    /**
     * <pre>
     * White list of languages for creatives using ISO-639-1-alpha-2.
     * Omission implies no specific restrictions, but buyers would be
     * advised to consider language attribute in the Device and/or
     * Content objects if available.
     * </pre>
     *
     * <code>repeated string wlang = 18;</code>
     * @param index The index of the value to return.
     * @return The bytes of the wlang at the given index.
     */
    public com.google.protobuf.ByteString
        getWlangBytes(int index) {
      return wlang_.getByteString(index);
    }

    public static final int WLANGB_FIELD_NUMBER = 20;
    private com.google.protobuf.LazyStringList wlangb_;
    /**
     * <pre>
     * Allowed list of languages for creatives using IETF BCP 47I. Omission
     * implies no specific restrictions, but buyers would be advised to consider
     * language attribute in the Device and/or Content objects if available. Only
     * one of wlang or wlangb should be present.
     * </pre>
     *
     * <code>repeated string wlangb = 20;</code>
     * @return A list containing the wlangb.
     */
    public com.google.protobuf.ProtocolStringList
        getWlangbList() {
      return wlangb_;
    }
    /**
     * <pre>
     * Allowed list of languages for creatives using IETF BCP 47I. Omission
     * implies no specific restrictions, but buyers would be advised to consider
     * language attribute in the Device and/or Content objects if available. Only
     * one of wlang or wlangb should be present.
     * </pre>
     *
     * <code>repeated string wlangb = 20;</code>
     * @return The count of wlangb.
     */
    public int getWlangbCount() {
      return wlangb_.size();
    }
    /**
     * <pre>
     * Allowed list of languages for creatives using IETF BCP 47I. Omission
     * implies no specific restrictions, but buyers would be advised to consider
     * language attribute in the Device and/or Content objects if available. Only
     * one of wlang or wlangb should be present.
     * </pre>
     *
     * <code>repeated string wlangb = 20;</code>
     * @param index The index of the element to return.
     * @return The wlangb at the given index.
     */
    public java.lang.String getWlangb(int index) {
      return wlangb_.get(index);
    }
    /**
     * <pre>
     * Allowed list of languages for creatives using IETF BCP 47I. Omission
     * implies no specific restrictions, but buyers would be advised to consider
     * language attribute in the Device and/or Content objects if available. Only
     * one of wlang or wlangb should be present.
     * </pre>
     *
     * <code>repeated string wlangb = 20;</code>
     * @param index The index of the value to return.
     * @return The bytes of the wlangb at the given index.
     */
    public com.google.protobuf.ByteString
        getWlangbBytes(int index) {
      return wlangb_.getByteString(index);
    }

    public static final int SOURCE_FIELD_NUMBER = 19;
    private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source source_;
    /**
     * <pre>
     * A Source object (Section 3.2.2) that provides data about the
     * inventory source and which entity makes the final decision.
     * </pre>
     *
     * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Source source = 19;</code>
     * @return Whether the source field is set.
     */
    @java.lang.Override
    public boolean hasSource() {
      return ((bitField0_ & 0x00001000) != 0);
    }
    /**
     * <pre>
     * A Source object (Section 3.2.2) that provides data about the
     * inventory source and which entity makes the final decision.
     * </pre>
     *
     * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Source source = 19;</code>
     * @return The source.
     */
    @java.lang.Override
    public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source getSource() {
      return source_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source.getDefaultInstance() : source_;
    }
    /**
     * <pre>
     * A Source object (Section 3.2.2) that provides data about the
     * inventory source and which entity makes the final decision.
     * </pre>
     *
     * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Source source = 19;</code>
     */
    @java.lang.Override
    public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.SourceOrBuilder getSourceOrBuilder() {
      return source_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source.getDefaultInstance() : source_;
    }

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

      if (!hasId()) {
        memoizedIsInitialized = 0;
        return false;
      }
      for (int i = 0; i < getImpCount(); i++) {
        if (!getImp(i).isInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
      }
      if (hasSite()) {
        if (!getSite().isInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
      }
      if (hasApp()) {
        if (!getApp().isInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
      }
      if (hasDooh()) {
        if (!getDooh().isInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
      }
      if (hasDevice()) {
        if (!getDevice().isInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
      }
      if (hasRegs()) {
        if (!getRegs().isInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
      }
      if (hasUser()) {
        if (!getUser().isInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
      }
      if (hasSource()) {
        if (!getSource().isInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
      }
      if (!extensionsAreInitialized()) {
        memoizedIsInitialized = 0;
        return false;
      }
      memoizedIsInitialized = 1;
      return true;
    }

    @java.lang.Override
    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      com.google.protobuf.GeneratedMessageV3
        .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest>.ExtensionWriter
          extensionWriter = newExtensionWriter();
      if (((bitField0_ & 0x00000001) != 0)) {
        com.google.protobuf.GeneratedMessageV3.writeString(output, 1, id_);
      }
      for (int i = 0; i < imp_.size(); i++) {
        output.writeMessage(2, imp_.get(i));
      }
      if (distributionchannelOneofCase_ == 3) {
        output.writeMessage(3, (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site) distributionchannelOneof_);
      }
      if (distributionchannelOneofCase_ == 4) {
        output.writeMessage(4, (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App) distributionchannelOneof_);
      }
      if (((bitField0_ & 0x00000010) != 0)) {
        output.writeMessage(5, getDevice());
      }
      if (((bitField0_ & 0x00000040) != 0)) {
        output.writeMessage(6, getUser());
      }
      if (((bitField0_ & 0x00000080) != 0)) {
        output.writeInt32(7, at_);
      }
      if (((bitField0_ & 0x00000100) != 0)) {
        output.writeInt32(8, tmax_);
      }
      for (int i = 0; i < wseat_.size(); i++) {
        com.google.protobuf.GeneratedMessageV3.writeString(output, 9, wseat_.getRaw(i));
      }
      if (((bitField0_ & 0x00000200) != 0)) {
        output.writeBool(10, allimps_);
      }
      for (int i = 0; i < cur_.size(); i++) {
        com.google.protobuf.GeneratedMessageV3.writeString(output, 11, cur_.getRaw(i));
      }
      for (int i = 0; i < bcat_.size(); i++) {
        com.google.protobuf.GeneratedMessageV3.writeString(output, 12, bcat_.getRaw(i));
      }
      for (int i = 0; i < badv_.size(); i++) {
        com.google.protobuf.GeneratedMessageV3.writeString(output, 13, badv_.getRaw(i));
      }
      if (((bitField0_ & 0x00000020) != 0)) {
        output.writeMessage(14, getRegs());
      }
      if (((bitField0_ & 0x00000800) != 0)) {
        output.writeBool(15, test_);
      }
      for (int i = 0; i < bapp_.size(); i++) {
        com.google.protobuf.GeneratedMessageV3.writeString(output, 16, bapp_.getRaw(i));
      }
      for (int i = 0; i < bseat_.size(); i++) {
        com.google.protobuf.GeneratedMessageV3.writeString(output, 17, bseat_.getRaw(i));
      }
      for (int i = 0; i < wlang_.size(); i++) {
        com.google.protobuf.GeneratedMessageV3.writeString(output, 18, wlang_.getRaw(i));
      }
      if (((bitField0_ & 0x00001000) != 0)) {
        output.writeMessage(19, getSource());
      }
      for (int i = 0; i < wlangb_.size(); i++) {
        com.google.protobuf.GeneratedMessageV3.writeString(output, 20, wlangb_.getRaw(i));
      }
      if (((bitField0_ & 0x00000400) != 0)) {
        output.writeInt32(21, cattax_);
      }
      if (distributionchannelOneofCase_ == 22) {
        output.writeMessage(22, (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh) distributionchannelOneof_);
      }
      extensionWriter.writeUntil(10000, output);
      unknownFields.writeTo(output);
    }

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

      size = 0;
      if (((bitField0_ & 0x00000001) != 0)) {
        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, id_);
      }
      for (int i = 0; i < imp_.size(); i++) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(2, imp_.get(i));
      }
      if (distributionchannelOneofCase_ == 3) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(3, (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site) distributionchannelOneof_);
      }
      if (distributionchannelOneofCase_ == 4) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(4, (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App) distributionchannelOneof_);
      }
      if (((bitField0_ & 0x00000010) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(5, getDevice());
      }
      if (((bitField0_ & 0x00000040) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(6, getUser());
      }
      if (((bitField0_ & 0x00000080) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt32Size(7, at_);
      }
      if (((bitField0_ & 0x00000100) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt32Size(8, tmax_);
      }
      {
        int dataSize = 0;
        for (int i = 0; i < wseat_.size(); i++) {
          dataSize += computeStringSizeNoTag(wseat_.getRaw(i));
        }
        size += dataSize;
        size += 1 * getWseatList().size();
      }
      if (((bitField0_ & 0x00000200) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBoolSize(10, allimps_);
      }
      {
        int dataSize = 0;
        for (int i = 0; i < cur_.size(); i++) {
          dataSize += computeStringSizeNoTag(cur_.getRaw(i));
        }
        size += dataSize;
        size += 1 * getCurList().size();
      }
      {
        int dataSize = 0;
        for (int i = 0; i < bcat_.size(); i++) {
          dataSize += computeStringSizeNoTag(bcat_.getRaw(i));
        }
        size += dataSize;
        size += 1 * getBcatList().size();
      }
      {
        int dataSize = 0;
        for (int i = 0; i < badv_.size(); i++) {
          dataSize += computeStringSizeNoTag(badv_.getRaw(i));
        }
        size += dataSize;
        size += 1 * getBadvList().size();
      }
      if (((bitField0_ & 0x00000020) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(14, getRegs());
      }
      if (((bitField0_ & 0x00000800) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBoolSize(15, test_);
      }
      {
        int dataSize = 0;
        for (int i = 0; i < bapp_.size(); i++) {
          dataSize += computeStringSizeNoTag(bapp_.getRaw(i));
        }
        size += dataSize;
        size += 2 * getBappList().size();
      }
      {
        int dataSize = 0;
        for (int i = 0; i < bseat_.size(); i++) {
          dataSize += computeStringSizeNoTag(bseat_.getRaw(i));
        }
        size += dataSize;
        size += 2 * getBseatList().size();
      }
      {
        int dataSize = 0;
        for (int i = 0; i < wlang_.size(); i++) {
          dataSize += computeStringSizeNoTag(wlang_.getRaw(i));
        }
        size += dataSize;
        size += 2 * getWlangList().size();
      }
      if (((bitField0_ & 0x00001000) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(19, getSource());
      }
      {
        int dataSize = 0;
        for (int i = 0; i < wlangb_.size(); i++) {
          dataSize += computeStringSizeNoTag(wlangb_.getRaw(i));
        }
        size += dataSize;
        size += 2 * getWlangbList().size();
      }
      if (((bitField0_ & 0x00000400) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt32Size(21, cattax_);
      }
      if (distributionchannelOneofCase_ == 22) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(22, (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh) distributionchannelOneof_);
      }
      size += extensionsSerializedSize();
      size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.BidRequest)) {
        return super.equals(obj);
      }
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest other = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest) obj;

      if (hasId() != other.hasId()) return false;
      if (hasId()) {
        if (!getId()
            .equals(other.getId())) return false;
      }
      if (!getImpList()
          .equals(other.getImpList())) return false;
      if (hasDevice() != other.hasDevice()) return false;
      if (hasDevice()) {
        if (!getDevice()
            .equals(other.getDevice())) return false;
      }
      if (hasRegs() != other.hasRegs()) return false;
      if (hasRegs()) {
        if (!getRegs()
            .equals(other.getRegs())) return false;
      }
      if (hasUser() != other.hasUser()) return false;
      if (hasUser()) {
        if (!getUser()
            .equals(other.getUser())) return false;
      }
      if (hasAt() != other.hasAt()) return false;
      if (hasAt()) {
        if (getAt()
            != other.getAt()) return false;
      }
      if (hasTmax() != other.hasTmax()) return false;
      if (hasTmax()) {
        if (getTmax()
            != other.getTmax()) return false;
      }
      if (!getWseatList()
          .equals(other.getWseatList())) return false;
      if (hasAllimps() != other.hasAllimps()) return false;
      if (hasAllimps()) {
        if (getAllimps()
            != other.getAllimps()) return false;
      }
      if (!getCurList()
          .equals(other.getCurList())) return false;
      if (!getBcatList()
          .equals(other.getBcatList())) return false;
      if (hasCattax() != other.hasCattax()) return false;
      if (hasCattax()) {
        if (getCattax()
            != other.getCattax()) return false;
      }
      if (!getBadvList()
          .equals(other.getBadvList())) return false;
      if (!getBappList()
          .equals(other.getBappList())) return false;
      if (hasTest() != other.hasTest()) return false;
      if (hasTest()) {
        if (getTest()
            != other.getTest()) return false;
      }
      if (!getBseatList()
          .equals(other.getBseatList())) return false;
      if (!getWlangList()
          .equals(other.getWlangList())) return false;
      if (!getWlangbList()
          .equals(other.getWlangbList())) return false;
      if (hasSource() != other.hasSource()) return false;
      if (hasSource()) {
        if (!getSource()
            .equals(other.getSource())) return false;
      }
      if (!getDistributionchannelOneofCase().equals(other.getDistributionchannelOneofCase())) return false;
      switch (distributionchannelOneofCase_) {
        case 3:
          if (!getSite()
              .equals(other.getSite())) return false;
          break;
        case 4:
          if (!getApp()
              .equals(other.getApp())) return false;
          break;
        case 22:
          if (!getDooh()
              .equals(other.getDooh())) return false;
          break;
        case 0:
        default:
      }
      if (!unknownFields.equals(other.unknownFields)) return false;
      if (!getExtensionFields().equals(other.getExtensionFields()))
        return false;
      return true;
    }

    @java.lang.Override
    public int hashCode() {
      if (memoizedHashCode != 0) {
        return memoizedHashCode;
      }
      int hash = 41;
      hash = (19 * hash) + getDescriptor().hashCode();
      if (hasId()) {
        hash = (37 * hash) + ID_FIELD_NUMBER;
        hash = (53 * hash) + getId().hashCode();
      }
      if (getImpCount() > 0) {
        hash = (37 * hash) + IMP_FIELD_NUMBER;
        hash = (53 * hash) + getImpList().hashCode();
      }
      if (hasDevice()) {
        hash = (37 * hash) + DEVICE_FIELD_NUMBER;
        hash = (53 * hash) + getDevice().hashCode();
      }
      if (hasRegs()) {
        hash = (37 * hash) + REGS_FIELD_NUMBER;
        hash = (53 * hash) + getRegs().hashCode();
      }
      if (hasUser()) {
        hash = (37 * hash) + USER_FIELD_NUMBER;
        hash = (53 * hash) + getUser().hashCode();
      }
      if (hasAt()) {
        hash = (37 * hash) + AT_FIELD_NUMBER;
        hash = (53 * hash) + getAt();
      }
      if (hasTmax()) {
        hash = (37 * hash) + TMAX_FIELD_NUMBER;
        hash = (53 * hash) + getTmax();
      }
      if (getWseatCount() > 0) {
        hash = (37 * hash) + WSEAT_FIELD_NUMBER;
        hash = (53 * hash) + getWseatList().hashCode();
      }
      if (hasAllimps()) {
        hash = (37 * hash) + ALLIMPS_FIELD_NUMBER;
        hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
            getAllimps());
      }
      if (getCurCount() > 0) {
        hash = (37 * hash) + CUR_FIELD_NUMBER;
        hash = (53 * hash) + getCurList().hashCode();
      }
      if (getBcatCount() > 0) {
        hash = (37 * hash) + BCAT_FIELD_NUMBER;
        hash = (53 * hash) + getBcatList().hashCode();
      }
      if (hasCattax()) {
        hash = (37 * hash) + CATTAX_FIELD_NUMBER;
        hash = (53 * hash) + getCattax();
      }
      if (getBadvCount() > 0) {
        hash = (37 * hash) + BADV_FIELD_NUMBER;
        hash = (53 * hash) + getBadvList().hashCode();
      }
      if (getBappCount() > 0) {
        hash = (37 * hash) + BAPP_FIELD_NUMBER;
        hash = (53 * hash) + getBappList().hashCode();
      }
      if (hasTest()) {
        hash = (37 * hash) + TEST_FIELD_NUMBER;
        hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
            getTest());
      }
      if (getBseatCount() > 0) {
        hash = (37 * hash) + BSEAT_FIELD_NUMBER;
        hash = (53 * hash) + getBseatList().hashCode();
      }
      if (getWlangCount() > 0) {
        hash = (37 * hash) + WLANG_FIELD_NUMBER;
        hash = (53 * hash) + getWlangList().hashCode();
      }
      if (getWlangbCount() > 0) {
        hash = (37 * hash) + WLANGB_FIELD_NUMBER;
        hash = (53 * hash) + getWlangbList().hashCode();
      }
      if (hasSource()) {
        hash = (37 * hash) + SOURCE_FIELD_NUMBER;
        hash = (53 * hash) + getSource().hashCode();
      }
      switch (distributionchannelOneofCase_) {
        case 3:
          hash = (37 * hash) + SITE_FIELD_NUMBER;
          hash = (53 * hash) + getSite().hashCode();
          break;
        case 4:
          hash = (37 * hash) + APP_FIELD_NUMBER;
          hash = (53 * hash) + getApp().hashCode();
          break;
        case 22:
          hash = (37 * hash) + DOOH_FIELD_NUMBER;
          hash = (53 * hash) + getDooh().hashCode();
          break;
        case 0:
        default:
      }
      hash = hashFields(hash, getExtensionFields());
      hash = (29 * hash) + unknownFields.hashCode();
      memoizedHashCode = hash;
      return hash;
    }

    public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest 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.iabtechlab.openrtb.v2.OpenRtb.BidRequest 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>
     * OpenRTB 2.0: The top-level bid request object contains a globally unique
     * bid request or auction ID. This id attribute is required as is at least one
     * impression object (Section 3.2.2). Other attributes in this top-level object
     * establish rules and restrictions that apply to all impressions being offered.
     * There are also several subordinate objects that provide detailed data to
     * potential buyers. Among these are the Site and App objects, which describe
     * the type of published media in which the impression(s) appear.
     * These objects are highly recommended, but only one applies to a given
     * bid request depending on whether the media is browser-based web content
     * or a non-browser application, respectively.
     * </pre>
     *
     * Protobuf type {@code com.iabtechlab.openrtb.v2.BidRequest}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest, Builder> implements
        // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.BidRequest)
        com.iabtechlab.openrtb.v2.OpenRtb.BidRequestOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.class, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Builder.class);
      }

      // Construct using com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
          getImpFieldBuilder();
          getDeviceFieldBuilder();
          getRegsFieldBuilder();
          getUserFieldBuilder();
          getSourceFieldBuilder();
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        id_ = "";
        bitField0_ = (bitField0_ & ~0x00000001);
        if (impBuilder_ == null) {
          imp_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000002);
        } else {
          impBuilder_.clear();
        }
        if (deviceBuilder_ == null) {
          device_ = null;
        } else {
          deviceBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000020);
        if (regsBuilder_ == null) {
          regs_ = null;
        } else {
          regsBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000040);
        if (userBuilder_ == null) {
          user_ = null;
        } else {
          userBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000080);
        at_ = 2;
        bitField0_ = (bitField0_ & ~0x00000100);
        tmax_ = 0;
        bitField0_ = (bitField0_ & ~0x00000200);
        wseat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        bitField0_ = (bitField0_ & ~0x00000400);
        allimps_ = false;
        bitField0_ = (bitField0_ & ~0x00000800);
        cur_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        bitField0_ = (bitField0_ & ~0x00001000);
        bcat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        bitField0_ = (bitField0_ & ~0x00002000);
        cattax_ = 1;
        bitField0_ = (bitField0_ & ~0x00004000);
        badv_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        bitField0_ = (bitField0_ & ~0x00008000);
        bapp_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        bitField0_ = (bitField0_ & ~0x00010000);
        test_ = false;
        bitField0_ = (bitField0_ & ~0x00020000);
        bseat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        bitField0_ = (bitField0_ & ~0x00040000);
        wlang_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        bitField0_ = (bitField0_ & ~0x00080000);
        wlangb_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        bitField0_ = (bitField0_ & ~0x00100000);
        if (sourceBuilder_ == null) {
          source_ = null;
        } else {
          sourceBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00200000);
        distributionchannelOneofCase_ = 0;
        distributionchannelOneof_ = null;
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidRequest_descriptor;
      }

      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest getDefaultInstanceForType() {
        return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.getDefaultInstance();
      }

      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest build() {
        com.iabtechlab.openrtb.v2.OpenRtb.BidRequest result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest buildPartial() {
        com.iabtechlab.openrtb.v2.OpenRtb.BidRequest result = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) != 0)) {
          to_bitField0_ |= 0x00000001;
        }
        result.id_ = id_;
        if (impBuilder_ == null) {
          if (((bitField0_ & 0x00000002) != 0)) {
            imp_ = java.util.Collections.unmodifiableList(imp_);
            bitField0_ = (bitField0_ & ~0x00000002);
          }
          result.imp_ = imp_;
        } else {
          result.imp_ = impBuilder_.build();
        }
        if (distributionchannelOneofCase_ == 3) {
          if (siteBuilder_ == null) {
            result.distributionchannelOneof_ = distributionchannelOneof_;
          } else {
            result.distributionchannelOneof_ = siteBuilder_.build();
          }
        }
        if (distributionchannelOneofCase_ == 4) {
          if (appBuilder_ == null) {
            result.distributionchannelOneof_ = distributionchannelOneof_;
          } else {
            result.distributionchannelOneof_ = appBuilder_.build();
          }
        }
        if (distributionchannelOneofCase_ == 22) {
          if (doohBuilder_ == null) {
            result.distributionchannelOneof_ = distributionchannelOneof_;
          } else {
            result.distributionchannelOneof_ = doohBuilder_.build();
          }
        }
        if (((from_bitField0_ & 0x00000020) != 0)) {
          if (deviceBuilder_ == null) {
            result.device_ = device_;
          } else {
            result.device_ = deviceBuilder_.build();
          }
          to_bitField0_ |= 0x00000010;
        }
        if (((from_bitField0_ & 0x00000040) != 0)) {
          if (regsBuilder_ == null) {
            result.regs_ = regs_;
          } else {
            result.regs_ = regsBuilder_.build();
          }
          to_bitField0_ |= 0x00000020;
        }
        if (((from_bitField0_ & 0x00000080) != 0)) {
          if (userBuilder_ == null) {
            result.user_ = user_;
          } else {
            result.user_ = userBuilder_.build();
          }
          to_bitField0_ |= 0x00000040;
        }
        if (((from_bitField0_ & 0x00000100) != 0)) {
          to_bitField0_ |= 0x00000080;
        }
        result.at_ = at_;
        if (((from_bitField0_ & 0x00000200) != 0)) {
          result.tmax_ = tmax_;
          to_bitField0_ |= 0x00000100;
        }
        if (((bitField0_ & 0x00000400) != 0)) {
          wseat_ = wseat_.getUnmodifiableView();
          bitField0_ = (bitField0_ & ~0x00000400);
        }
        result.wseat_ = wseat_;
        if (((from_bitField0_ & 0x00000800) != 0)) {
          result.allimps_ = allimps_;
          to_bitField0_ |= 0x00000200;
        }
        if (((bitField0_ & 0x00001000) != 0)) {
          cur_ = cur_.getUnmodifiableView();
          bitField0_ = (bitField0_ & ~0x00001000);
        }
        result.cur_ = cur_;
        if (((bitField0_ & 0x00002000) != 0)) {
          bcat_ = bcat_.getUnmodifiableView();
          bitField0_ = (bitField0_ & ~0x00002000);
        }
        result.bcat_ = bcat_;
        if (((from_bitField0_ & 0x00004000) != 0)) {
          to_bitField0_ |= 0x00000400;
        }
        result.cattax_ = cattax_;
        if (((bitField0_ & 0x00008000) != 0)) {
          badv_ = badv_.getUnmodifiableView();
          bitField0_ = (bitField0_ & ~0x00008000);
        }
        result.badv_ = badv_;
        if (((bitField0_ & 0x00010000) != 0)) {
          bapp_ = bapp_.getUnmodifiableView();
          bitField0_ = (bitField0_ & ~0x00010000);
        }
        result.bapp_ = bapp_;
        if (((from_bitField0_ & 0x00020000) != 0)) {
          result.test_ = test_;
          to_bitField0_ |= 0x00000800;
        }
        if (((bitField0_ & 0x00040000) != 0)) {
          bseat_ = bseat_.getUnmodifiableView();
          bitField0_ = (bitField0_ & ~0x00040000);
        }
        result.bseat_ = bseat_;
        if (((bitField0_ & 0x00080000) != 0)) {
          wlang_ = wlang_.getUnmodifiableView();
          bitField0_ = (bitField0_ & ~0x00080000);
        }
        result.wlang_ = wlang_;
        if (((bitField0_ & 0x00100000) != 0)) {
          wlangb_ = wlangb_.getUnmodifiableView();
          bitField0_ = (bitField0_ & ~0x00100000);
        }
        result.wlangb_ = wlangb_;
        if (((from_bitField0_ & 0x00200000) != 0)) {
          if (sourceBuilder_ == null) {
            result.source_ = source_;
          } else {
            result.source_ = sourceBuilder_.build();
          }
          to_bitField0_ |= 0x00001000;
        }
        result.bitField0_ = to_bitField0_;
        result.distributionchannelOneofCase_ = distributionchannelOneofCase_;
        onBuilt();
        return result;
      }

      @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 <Type> Builder setExtension(
          com.google.protobuf.GeneratedMessage.GeneratedExtension<
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest, Type> extension,
          Type value) {
        return super.setExtension(extension, value);
      }
      @java.lang.Override
      public <Type> Builder setExtension(
          com.google.protobuf.GeneratedMessage.GeneratedExtension<
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest, java.util.List<Type>> extension,
          int index, Type value) {
        return super.setExtension(extension, index, value);
      }
      @java.lang.Override
      public <Type> Builder addExtension(
          com.google.protobuf.GeneratedMessage.GeneratedExtension<
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest, java.util.List<Type>> extension,
          Type value) {
        return super.addExtension(extension, value);
      }
      @java.lang.Override
      public <Type> Builder clearExtension(
          com.google.protobuf.GeneratedMessage.GeneratedExtension<
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest, ?> extension) {
        return super.clearExtension(extension);
      }
      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.BidRequest) {
          return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.BidRequest)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest other) {
        if (other == com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.getDefaultInstance()) return this;
        if (other.hasId()) {
          bitField0_ |= 0x00000001;
          id_ = other.id_;
          onChanged();
        }
        if (impBuilder_ == null) {
          if (!other.imp_.isEmpty()) {
            if (imp_.isEmpty()) {
              imp_ = other.imp_;
              bitField0_ = (bitField0_ & ~0x00000002);
            } else {
              ensureImpIsMutable();
              imp_.addAll(other.imp_);
            }
            onChanged();
          }
        } else {
          if (!other.imp_.isEmpty()) {
            if (impBuilder_.isEmpty()) {
              impBuilder_.dispose();
              impBuilder_ = null;
              imp_ = other.imp_;
              bitField0_ = (bitField0_ & ~0x00000002);
              impBuilder_ = 
                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
                   getImpFieldBuilder() : null;
            } else {
              impBuilder_.addAllMessages(other.imp_);
            }
          }
        }
        if (other.hasDevice()) {
          mergeDevice(other.getDevice());
        }
        if (other.hasRegs()) {
          mergeRegs(other.getRegs());
        }
        if (other.hasUser()) {
          mergeUser(other.getUser());
        }
        if (other.hasAt()) {
          setAt(other.getAt());
        }
        if (other.hasTmax()) {
          setTmax(other.getTmax());
        }
        if (!other.wseat_.isEmpty()) {
          if (wseat_.isEmpty()) {
            wseat_ = other.wseat_;
            bitField0_ = (bitField0_ & ~0x00000400);
          } else {
            ensureWseatIsMutable();
            wseat_.addAll(other.wseat_);
          }
          onChanged();
        }
        if (other.hasAllimps()) {
          setAllimps(other.getAllimps());
        }
        if (!other.cur_.isEmpty()) {
          if (cur_.isEmpty()) {
            cur_ = other.cur_;
            bitField0_ = (bitField0_ & ~0x00001000);
          } else {
            ensureCurIsMutable();
            cur_.addAll(other.cur_);
          }
          onChanged();
        }
        if (!other.bcat_.isEmpty()) {
          if (bcat_.isEmpty()) {
            bcat_ = other.bcat_;
            bitField0_ = (bitField0_ & ~0x00002000);
          } else {
            ensureBcatIsMutable();
            bcat_.addAll(other.bcat_);
          }
          onChanged();
        }
        if (other.hasCattax()) {
          setCattax(other.getCattax());
        }
        if (!other.badv_.isEmpty()) {
          if (badv_.isEmpty()) {
            badv_ = other.badv_;
            bitField0_ = (bitField0_ & ~0x00008000);
          } else {
            ensureBadvIsMutable();
            badv_.addAll(other.badv_);
          }
          onChanged();
        }
        if (!other.bapp_.isEmpty()) {
          if (bapp_.isEmpty()) {
            bapp_ = other.bapp_;
            bitField0_ = (bitField0_ & ~0x00010000);
          } else {
            ensureBappIsMutable();
            bapp_.addAll(other.bapp_);
          }
          onChanged();
        }
        if (other.hasTest()) {
          setTest(other.getTest());
        }
        if (!other.bseat_.isEmpty()) {
          if (bseat_.isEmpty()) {
            bseat_ = other.bseat_;
            bitField0_ = (bitField0_ & ~0x00040000);
          } else {
            ensureBseatIsMutable();
            bseat_.addAll(other.bseat_);
          }
          onChanged();
        }
        if (!other.wlang_.isEmpty()) {
          if (wlang_.isEmpty()) {
            wlang_ = other.wlang_;
            bitField0_ = (bitField0_ & ~0x00080000);
          } else {
            ensureWlangIsMutable();
            wlang_.addAll(other.wlang_);
          }
          onChanged();
        }
        if (!other.wlangb_.isEmpty()) {
          if (wlangb_.isEmpty()) {
            wlangb_ = other.wlangb_;
            bitField0_ = (bitField0_ & ~0x00100000);
          } else {
            ensureWlangbIsMutable();
            wlangb_.addAll(other.wlangb_);
          }
          onChanged();
        }
        if (other.hasSource()) {
          mergeSource(other.getSource());
        }
        switch (other.getDistributionchannelOneofCase()) {
          case SITE: {
            mergeSite(other.getSite());
            break;
          }
          case APP: {
            mergeApp(other.getApp());
            break;
          }
          case DOOH: {
            mergeDooh(other.getDooh());
            break;
          }
          case DISTRIBUTIONCHANNELONEOF_NOT_SET: {
            break;
          }
        }
        this.mergeExtensionFields(other);
        this.mergeUnknownFields(other.unknownFields);
        onChanged();
        return this;
      }

      @java.lang.Override
      public final boolean isInitialized() {
        if (!hasId()) {
          return false;
        }
        for (int i = 0; i < getImpCount(); i++) {
          if (!getImp(i).isInitialized()) {
            return false;
          }
        }
        if (hasSite()) {
          if (!getSite().isInitialized()) {
            return false;
          }
        }
        if (hasApp()) {
          if (!getApp().isInitialized()) {
            return false;
          }
        }
        if (hasDooh()) {
          if (!getDooh().isInitialized()) {
            return false;
          }
        }
        if (hasDevice()) {
          if (!getDevice().isInitialized()) {
            return false;
          }
        }
        if (hasRegs()) {
          if (!getRegs().isInitialized()) {
            return false;
          }
        }
        if (hasUser()) {
          if (!getUser().isInitialized()) {
            return false;
          }
        }
        if (hasSource()) {
          if (!getSource().isInitialized()) {
            return false;
          }
        }
        if (!extensionsAreInitialized()) {
          return false;
        }
        return true;
      }

      @java.lang.Override
      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.iabtechlab.openrtb.v2.OpenRtb.BidRequest parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest) e.getUnfinishedMessage();
          throw e.unwrapIOException();
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int distributionchannelOneofCase_ = 0;
      private java.lang.Object distributionchannelOneof_;
      public DistributionchannelOneofCase
          getDistributionchannelOneofCase() {
        return DistributionchannelOneofCase.forNumber(
            distributionchannelOneofCase_);
      }

      public Builder clearDistributionchannelOneof() {
        distributionchannelOneofCase_ = 0;
        distributionchannelOneof_ = null;
        onChanged();
        return this;
      }

      private int bitField0_;

      private java.lang.Object id_ = "";
      /**
       * <pre>
       * Unique ID of the bid request, provided by the exchange.
       * REQUIRED by the OpenRTB specification.
       * </pre>
       *
       * <code>required string id = 1;</code>
       * @return Whether the id field is set.
       */
      public boolean hasId() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <pre>
       * Unique ID of the bid request, provided by the exchange.
       * REQUIRED by the OpenRTB specification.
       * </pre>
       *
       * <code>required string id = 1;</code>
       * @return The id.
       */
      public java.lang.String getId() {
        java.lang.Object ref = id_;
        if (!(ref instanceof java.lang.String)) {
          com.google.protobuf.ByteString bs =
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            id_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * Unique ID of the bid request, provided by the exchange.
       * REQUIRED by the OpenRTB specification.
       * </pre>
       *
       * <code>required string id = 1;</code>
       * @return The bytes for id.
       */
      public com.google.protobuf.ByteString
          getIdBytes() {
        java.lang.Object ref = id_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          id_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * Unique ID of the bid request, provided by the exchange.
       * REQUIRED by the OpenRTB specification.
       * </pre>
       *
       * <code>required string id = 1;</code>
       * @param value The id to set.
       * @return This builder for chaining.
       */
      public Builder setId(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
        id_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Unique ID of the bid request, provided by the exchange.
       * REQUIRED by the OpenRTB specification.
       * </pre>
       *
       * <code>required string id = 1;</code>
       * @return This builder for chaining.
       */
      public Builder clearId() {
        bitField0_ = (bitField0_ & ~0x00000001);
        id_ = getDefaultInstance().getId();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Unique ID of the bid request, provided by the exchange.
       * REQUIRED by the OpenRTB specification.
       * </pre>
       *
       * <code>required string id = 1;</code>
       * @param value The bytes for id to set.
       * @return This builder for chaining.
       */
      public Builder setIdBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
        id_ = value;
        onChanged();
        return this;
      }

      private java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp> imp_ =
        java.util.Collections.emptyList();
      private void ensureImpIsMutable() {
        if (!((bitField0_ & 0x00000002) != 0)) {
          imp_ = new java.util.ArrayList<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp>(imp_);
          bitField0_ |= 0x00000002;
         }
      }

      private com.google.protobuf.RepeatedFieldBuilderV3<
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.ImpOrBuilder> impBuilder_;

      /**
       * <pre>
       * Array of Imp objects (Section 3.2.2) representing the impressions offered.
       * At least 1 Imp object is required.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp imp = 2;</code>
       */
      public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp> getImpList() {
        if (impBuilder_ == null) {
          return java.util.Collections.unmodifiableList(imp_);
        } else {
          return impBuilder_.getMessageList();
        }
      }
      /**
       * <pre>
       * Array of Imp objects (Section 3.2.2) representing the impressions offered.
       * At least 1 Imp object is required.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp imp = 2;</code>
       */
      public int getImpCount() {
        if (impBuilder_ == null) {
          return imp_.size();
        } else {
          return impBuilder_.getCount();
        }
      }
      /**
       * <pre>
       * Array of Imp objects (Section 3.2.2) representing the impressions offered.
       * At least 1 Imp object is required.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp imp = 2;</code>
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp getImp(int index) {
        if (impBuilder_ == null) {
          return imp_.get(index);
        } else {
          return impBuilder_.getMessage(index);
        }
      }
      /**
       * <pre>
       * Array of Imp objects (Section 3.2.2) representing the impressions offered.
       * At least 1 Imp object is required.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp imp = 2;</code>
       */
      public Builder setImp(
          int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp value) {
        if (impBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureImpIsMutable();
          imp_.set(index, value);
          onChanged();
        } else {
          impBuilder_.setMessage(index, value);
        }
        return this;
      }
      /**
       * <pre>
       * Array of Imp objects (Section 3.2.2) representing the impressions offered.
       * At least 1 Imp object is required.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp imp = 2;</code>
       */
      public Builder setImp(
          int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Builder builderForValue) {
        if (impBuilder_ == null) {
          ensureImpIsMutable();
          imp_.set(index, builderForValue.build());
          onChanged();
        } else {
          impBuilder_.setMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * <pre>
       * Array of Imp objects (Section 3.2.2) representing the impressions offered.
       * At least 1 Imp object is required.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp imp = 2;</code>
       */
      public Builder addImp(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp value) {
        if (impBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureImpIsMutable();
          imp_.add(value);
          onChanged();
        } else {
          impBuilder_.addMessage(value);
        }
        return this;
      }
      /**
       * <pre>
       * Array of Imp objects (Section 3.2.2) representing the impressions offered.
       * At least 1 Imp object is required.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp imp = 2;</code>
       */
      public Builder addImp(
          int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp value) {
        if (impBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureImpIsMutable();
          imp_.add(index, value);
          onChanged();
        } else {
          impBuilder_.addMessage(index, value);
        }
        return this;
      }
      /**
       * <pre>
       * Array of Imp objects (Section 3.2.2) representing the impressions offered.
       * At least 1 Imp object is required.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp imp = 2;</code>
       */
      public Builder addImp(
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Builder builderForValue) {
        if (impBuilder_ == null) {
          ensureImpIsMutable();
          imp_.add(builderForValue.build());
          onChanged();
        } else {
          impBuilder_.addMessage(builderForValue.build());
        }
        return this;
      }
      /**
       * <pre>
       * Array of Imp objects (Section 3.2.2) representing the impressions offered.
       * At least 1 Imp object is required.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp imp = 2;</code>
       */
      public Builder addImp(
          int index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Builder builderForValue) {
        if (impBuilder_ == null) {
          ensureImpIsMutable();
          imp_.add(index, builderForValue.build());
          onChanged();
        } else {
          impBuilder_.addMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * <pre>
       * Array of Imp objects (Section 3.2.2) representing the impressions offered.
       * At least 1 Imp object is required.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp imp = 2;</code>
       */
      public Builder addAllImp(
          java.lang.Iterable<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp> values) {
        if (impBuilder_ == null) {
          ensureImpIsMutable();
          com.google.protobuf.AbstractMessageLite.Builder.addAll(
              values, imp_);
          onChanged();
        } else {
          impBuilder_.addAllMessages(values);
        }
        return this;
      }
      /**
       * <pre>
       * Array of Imp objects (Section 3.2.2) representing the impressions offered.
       * At least 1 Imp object is required.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp imp = 2;</code>
       */
      public Builder clearImp() {
        if (impBuilder_ == null) {
          imp_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000002);
          onChanged();
        } else {
          impBuilder_.clear();
        }
        return this;
      }
      /**
       * <pre>
       * Array of Imp objects (Section 3.2.2) representing the impressions offered.
       * At least 1 Imp object is required.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp imp = 2;</code>
       */
      public Builder removeImp(int index) {
        if (impBuilder_ == null) {
          ensureImpIsMutable();
          imp_.remove(index);
          onChanged();
        } else {
          impBuilder_.remove(index);
        }
        return this;
      }
      /**
       * <pre>
       * Array of Imp objects (Section 3.2.2) representing the impressions offered.
       * At least 1 Imp object is required.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp imp = 2;</code>
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Builder getImpBuilder(
          int index) {
        return getImpFieldBuilder().getBuilder(index);
      }
      /**
       * <pre>
       * Array of Imp objects (Section 3.2.2) representing the impressions offered.
       * At least 1 Imp object is required.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp imp = 2;</code>
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.ImpOrBuilder getImpOrBuilder(
          int index) {
        if (impBuilder_ == null) {
          return imp_.get(index);  } else {
          return impBuilder_.getMessageOrBuilder(index);
        }
      }
      /**
       * <pre>
       * Array of Imp objects (Section 3.2.2) representing the impressions offered.
       * At least 1 Imp object is required.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp imp = 2;</code>
       */
      public java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.ImpOrBuilder> 
           getImpOrBuilderList() {
        if (impBuilder_ != null) {
          return impBuilder_.getMessageOrBuilderList();
        } else {
          return java.util.Collections.unmodifiableList(imp_);
        }
      }
      /**
       * <pre>
       * Array of Imp objects (Section 3.2.2) representing the impressions offered.
       * At least 1 Imp object is required.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp imp = 2;</code>
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Builder addImpBuilder() {
        return getImpFieldBuilder().addBuilder(
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.getDefaultInstance());
      }
      /**
       * <pre>
       * Array of Imp objects (Section 3.2.2) representing the impressions offered.
       * At least 1 Imp object is required.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp imp = 2;</code>
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Builder addImpBuilder(
          int index) {
        return getImpFieldBuilder().addBuilder(
            index, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.getDefaultInstance());
      }
      /**
       * <pre>
       * Array of Imp objects (Section 3.2.2) representing the impressions offered.
       * At least 1 Imp object is required.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidRequest.Imp imp = 2;</code>
       */
      public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Builder> 
           getImpBuilderList() {
        return getImpFieldBuilder().getBuilderList();
      }
      private com.google.protobuf.RepeatedFieldBuilderV3<
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.ImpOrBuilder> 
          getImpFieldBuilder() {
        if (impBuilder_ == null) {
          impBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.ImpOrBuilder>(
                  imp_,
                  ((bitField0_ & 0x00000002) != 0),
                  getParentForChildren(),
                  isClean());
          imp_ = null;
        }
        return impBuilder_;
      }

      private com.google.protobuf.SingleFieldBuilderV3<
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.SiteOrBuilder> siteBuilder_;
      /**
       * <pre>
       * Details via a Site object (Section 3.2.6) about the publisher's website.
       * Only applicable and recommended for websites.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.BidRequest.Site site = 3;</code>
       * @return Whether the site field is set.
       */
      @java.lang.Override
      public boolean hasSite() {
        return distributionchannelOneofCase_ == 3;
      }
      /**
       * <pre>
       * Details via a Site object (Section 3.2.6) about the publisher's website.
       * Only applicable and recommended for websites.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.BidRequest.Site site = 3;</code>
       * @return The site.
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site getSite() {
        if (siteBuilder_ == null) {
          if (distributionchannelOneofCase_ == 3) {
            return (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site) distributionchannelOneof_;
          }
          return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site.getDefaultInstance();
        } else {
          if (distributionchannelOneofCase_ == 3) {
            return siteBuilder_.getMessage();
          }
          return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site.getDefaultInstance();
        }
      }
      /**
       * <pre>
       * Details via a Site object (Section 3.2.6) about the publisher's website.
       * Only applicable and recommended for websites.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.BidRequest.Site site = 3;</code>
       */
      public Builder setSite(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site value) {
        if (siteBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          distributionchannelOneof_ = value;
          onChanged();
        } else {
          siteBuilder_.setMessage(value);
        }
        distributionchannelOneofCase_ = 3;
        return this;
      }
      /**
       * <pre>
       * Details via a Site object (Section 3.2.6) about the publisher's website.
       * Only applicable and recommended for websites.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.BidRequest.Site site = 3;</code>
       */
      public Builder setSite(
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site.Builder builderForValue) {
        if (siteBuilder_ == null) {
          distributionchannelOneof_ = builderForValue.build();
          onChanged();
        } else {
          siteBuilder_.setMessage(builderForValue.build());
        }
        distributionchannelOneofCase_ = 3;
        return this;
      }
      /**
       * <pre>
       * Details via a Site object (Section 3.2.6) about the publisher's website.
       * Only applicable and recommended for websites.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.BidRequest.Site site = 3;</code>
       */
      public Builder mergeSite(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site value) {
        if (siteBuilder_ == null) {
          if (distributionchannelOneofCase_ == 3 &&
              distributionchannelOneof_ != com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site.getDefaultInstance()) {
            distributionchannelOneof_ = com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site.newBuilder((com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site) distributionchannelOneof_)
                .mergeFrom(value).buildPartial();
          } else {
            distributionchannelOneof_ = value;
          }
          onChanged();
        } else {
          if (distributionchannelOneofCase_ == 3) {
            siteBuilder_.mergeFrom(value);
          }
          siteBuilder_.setMessage(value);
        }
        distributionchannelOneofCase_ = 3;
        return this;
      }
      /**
       * <pre>
       * Details via a Site object (Section 3.2.6) about the publisher's website.
       * Only applicable and recommended for websites.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.BidRequest.Site site = 3;</code>
       */
      public Builder clearSite() {
        if (siteBuilder_ == null) {
          if (distributionchannelOneofCase_ == 3) {
            distributionchannelOneofCase_ = 0;
            distributionchannelOneof_ = null;
            onChanged();
          }
        } else {
          if (distributionchannelOneofCase_ == 3) {
            distributionchannelOneofCase_ = 0;
            distributionchannelOneof_ = null;
          }
          siteBuilder_.clear();
        }
        return this;
      }
      /**
       * <pre>
       * Details via a Site object (Section 3.2.6) about the publisher's website.
       * Only applicable and recommended for websites.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.BidRequest.Site site = 3;</code>
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site.Builder getSiteBuilder() {
        return getSiteFieldBuilder().getBuilder();
      }
      /**
       * <pre>
       * Details via a Site object (Section 3.2.6) about the publisher's website.
       * Only applicable and recommended for websites.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.BidRequest.Site site = 3;</code>
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.SiteOrBuilder getSiteOrBuilder() {
        if ((distributionchannelOneofCase_ == 3) && (siteBuilder_ != null)) {
          return siteBuilder_.getMessageOrBuilder();
        } else {
          if (distributionchannelOneofCase_ == 3) {
            return (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site) distributionchannelOneof_;
          }
          return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site.getDefaultInstance();
        }
      }
      /**
       * <pre>
       * Details via a Site object (Section 3.2.6) about the publisher's website.
       * Only applicable and recommended for websites.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.BidRequest.Site site = 3;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.SiteOrBuilder> 
          getSiteFieldBuilder() {
        if (siteBuilder_ == null) {
          if (!(distributionchannelOneofCase_ == 3)) {
            distributionchannelOneof_ = com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site.getDefaultInstance();
          }
          siteBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.SiteOrBuilder>(
                  (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Site) distributionchannelOneof_,
                  getParentForChildren(),
                  isClean());
          distributionchannelOneof_ = null;
        }
        distributionchannelOneofCase_ = 3;
        onChanged();;
        return siteBuilder_;
      }

      private com.google.protobuf.SingleFieldBuilderV3<
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.AppOrBuilder> appBuilder_;
      /**
       * <pre>
       * Details via an App object (Section 3.2.7) about the publisher's app
       * (non-browser applications). Only applicable and recommended for apps.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.BidRequest.App app = 4;</code>
       * @return Whether the app field is set.
       */
      @java.lang.Override
      public boolean hasApp() {
        return distributionchannelOneofCase_ == 4;
      }
      /**
       * <pre>
       * Details via an App object (Section 3.2.7) about the publisher's app
       * (non-browser applications). Only applicable and recommended for apps.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.BidRequest.App app = 4;</code>
       * @return The app.
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App getApp() {
        if (appBuilder_ == null) {
          if (distributionchannelOneofCase_ == 4) {
            return (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App) distributionchannelOneof_;
          }
          return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App.getDefaultInstance();
        } else {
          if (distributionchannelOneofCase_ == 4) {
            return appBuilder_.getMessage();
          }
          return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App.getDefaultInstance();
        }
      }
      /**
       * <pre>
       * Details via an App object (Section 3.2.7) about the publisher's app
       * (non-browser applications). Only applicable and recommended for apps.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.BidRequest.App app = 4;</code>
       */
      public Builder setApp(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App value) {
        if (appBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          distributionchannelOneof_ = value;
          onChanged();
        } else {
          appBuilder_.setMessage(value);
        }
        distributionchannelOneofCase_ = 4;
        return this;
      }
      /**
       * <pre>
       * Details via an App object (Section 3.2.7) about the publisher's app
       * (non-browser applications). Only applicable and recommended for apps.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.BidRequest.App app = 4;</code>
       */
      public Builder setApp(
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App.Builder builderForValue) {
        if (appBuilder_ == null) {
          distributionchannelOneof_ = builderForValue.build();
          onChanged();
        } else {
          appBuilder_.setMessage(builderForValue.build());
        }
        distributionchannelOneofCase_ = 4;
        return this;
      }
      /**
       * <pre>
       * Details via an App object (Section 3.2.7) about the publisher's app
       * (non-browser applications). Only applicable and recommended for apps.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.BidRequest.App app = 4;</code>
       */
      public Builder mergeApp(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App value) {
        if (appBuilder_ == null) {
          if (distributionchannelOneofCase_ == 4 &&
              distributionchannelOneof_ != com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App.getDefaultInstance()) {
            distributionchannelOneof_ = com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App.newBuilder((com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App) distributionchannelOneof_)
                .mergeFrom(value).buildPartial();
          } else {
            distributionchannelOneof_ = value;
          }
          onChanged();
        } else {
          if (distributionchannelOneofCase_ == 4) {
            appBuilder_.mergeFrom(value);
          }
          appBuilder_.setMessage(value);
        }
        distributionchannelOneofCase_ = 4;
        return this;
      }
      /**
       * <pre>
       * Details via an App object (Section 3.2.7) about the publisher's app
       * (non-browser applications). Only applicable and recommended for apps.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.BidRequest.App app = 4;</code>
       */
      public Builder clearApp() {
        if (appBuilder_ == null) {
          if (distributionchannelOneofCase_ == 4) {
            distributionchannelOneofCase_ = 0;
            distributionchannelOneof_ = null;
            onChanged();
          }
        } else {
          if (distributionchannelOneofCase_ == 4) {
            distributionchannelOneofCase_ = 0;
            distributionchannelOneof_ = null;
          }
          appBuilder_.clear();
        }
        return this;
      }
      /**
       * <pre>
       * Details via an App object (Section 3.2.7) about the publisher's app
       * (non-browser applications). Only applicable and recommended for apps.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.BidRequest.App app = 4;</code>
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App.Builder getAppBuilder() {
        return getAppFieldBuilder().getBuilder();
      }
      /**
       * <pre>
       * Details via an App object (Section 3.2.7) about the publisher's app
       * (non-browser applications). Only applicable and recommended for apps.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.BidRequest.App app = 4;</code>
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.AppOrBuilder getAppOrBuilder() {
        if ((distributionchannelOneofCase_ == 4) && (appBuilder_ != null)) {
          return appBuilder_.getMessageOrBuilder();
        } else {
          if (distributionchannelOneofCase_ == 4) {
            return (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App) distributionchannelOneof_;
          }
          return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App.getDefaultInstance();
        }
      }
      /**
       * <pre>
       * Details via an App object (Section 3.2.7) about the publisher's app
       * (non-browser applications). Only applicable and recommended for apps.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.BidRequest.App app = 4;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.AppOrBuilder> 
          getAppFieldBuilder() {
        if (appBuilder_ == null) {
          if (!(distributionchannelOneofCase_ == 4)) {
            distributionchannelOneof_ = com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App.getDefaultInstance();
          }
          appBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.AppOrBuilder>(
                  (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.App) distributionchannelOneof_,
                  getParentForChildren(),
                  isClean());
          distributionchannelOneof_ = null;
        }
        distributionchannelOneofCase_ = 4;
        onChanged();;
        return appBuilder_;
      }

      private com.google.protobuf.SingleFieldBuilderV3<
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.DoohOrBuilder> doohBuilder_;
      /**
       * <pre>
       * This object should be included if the ad supported content is a Digital
       * Out-Of-Home screen. A bid request with a DOOH object must not contain a
       * site or app object.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.BidRequest.Dooh dooh = 22;</code>
       * @return Whether the dooh field is set.
       */
      @java.lang.Override
      public boolean hasDooh() {
        return distributionchannelOneofCase_ == 22;
      }
      /**
       * <pre>
       * This object should be included if the ad supported content is a Digital
       * Out-Of-Home screen. A bid request with a DOOH object must not contain a
       * site or app object.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.BidRequest.Dooh dooh = 22;</code>
       * @return The dooh.
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh getDooh() {
        if (doohBuilder_ == null) {
          if (distributionchannelOneofCase_ == 22) {
            return (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh) distributionchannelOneof_;
          }
          return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh.getDefaultInstance();
        } else {
          if (distributionchannelOneofCase_ == 22) {
            return doohBuilder_.getMessage();
          }
          return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh.getDefaultInstance();
        }
      }
      /**
       * <pre>
       * This object should be included if the ad supported content is a Digital
       * Out-Of-Home screen. A bid request with a DOOH object must not contain a
       * site or app object.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.BidRequest.Dooh dooh = 22;</code>
       */
      public Builder setDooh(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh value) {
        if (doohBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          distributionchannelOneof_ = value;
          onChanged();
        } else {
          doohBuilder_.setMessage(value);
        }
        distributionchannelOneofCase_ = 22;
        return this;
      }
      /**
       * <pre>
       * This object should be included if the ad supported content is a Digital
       * Out-Of-Home screen. A bid request with a DOOH object must not contain a
       * site or app object.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.BidRequest.Dooh dooh = 22;</code>
       */
      public Builder setDooh(
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh.Builder builderForValue) {
        if (doohBuilder_ == null) {
          distributionchannelOneof_ = builderForValue.build();
          onChanged();
        } else {
          doohBuilder_.setMessage(builderForValue.build());
        }
        distributionchannelOneofCase_ = 22;
        return this;
      }
      /**
       * <pre>
       * This object should be included if the ad supported content is a Digital
       * Out-Of-Home screen. A bid request with a DOOH object must not contain a
       * site or app object.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.BidRequest.Dooh dooh = 22;</code>
       */
      public Builder mergeDooh(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh value) {
        if (doohBuilder_ == null) {
          if (distributionchannelOneofCase_ == 22 &&
              distributionchannelOneof_ != com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh.getDefaultInstance()) {
            distributionchannelOneof_ = com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh.newBuilder((com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh) distributionchannelOneof_)
                .mergeFrom(value).buildPartial();
          } else {
            distributionchannelOneof_ = value;
          }
          onChanged();
        } else {
          if (distributionchannelOneofCase_ == 22) {
            doohBuilder_.mergeFrom(value);
          }
          doohBuilder_.setMessage(value);
        }
        distributionchannelOneofCase_ = 22;
        return this;
      }
      /**
       * <pre>
       * This object should be included if the ad supported content is a Digital
       * Out-Of-Home screen. A bid request with a DOOH object must not contain a
       * site or app object.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.BidRequest.Dooh dooh = 22;</code>
       */
      public Builder clearDooh() {
        if (doohBuilder_ == null) {
          if (distributionchannelOneofCase_ == 22) {
            distributionchannelOneofCase_ = 0;
            distributionchannelOneof_ = null;
            onChanged();
          }
        } else {
          if (distributionchannelOneofCase_ == 22) {
            distributionchannelOneofCase_ = 0;
            distributionchannelOneof_ = null;
          }
          doohBuilder_.clear();
        }
        return this;
      }
      /**
       * <pre>
       * This object should be included if the ad supported content is a Digital
       * Out-Of-Home screen. A bid request with a DOOH object must not contain a
       * site or app object.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.BidRequest.Dooh dooh = 22;</code>
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh.Builder getDoohBuilder() {
        return getDoohFieldBuilder().getBuilder();
      }
      /**
       * <pre>
       * This object should be included if the ad supported content is a Digital
       * Out-Of-Home screen. A bid request with a DOOH object must not contain a
       * site or app object.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.BidRequest.Dooh dooh = 22;</code>
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.DoohOrBuilder getDoohOrBuilder() {
        if ((distributionchannelOneofCase_ == 22) && (doohBuilder_ != null)) {
          return doohBuilder_.getMessageOrBuilder();
        } else {
          if (distributionchannelOneofCase_ == 22) {
            return (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh) distributionchannelOneof_;
          }
          return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh.getDefaultInstance();
        }
      }
      /**
       * <pre>
       * This object should be included if the ad supported content is a Digital
       * Out-Of-Home screen. A bid request with a DOOH object must not contain a
       * site or app object.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.BidRequest.Dooh dooh = 22;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.DoohOrBuilder> 
          getDoohFieldBuilder() {
        if (doohBuilder_ == null) {
          if (!(distributionchannelOneofCase_ == 22)) {
            distributionchannelOneof_ = com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh.getDefaultInstance();
          }
          doohBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.DoohOrBuilder>(
                  (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Dooh) distributionchannelOneof_,
                  getParentForChildren(),
                  isClean());
          distributionchannelOneof_ = null;
        }
        distributionchannelOneofCase_ = 22;
        onChanged();;
        return doohBuilder_;
      }

      private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device device_;
      private com.google.protobuf.SingleFieldBuilderV3<
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.DeviceOrBuilder> deviceBuilder_;
      /**
       * <pre>
       * Details via a Device object (Section 3.2.11) about the user's
       * device to which the impression will be delivered.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Device device = 5;</code>
       * @return Whether the device field is set.
       */
      public boolean hasDevice() {
        return ((bitField0_ & 0x00000020) != 0);
      }
      /**
       * <pre>
       * Details via a Device object (Section 3.2.11) about the user's
       * device to which the impression will be delivered.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Device device = 5;</code>
       * @return The device.
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device getDevice() {
        if (deviceBuilder_ == null) {
          return device_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device.getDefaultInstance() : device_;
        } else {
          return deviceBuilder_.getMessage();
        }
      }
      /**
       * <pre>
       * Details via a Device object (Section 3.2.11) about the user's
       * device to which the impression will be delivered.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Device device = 5;</code>
       */
      public Builder setDevice(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device value) {
        if (deviceBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          device_ = value;
          onChanged();
        } else {
          deviceBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000020;
        return this;
      }
      /**
       * <pre>
       * Details via a Device object (Section 3.2.11) about the user's
       * device to which the impression will be delivered.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Device device = 5;</code>
       */
      public Builder setDevice(
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device.Builder builderForValue) {
        if (deviceBuilder_ == null) {
          device_ = builderForValue.build();
          onChanged();
        } else {
          deviceBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000020;
        return this;
      }
      /**
       * <pre>
       * Details via a Device object (Section 3.2.11) about the user's
       * device to which the impression will be delivered.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Device device = 5;</code>
       */
      public Builder mergeDevice(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device value) {
        if (deviceBuilder_ == null) {
          if (((bitField0_ & 0x00000020) != 0) &&
              device_ != null &&
              device_ != com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device.getDefaultInstance()) {
            device_ =
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device.newBuilder(device_).mergeFrom(value).buildPartial();
          } else {
            device_ = value;
          }
          onChanged();
        } else {
          deviceBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000020;
        return this;
      }
      /**
       * <pre>
       * Details via a Device object (Section 3.2.11) about the user's
       * device to which the impression will be delivered.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Device device = 5;</code>
       */
      public Builder clearDevice() {
        if (deviceBuilder_ == null) {
          device_ = null;
          onChanged();
        } else {
          deviceBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000020);
        return this;
      }
      /**
       * <pre>
       * Details via a Device object (Section 3.2.11) about the user's
       * device to which the impression will be delivered.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Device device = 5;</code>
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device.Builder getDeviceBuilder() {
        bitField0_ |= 0x00000020;
        onChanged();
        return getDeviceFieldBuilder().getBuilder();
      }
      /**
       * <pre>
       * Details via a Device object (Section 3.2.11) about the user's
       * device to which the impression will be delivered.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Device device = 5;</code>
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.DeviceOrBuilder getDeviceOrBuilder() {
        if (deviceBuilder_ != null) {
          return deviceBuilder_.getMessageOrBuilder();
        } else {
          return device_ == null ?
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device.getDefaultInstance() : device_;
        }
      }
      /**
       * <pre>
       * Details via a Device object (Section 3.2.11) about the user's
       * device to which the impression will be delivered.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Device device = 5;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.DeviceOrBuilder> 
          getDeviceFieldBuilder() {
        if (deviceBuilder_ == null) {
          deviceBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Device.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.DeviceOrBuilder>(
                  getDevice(),
                  getParentForChildren(),
                  isClean());
          device_ = null;
        }
        return deviceBuilder_;
      }

      private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs regs_;
      private com.google.protobuf.SingleFieldBuilderV3<
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.RegsOrBuilder> regsBuilder_;
      /**
       * <pre>
       * A Regs object (Section 3.2.16) that specifies any industry, legal,
       * or governmental regulations in force for this request.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Regs regs = 14;</code>
       * @return Whether the regs field is set.
       */
      public boolean hasRegs() {
        return ((bitField0_ & 0x00000040) != 0);
      }
      /**
       * <pre>
       * A Regs object (Section 3.2.16) that specifies any industry, legal,
       * or governmental regulations in force for this request.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Regs regs = 14;</code>
       * @return The regs.
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs getRegs() {
        if (regsBuilder_ == null) {
          return regs_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs.getDefaultInstance() : regs_;
        } else {
          return regsBuilder_.getMessage();
        }
      }
      /**
       * <pre>
       * A Regs object (Section 3.2.16) that specifies any industry, legal,
       * or governmental regulations in force for this request.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Regs regs = 14;</code>
       */
      public Builder setRegs(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs value) {
        if (regsBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          regs_ = value;
          onChanged();
        } else {
          regsBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000040;
        return this;
      }
      /**
       * <pre>
       * A Regs object (Section 3.2.16) that specifies any industry, legal,
       * or governmental regulations in force for this request.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Regs regs = 14;</code>
       */
      public Builder setRegs(
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs.Builder builderForValue) {
        if (regsBuilder_ == null) {
          regs_ = builderForValue.build();
          onChanged();
        } else {
          regsBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000040;
        return this;
      }
      /**
       * <pre>
       * A Regs object (Section 3.2.16) that specifies any industry, legal,
       * or governmental regulations in force for this request.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Regs regs = 14;</code>
       */
      public Builder mergeRegs(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs value) {
        if (regsBuilder_ == null) {
          if (((bitField0_ & 0x00000040) != 0) &&
              regs_ != null &&
              regs_ != com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs.getDefaultInstance()) {
            regs_ =
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs.newBuilder(regs_).mergeFrom(value).buildPartial();
          } else {
            regs_ = value;
          }
          onChanged();
        } else {
          regsBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000040;
        return this;
      }
      /**
       * <pre>
       * A Regs object (Section 3.2.16) that specifies any industry, legal,
       * or governmental regulations in force for this request.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Regs regs = 14;</code>
       */
      public Builder clearRegs() {
        if (regsBuilder_ == null) {
          regs_ = null;
          onChanged();
        } else {
          regsBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000040);
        return this;
      }
      /**
       * <pre>
       * A Regs object (Section 3.2.16) that specifies any industry, legal,
       * or governmental regulations in force for this request.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Regs regs = 14;</code>
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs.Builder getRegsBuilder() {
        bitField0_ |= 0x00000040;
        onChanged();
        return getRegsFieldBuilder().getBuilder();
      }
      /**
       * <pre>
       * A Regs object (Section 3.2.16) that specifies any industry, legal,
       * or governmental regulations in force for this request.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Regs regs = 14;</code>
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.RegsOrBuilder getRegsOrBuilder() {
        if (regsBuilder_ != null) {
          return regsBuilder_.getMessageOrBuilder();
        } else {
          return regs_ == null ?
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs.getDefaultInstance() : regs_;
        }
      }
      /**
       * <pre>
       * A Regs object (Section 3.2.16) that specifies any industry, legal,
       * or governmental regulations in force for this request.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Regs regs = 14;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.RegsOrBuilder> 
          getRegsFieldBuilder() {
        if (regsBuilder_ == null) {
          regsBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Regs.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.RegsOrBuilder>(
                  getRegs(),
                  getParentForChildren(),
                  isClean());
          regs_ = null;
        }
        return regsBuilder_;
      }

      private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User user_;
      private com.google.protobuf.SingleFieldBuilderV3<
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserOrBuilder> userBuilder_;
      /**
       * <pre>
       * Details via a User object (Section 3.2.13) about the human
       * user of the device; the advertising audience.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.User user = 6;</code>
       * @return Whether the user field is set.
       */
      public boolean hasUser() {
        return ((bitField0_ & 0x00000080) != 0);
      }
      /**
       * <pre>
       * Details via a User object (Section 3.2.13) about the human
       * user of the device; the advertising audience.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.User user = 6;</code>
       * @return The user.
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User getUser() {
        if (userBuilder_ == null) {
          return user_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User.getDefaultInstance() : user_;
        } else {
          return userBuilder_.getMessage();
        }
      }
      /**
       * <pre>
       * Details via a User object (Section 3.2.13) about the human
       * user of the device; the advertising audience.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.User user = 6;</code>
       */
      public Builder setUser(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User value) {
        if (userBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          user_ = value;
          onChanged();
        } else {
          userBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000080;
        return this;
      }
      /**
       * <pre>
       * Details via a User object (Section 3.2.13) about the human
       * user of the device; the advertising audience.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.User user = 6;</code>
       */
      public Builder setUser(
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User.Builder builderForValue) {
        if (userBuilder_ == null) {
          user_ = builderForValue.build();
          onChanged();
        } else {
          userBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000080;
        return this;
      }
      /**
       * <pre>
       * Details via a User object (Section 3.2.13) about the human
       * user of the device; the advertising audience.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.User user = 6;</code>
       */
      public Builder mergeUser(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User value) {
        if (userBuilder_ == null) {
          if (((bitField0_ & 0x00000080) != 0) &&
              user_ != null &&
              user_ != com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User.getDefaultInstance()) {
            user_ =
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User.newBuilder(user_).mergeFrom(value).buildPartial();
          } else {
            user_ = value;
          }
          onChanged();
        } else {
          userBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000080;
        return this;
      }
      /**
       * <pre>
       * Details via a User object (Section 3.2.13) about the human
       * user of the device; the advertising audience.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.User user = 6;</code>
       */
      public Builder clearUser() {
        if (userBuilder_ == null) {
          user_ = null;
          onChanged();
        } else {
          userBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000080);
        return this;
      }
      /**
       * <pre>
       * Details via a User object (Section 3.2.13) about the human
       * user of the device; the advertising audience.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.User user = 6;</code>
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User.Builder getUserBuilder() {
        bitField0_ |= 0x00000080;
        onChanged();
        return getUserFieldBuilder().getBuilder();
      }
      /**
       * <pre>
       * Details via a User object (Section 3.2.13) about the human
       * user of the device; the advertising audience.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.User user = 6;</code>
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserOrBuilder getUserOrBuilder() {
        if (userBuilder_ != null) {
          return userBuilder_.getMessageOrBuilder();
        } else {
          return user_ == null ?
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User.getDefaultInstance() : user_;
        }
      }
      /**
       * <pre>
       * Details via a User object (Section 3.2.13) about the human
       * user of the device; the advertising audience.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.User user = 6;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserOrBuilder> 
          getUserFieldBuilder() {
        if (userBuilder_ == null) {
          userBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.User.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.UserOrBuilder>(
                  getUser(),
                  getParentForChildren(),
                  isClean());
          user_ = null;
        }
        return userBuilder_;
      }

      private int at_ = 2;
      /**
       * <pre>
       * Auction type, where 1 = First Price, 2 = Second Price Plus.
       * Refer to enum com.iabtechlab.openrtb.v3.AuctionType for generic values.
       * Exchange-specific auction types can be defined using values &gt; 500.
       * </pre>
       *
       * <code>optional int32 at = 7 [default = 2];</code>
       * @return Whether the at field is set.
       */
      @java.lang.Override
      public boolean hasAt() {
        return ((bitField0_ & 0x00000100) != 0);
      }
      /**
       * <pre>
       * Auction type, where 1 = First Price, 2 = Second Price Plus.
       * Refer to enum com.iabtechlab.openrtb.v3.AuctionType for generic values.
       * Exchange-specific auction types can be defined using values &gt; 500.
       * </pre>
       *
       * <code>optional int32 at = 7 [default = 2];</code>
       * @return The at.
       */
      @java.lang.Override
      public int getAt() {
        return at_;
      }
      /**
       * <pre>
       * Auction type, where 1 = First Price, 2 = Second Price Plus.
       * Refer to enum com.iabtechlab.openrtb.v3.AuctionType for generic values.
       * Exchange-specific auction types can be defined using values &gt; 500.
       * </pre>
       *
       * <code>optional int32 at = 7 [default = 2];</code>
       * @param value The at to set.
       * @return This builder for chaining.
       */
      public Builder setAt(int value) {
        bitField0_ |= 0x00000100;
        at_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Auction type, where 1 = First Price, 2 = Second Price Plus.
       * Refer to enum com.iabtechlab.openrtb.v3.AuctionType for generic values.
       * Exchange-specific auction types can be defined using values &gt; 500.
       * </pre>
       *
       * <code>optional int32 at = 7 [default = 2];</code>
       * @return This builder for chaining.
       */
      public Builder clearAt() {
        bitField0_ = (bitField0_ & ~0x00000100);
        at_ = 2;
        onChanged();
        return this;
      }

      private int tmax_ ;
      /**
       * <pre>
       * Maximum time in milliseconds to submit a bid to avoid timeout.
       * This value is commonly communicated offline.
       * </pre>
       *
       * <code>optional int32 tmax = 8;</code>
       * @return Whether the tmax field is set.
       */
      @java.lang.Override
      public boolean hasTmax() {
        return ((bitField0_ & 0x00000200) != 0);
      }
      /**
       * <pre>
       * Maximum time in milliseconds to submit a bid to avoid timeout.
       * This value is commonly communicated offline.
       * </pre>
       *
       * <code>optional int32 tmax = 8;</code>
       * @return The tmax.
       */
      @java.lang.Override
      public int getTmax() {
        return tmax_;
      }
      /**
       * <pre>
       * Maximum time in milliseconds to submit a bid to avoid timeout.
       * This value is commonly communicated offline.
       * </pre>
       *
       * <code>optional int32 tmax = 8;</code>
       * @param value The tmax to set.
       * @return This builder for chaining.
       */
      public Builder setTmax(int value) {
        bitField0_ |= 0x00000200;
        tmax_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Maximum time in milliseconds to submit a bid to avoid timeout.
       * This value is commonly communicated offline.
       * </pre>
       *
       * <code>optional int32 tmax = 8;</code>
       * @return This builder for chaining.
       */
      public Builder clearTmax() {
        bitField0_ = (bitField0_ & ~0x00000200);
        tmax_ = 0;
        onChanged();
        return this;
      }

      private com.google.protobuf.LazyStringList wseat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
      private void ensureWseatIsMutable() {
        if (!((bitField0_ & 0x00000400) != 0)) {
          wseat_ = new com.google.protobuf.LazyStringArrayList(wseat_);
          bitField0_ |= 0x00000400;
         }
      }
      /**
       * <pre>
       * Whitelist of buyer seats (e.g., advertisers, agencies) allowed to
       * bid on this impression. IDs of seats and knowledge of the
       * buyer's customers to which they refer must be coordinated
       * between bidders and the exchange a priori.
       * Omission implies no seat restrictions.
       * </pre>
       *
       * <code>repeated string wseat = 9;</code>
       * @return A list containing the wseat.
       */
      public com.google.protobuf.ProtocolStringList
          getWseatList() {
        return wseat_.getUnmodifiableView();
      }
      /**
       * <pre>
       * Whitelist of buyer seats (e.g., advertisers, agencies) allowed to
       * bid on this impression. IDs of seats and knowledge of the
       * buyer's customers to which they refer must be coordinated
       * between bidders and the exchange a priori.
       * Omission implies no seat restrictions.
       * </pre>
       *
       * <code>repeated string wseat = 9;</code>
       * @return The count of wseat.
       */
      public int getWseatCount() {
        return wseat_.size();
      }
      /**
       * <pre>
       * Whitelist of buyer seats (e.g., advertisers, agencies) allowed to
       * bid on this impression. IDs of seats and knowledge of the
       * buyer's customers to which they refer must be coordinated
       * between bidders and the exchange a priori.
       * Omission implies no seat restrictions.
       * </pre>
       *
       * <code>repeated string wseat = 9;</code>
       * @param index The index of the element to return.
       * @return The wseat at the given index.
       */
      public java.lang.String getWseat(int index) {
        return wseat_.get(index);
      }
      /**
       * <pre>
       * Whitelist of buyer seats (e.g., advertisers, agencies) allowed to
       * bid on this impression. IDs of seats and knowledge of the
       * buyer's customers to which they refer must be coordinated
       * between bidders and the exchange a priori.
       * Omission implies no seat restrictions.
       * </pre>
       *
       * <code>repeated string wseat = 9;</code>
       * @param index The index of the value to return.
       * @return The bytes of the wseat at the given index.
       */
      public com.google.protobuf.ByteString
          getWseatBytes(int index) {
        return wseat_.getByteString(index);
      }
      /**
       * <pre>
       * Whitelist of buyer seats (e.g., advertisers, agencies) allowed to
       * bid on this impression. IDs of seats and knowledge of the
       * buyer's customers to which they refer must be coordinated
       * between bidders and the exchange a priori.
       * Omission implies no seat restrictions.
       * </pre>
       *
       * <code>repeated string wseat = 9;</code>
       * @param index The index to set the value at.
       * @param value The wseat to set.
       * @return This builder for chaining.
       */
      public Builder setWseat(
          int index, java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureWseatIsMutable();
        wseat_.set(index, value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Whitelist of buyer seats (e.g., advertisers, agencies) allowed to
       * bid on this impression. IDs of seats and knowledge of the
       * buyer's customers to which they refer must be coordinated
       * between bidders and the exchange a priori.
       * Omission implies no seat restrictions.
       * </pre>
       *
       * <code>repeated string wseat = 9;</code>
       * @param value The wseat to add.
       * @return This builder for chaining.
       */
      public Builder addWseat(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureWseatIsMutable();
        wseat_.add(value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Whitelist of buyer seats (e.g., advertisers, agencies) allowed to
       * bid on this impression. IDs of seats and knowledge of the
       * buyer's customers to which they refer must be coordinated
       * between bidders and the exchange a priori.
       * Omission implies no seat restrictions.
       * </pre>
       *
       * <code>repeated string wseat = 9;</code>
       * @param values The wseat to add.
       * @return This builder for chaining.
       */
      public Builder addAllWseat(
          java.lang.Iterable<java.lang.String> values) {
        ensureWseatIsMutable();
        com.google.protobuf.AbstractMessageLite.Builder.addAll(
            values, wseat_);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Whitelist of buyer seats (e.g., advertisers, agencies) allowed to
       * bid on this impression. IDs of seats and knowledge of the
       * buyer's customers to which they refer must be coordinated
       * between bidders and the exchange a priori.
       * Omission implies no seat restrictions.
       * </pre>
       *
       * <code>repeated string wseat = 9;</code>
       * @return This builder for chaining.
       */
      public Builder clearWseat() {
        wseat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        bitField0_ = (bitField0_ & ~0x00000400);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Whitelist of buyer seats (e.g., advertisers, agencies) allowed to
       * bid on this impression. IDs of seats and knowledge of the
       * buyer's customers to which they refer must be coordinated
       * between bidders and the exchange a priori.
       * Omission implies no seat restrictions.
       * </pre>
       *
       * <code>repeated string wseat = 9;</code>
       * @param value The bytes of the wseat to add.
       * @return This builder for chaining.
       */
      public Builder addWseatBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureWseatIsMutable();
        wseat_.add(value);
        onChanged();
        return this;
      }

      private boolean allimps_ ;
      /**
       * <pre>
       * Flag to indicate if Exchange can verify that the impressions offered
       * represent all of the impressions available in context (e.g., all on the
       * web page, all video spots such as pre/mid/post roll) to support
       * road-blocking. 0 = no or unknown, 1 = yes, the impressions offered
       * represent all that are available.
       * </pre>
       *
       * <code>optional bool allimps = 10 [default = false];</code>
       * @return Whether the allimps field is set.
       */
      @java.lang.Override
      public boolean hasAllimps() {
        return ((bitField0_ & 0x00000800) != 0);
      }
      /**
       * <pre>
       * Flag to indicate if Exchange can verify that the impressions offered
       * represent all of the impressions available in context (e.g., all on the
       * web page, all video spots such as pre/mid/post roll) to support
       * road-blocking. 0 = no or unknown, 1 = yes, the impressions offered
       * represent all that are available.
       * </pre>
       *
       * <code>optional bool allimps = 10 [default = false];</code>
       * @return The allimps.
       */
      @java.lang.Override
      public boolean getAllimps() {
        return allimps_;
      }
      /**
       * <pre>
       * Flag to indicate if Exchange can verify that the impressions offered
       * represent all of the impressions available in context (e.g., all on the
       * web page, all video spots such as pre/mid/post roll) to support
       * road-blocking. 0 = no or unknown, 1 = yes, the impressions offered
       * represent all that are available.
       * </pre>
       *
       * <code>optional bool allimps = 10 [default = false];</code>
       * @param value The allimps to set.
       * @return This builder for chaining.
       */
      public Builder setAllimps(boolean value) {
        bitField0_ |= 0x00000800;
        allimps_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Flag to indicate if Exchange can verify that the impressions offered
       * represent all of the impressions available in context (e.g., all on the
       * web page, all video spots such as pre/mid/post roll) to support
       * road-blocking. 0 = no or unknown, 1 = yes, the impressions offered
       * represent all that are available.
       * </pre>
       *
       * <code>optional bool allimps = 10 [default = false];</code>
       * @return This builder for chaining.
       */
      public Builder clearAllimps() {
        bitField0_ = (bitField0_ & ~0x00000800);
        allimps_ = false;
        onChanged();
        return this;
      }

      private com.google.protobuf.LazyStringList cur_ = com.google.protobuf.LazyStringArrayList.EMPTY;
      private void ensureCurIsMutable() {
        if (!((bitField0_ & 0x00001000) != 0)) {
          cur_ = new com.google.protobuf.LazyStringArrayList(cur_);
          bitField0_ |= 0x00001000;
         }
      }
      /**
       * <pre>
       * Array of allowed currencies for bids on this bid request using ISO-4217
       * alpha codes. Recommended only if the exchange accepts multiple currencies.
       * </pre>
       *
       * <code>repeated string cur = 11;</code>
       * @return A list containing the cur.
       */
      public com.google.protobuf.ProtocolStringList
          getCurList() {
        return cur_.getUnmodifiableView();
      }
      /**
       * <pre>
       * Array of allowed currencies for bids on this bid request using ISO-4217
       * alpha codes. Recommended only if the exchange accepts multiple currencies.
       * </pre>
       *
       * <code>repeated string cur = 11;</code>
       * @return The count of cur.
       */
      public int getCurCount() {
        return cur_.size();
      }
      /**
       * <pre>
       * Array of allowed currencies for bids on this bid request using ISO-4217
       * alpha codes. Recommended only if the exchange accepts multiple currencies.
       * </pre>
       *
       * <code>repeated string cur = 11;</code>
       * @param index The index of the element to return.
       * @return The cur at the given index.
       */
      public java.lang.String getCur(int index) {
        return cur_.get(index);
      }
      /**
       * <pre>
       * Array of allowed currencies for bids on this bid request using ISO-4217
       * alpha codes. Recommended only if the exchange accepts multiple currencies.
       * </pre>
       *
       * <code>repeated string cur = 11;</code>
       * @param index The index of the value to return.
       * @return The bytes of the cur at the given index.
       */
      public com.google.protobuf.ByteString
          getCurBytes(int index) {
        return cur_.getByteString(index);
      }
      /**
       * <pre>
       * Array of allowed currencies for bids on this bid request using ISO-4217
       * alpha codes. Recommended only if the exchange accepts multiple currencies.
       * </pre>
       *
       * <code>repeated string cur = 11;</code>
       * @param index The index to set the value at.
       * @param value The cur to set.
       * @return This builder for chaining.
       */
      public Builder setCur(
          int index, java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureCurIsMutable();
        cur_.set(index, value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Array of allowed currencies for bids on this bid request using ISO-4217
       * alpha codes. Recommended only if the exchange accepts multiple currencies.
       * </pre>
       *
       * <code>repeated string cur = 11;</code>
       * @param value The cur to add.
       * @return This builder for chaining.
       */
      public Builder addCur(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureCurIsMutable();
        cur_.add(value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Array of allowed currencies for bids on this bid request using ISO-4217
       * alpha codes. Recommended only if the exchange accepts multiple currencies.
       * </pre>
       *
       * <code>repeated string cur = 11;</code>
       * @param values The cur to add.
       * @return This builder for chaining.
       */
      public Builder addAllCur(
          java.lang.Iterable<java.lang.String> values) {
        ensureCurIsMutable();
        com.google.protobuf.AbstractMessageLite.Builder.addAll(
            values, cur_);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Array of allowed currencies for bids on this bid request using ISO-4217
       * alpha codes. Recommended only if the exchange accepts multiple currencies.
       * </pre>
       *
       * <code>repeated string cur = 11;</code>
       * @return This builder for chaining.
       */
      public Builder clearCur() {
        cur_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        bitField0_ = (bitField0_ & ~0x00001000);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Array of allowed currencies for bids on this bid request using ISO-4217
       * alpha codes. Recommended only if the exchange accepts multiple currencies.
       * </pre>
       *
       * <code>repeated string cur = 11;</code>
       * @param value The bytes of the cur to add.
       * @return This builder for chaining.
       */
      public Builder addCurBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureCurIsMutable();
        cur_.add(value);
        onChanged();
        return this;
      }

      private com.google.protobuf.LazyStringList bcat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
      private void ensureBcatIsMutable() {
        if (!((bitField0_ & 0x00002000) != 0)) {
          bcat_ = new com.google.protobuf.LazyStringArrayList(bcat_);
          bitField0_ |= 0x00002000;
         }
      }
      /**
       * <pre>
       * Blocked advertiser categories using the IAB content categories.
       * </pre>
       *
       * <code>repeated string bcat = 12;</code>
       * @return A list containing the bcat.
       */
      public com.google.protobuf.ProtocolStringList
          getBcatList() {
        return bcat_.getUnmodifiableView();
      }
      /**
       * <pre>
       * Blocked advertiser categories using the IAB content categories.
       * </pre>
       *
       * <code>repeated string bcat = 12;</code>
       * @return The count of bcat.
       */
      public int getBcatCount() {
        return bcat_.size();
      }
      /**
       * <pre>
       * Blocked advertiser categories using the IAB content categories.
       * </pre>
       *
       * <code>repeated string bcat = 12;</code>
       * @param index The index of the element to return.
       * @return The bcat at the given index.
       */
      public java.lang.String getBcat(int index) {
        return bcat_.get(index);
      }
      /**
       * <pre>
       * Blocked advertiser categories using the IAB content categories.
       * </pre>
       *
       * <code>repeated string bcat = 12;</code>
       * @param index The index of the value to return.
       * @return The bytes of the bcat at the given index.
       */
      public com.google.protobuf.ByteString
          getBcatBytes(int index) {
        return bcat_.getByteString(index);
      }
      /**
       * <pre>
       * Blocked advertiser categories using the IAB content categories.
       * </pre>
       *
       * <code>repeated string bcat = 12;</code>
       * @param index The index to set the value at.
       * @param value The bcat to set.
       * @return This builder for chaining.
       */
      public Builder setBcat(
          int index, java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureBcatIsMutable();
        bcat_.set(index, value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Blocked advertiser categories using the IAB content categories.
       * </pre>
       *
       * <code>repeated string bcat = 12;</code>
       * @param value The bcat to add.
       * @return This builder for chaining.
       */
      public Builder addBcat(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureBcatIsMutable();
        bcat_.add(value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Blocked advertiser categories using the IAB content categories.
       * </pre>
       *
       * <code>repeated string bcat = 12;</code>
       * @param values The bcat to add.
       * @return This builder for chaining.
       */
      public Builder addAllBcat(
          java.lang.Iterable<java.lang.String> values) {
        ensureBcatIsMutable();
        com.google.protobuf.AbstractMessageLite.Builder.addAll(
            values, bcat_);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Blocked advertiser categories using the IAB content categories.
       * </pre>
       *
       * <code>repeated string bcat = 12;</code>
       * @return This builder for chaining.
       */
      public Builder clearBcat() {
        bcat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        bitField0_ = (bitField0_ & ~0x00002000);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Blocked advertiser categories using the IAB content categories.
       * </pre>
       *
       * <code>repeated string bcat = 12;</code>
       * @param value The bytes of the bcat to add.
       * @return This builder for chaining.
       */
      public Builder addBcatBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureBcatIsMutable();
        bcat_.add(value);
        onChanged();
        return this;
      }

      private int cattax_ = 1;
      /**
       * <pre>
       * The taxonomy in use for bcat.
       * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
       * </pre>
       *
       * <code>optional int32 cattax = 21 [default = 1];</code>
       * @return Whether the cattax field is set.
       */
      @java.lang.Override
      public boolean hasCattax() {
        return ((bitField0_ & 0x00004000) != 0);
      }
      /**
       * <pre>
       * The taxonomy in use for bcat.
       * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
       * </pre>
       *
       * <code>optional int32 cattax = 21 [default = 1];</code>
       * @return The cattax.
       */
      @java.lang.Override
      public int getCattax() {
        return cattax_;
      }
      /**
       * <pre>
       * The taxonomy in use for bcat.
       * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
       * </pre>
       *
       * <code>optional int32 cattax = 21 [default = 1];</code>
       * @param value The cattax to set.
       * @return This builder for chaining.
       */
      public Builder setCattax(int value) {
        bitField0_ |= 0x00004000;
        cattax_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The taxonomy in use for bcat.
       * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
       * </pre>
       *
       * <code>optional int32 cattax = 21 [default = 1];</code>
       * @return This builder for chaining.
       */
      public Builder clearCattax() {
        bitField0_ = (bitField0_ & ~0x00004000);
        cattax_ = 1;
        onChanged();
        return this;
      }

      private com.google.protobuf.LazyStringList badv_ = com.google.protobuf.LazyStringArrayList.EMPTY;
      private void ensureBadvIsMutable() {
        if (!((bitField0_ & 0x00008000) != 0)) {
          badv_ = new com.google.protobuf.LazyStringArrayList(badv_);
          bitField0_ |= 0x00008000;
         }
      }
      /**
       * <pre>
       * Block list of advertisers by their domains (e.g., "ford.com").
       * </pre>
       *
       * <code>repeated string badv = 13;</code>
       * @return A list containing the badv.
       */
      public com.google.protobuf.ProtocolStringList
          getBadvList() {
        return badv_.getUnmodifiableView();
      }
      /**
       * <pre>
       * Block list of advertisers by their domains (e.g., "ford.com").
       * </pre>
       *
       * <code>repeated string badv = 13;</code>
       * @return The count of badv.
       */
      public int getBadvCount() {
        return badv_.size();
      }
      /**
       * <pre>
       * Block list of advertisers by their domains (e.g., "ford.com").
       * </pre>
       *
       * <code>repeated string badv = 13;</code>
       * @param index The index of the element to return.
       * @return The badv at the given index.
       */
      public java.lang.String getBadv(int index) {
        return badv_.get(index);
      }
      /**
       * <pre>
       * Block list of advertisers by their domains (e.g., "ford.com").
       * </pre>
       *
       * <code>repeated string badv = 13;</code>
       * @param index The index of the value to return.
       * @return The bytes of the badv at the given index.
       */
      public com.google.protobuf.ByteString
          getBadvBytes(int index) {
        return badv_.getByteString(index);
      }
      /**
       * <pre>
       * Block list of advertisers by their domains (e.g., "ford.com").
       * </pre>
       *
       * <code>repeated string badv = 13;</code>
       * @param index The index to set the value at.
       * @param value The badv to set.
       * @return This builder for chaining.
       */
      public Builder setBadv(
          int index, java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureBadvIsMutable();
        badv_.set(index, value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Block list of advertisers by their domains (e.g., "ford.com").
       * </pre>
       *
       * <code>repeated string badv = 13;</code>
       * @param value The badv to add.
       * @return This builder for chaining.
       */
      public Builder addBadv(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureBadvIsMutable();
        badv_.add(value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Block list of advertisers by their domains (e.g., "ford.com").
       * </pre>
       *
       * <code>repeated string badv = 13;</code>
       * @param values The badv to add.
       * @return This builder for chaining.
       */
      public Builder addAllBadv(
          java.lang.Iterable<java.lang.String> values) {
        ensureBadvIsMutable();
        com.google.protobuf.AbstractMessageLite.Builder.addAll(
            values, badv_);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Block list of advertisers by their domains (e.g., "ford.com").
       * </pre>
       *
       * <code>repeated string badv = 13;</code>
       * @return This builder for chaining.
       */
      public Builder clearBadv() {
        badv_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        bitField0_ = (bitField0_ & ~0x00008000);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Block list of advertisers by their domains (e.g., "ford.com").
       * </pre>
       *
       * <code>repeated string badv = 13;</code>
       * @param value The bytes of the badv to add.
       * @return This builder for chaining.
       */
      public Builder addBadvBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureBadvIsMutable();
        badv_.add(value);
        onChanged();
        return this;
      }

      private com.google.protobuf.LazyStringList bapp_ = com.google.protobuf.LazyStringArrayList.EMPTY;
      private void ensureBappIsMutable() {
        if (!((bitField0_ & 0x00010000) != 0)) {
          bapp_ = new com.google.protobuf.LazyStringArrayList(bapp_);
          bitField0_ |= 0x00010000;
         }
      }
      /**
       * <pre>
       * Block list of applications by their platform-specific exchange
       * independent application identifiers. On Android, these should
       * be bundle or package names (e.g., com.foo.mygame).
       * On iOS, these are numeric IDs.
       * </pre>
       *
       * <code>repeated string bapp = 16;</code>
       * @return A list containing the bapp.
       */
      public com.google.protobuf.ProtocolStringList
          getBappList() {
        return bapp_.getUnmodifiableView();
      }
      /**
       * <pre>
       * Block list of applications by their platform-specific exchange
       * independent application identifiers. On Android, these should
       * be bundle or package names (e.g., com.foo.mygame).
       * On iOS, these are numeric IDs.
       * </pre>
       *
       * <code>repeated string bapp = 16;</code>
       * @return The count of bapp.
       */
      public int getBappCount() {
        return bapp_.size();
      }
      /**
       * <pre>
       * Block list of applications by their platform-specific exchange
       * independent application identifiers. On Android, these should
       * be bundle or package names (e.g., com.foo.mygame).
       * On iOS, these are numeric IDs.
       * </pre>
       *
       * <code>repeated string bapp = 16;</code>
       * @param index The index of the element to return.
       * @return The bapp at the given index.
       */
      public java.lang.String getBapp(int index) {
        return bapp_.get(index);
      }
      /**
       * <pre>
       * Block list of applications by their platform-specific exchange
       * independent application identifiers. On Android, these should
       * be bundle or package names (e.g., com.foo.mygame).
       * On iOS, these are numeric IDs.
       * </pre>
       *
       * <code>repeated string bapp = 16;</code>
       * @param index The index of the value to return.
       * @return The bytes of the bapp at the given index.
       */
      public com.google.protobuf.ByteString
          getBappBytes(int index) {
        return bapp_.getByteString(index);
      }
      /**
       * <pre>
       * Block list of applications by their platform-specific exchange
       * independent application identifiers. On Android, these should
       * be bundle or package names (e.g., com.foo.mygame).
       * On iOS, these are numeric IDs.
       * </pre>
       *
       * <code>repeated string bapp = 16;</code>
       * @param index The index to set the value at.
       * @param value The bapp to set.
       * @return This builder for chaining.
       */
      public Builder setBapp(
          int index, java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureBappIsMutable();
        bapp_.set(index, value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Block list of applications by their platform-specific exchange
       * independent application identifiers. On Android, these should
       * be bundle or package names (e.g., com.foo.mygame).
       * On iOS, these are numeric IDs.
       * </pre>
       *
       * <code>repeated string bapp = 16;</code>
       * @param value The bapp to add.
       * @return This builder for chaining.
       */
      public Builder addBapp(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureBappIsMutable();
        bapp_.add(value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Block list of applications by their platform-specific exchange
       * independent application identifiers. On Android, these should
       * be bundle or package names (e.g., com.foo.mygame).
       * On iOS, these are numeric IDs.
       * </pre>
       *
       * <code>repeated string bapp = 16;</code>
       * @param values The bapp to add.
       * @return This builder for chaining.
       */
      public Builder addAllBapp(
          java.lang.Iterable<java.lang.String> values) {
        ensureBappIsMutable();
        com.google.protobuf.AbstractMessageLite.Builder.addAll(
            values, bapp_);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Block list of applications by their platform-specific exchange
       * independent application identifiers. On Android, these should
       * be bundle or package names (e.g., com.foo.mygame).
       * On iOS, these are numeric IDs.
       * </pre>
       *
       * <code>repeated string bapp = 16;</code>
       * @return This builder for chaining.
       */
      public Builder clearBapp() {
        bapp_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        bitField0_ = (bitField0_ & ~0x00010000);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Block list of applications by their platform-specific exchange
       * independent application identifiers. On Android, these should
       * be bundle or package names (e.g., com.foo.mygame).
       * On iOS, these are numeric IDs.
       * </pre>
       *
       * <code>repeated string bapp = 16;</code>
       * @param value The bytes of the bapp to add.
       * @return This builder for chaining.
       */
      public Builder addBappBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureBappIsMutable();
        bapp_.add(value);
        onChanged();
        return this;
      }

      private boolean test_ ;
      /**
       * <pre>
       * Indicator of test mode in which auctions are not billable,
       * where 0 = live mode, 1 = test mode.
       * </pre>
       *
       * <code>optional bool test = 15 [default = false];</code>
       * @return Whether the test field is set.
       */
      @java.lang.Override
      public boolean hasTest() {
        return ((bitField0_ & 0x00020000) != 0);
      }
      /**
       * <pre>
       * Indicator of test mode in which auctions are not billable,
       * where 0 = live mode, 1 = test mode.
       * </pre>
       *
       * <code>optional bool test = 15 [default = false];</code>
       * @return The test.
       */
      @java.lang.Override
      public boolean getTest() {
        return test_;
      }
      /**
       * <pre>
       * Indicator of test mode in which auctions are not billable,
       * where 0 = live mode, 1 = test mode.
       * </pre>
       *
       * <code>optional bool test = 15 [default = false];</code>
       * @param value The test to set.
       * @return This builder for chaining.
       */
      public Builder setTest(boolean value) {
        bitField0_ |= 0x00020000;
        test_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Indicator of test mode in which auctions are not billable,
       * where 0 = live mode, 1 = test mode.
       * </pre>
       *
       * <code>optional bool test = 15 [default = false];</code>
       * @return This builder for chaining.
       */
      public Builder clearTest() {
        bitField0_ = (bitField0_ & ~0x00020000);
        test_ = false;
        onChanged();
        return this;
      }

      private com.google.protobuf.LazyStringList bseat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
      private void ensureBseatIsMutable() {
        if (!((bitField0_ & 0x00040000) != 0)) {
          bseat_ = new com.google.protobuf.LazyStringArrayList(bseat_);
          bitField0_ |= 0x00040000;
         }
      }
      /**
       * <pre>
       * Block list of buyer seats (e.g., advertisers, agencies) restricted
       * from bidding on this impression. IDs of seats and knowledge
       * of the buyer's customers to which they refer must be
       * coordinated between bidders and the exchange a priori.
       * At most, only one of wseat and bseat should be used in the
       * same request. Omission of both implies no seat restrictions.
       * </pre>
       *
       * <code>repeated string bseat = 17;</code>
       * @return A list containing the bseat.
       */
      public com.google.protobuf.ProtocolStringList
          getBseatList() {
        return bseat_.getUnmodifiableView();
      }
      /**
       * <pre>
       * Block list of buyer seats (e.g., advertisers, agencies) restricted
       * from bidding on this impression. IDs of seats and knowledge
       * of the buyer's customers to which they refer must be
       * coordinated between bidders and the exchange a priori.
       * At most, only one of wseat and bseat should be used in the
       * same request. Omission of both implies no seat restrictions.
       * </pre>
       *
       * <code>repeated string bseat = 17;</code>
       * @return The count of bseat.
       */
      public int getBseatCount() {
        return bseat_.size();
      }
      /**
       * <pre>
       * Block list of buyer seats (e.g., advertisers, agencies) restricted
       * from bidding on this impression. IDs of seats and knowledge
       * of the buyer's customers to which they refer must be
       * coordinated between bidders and the exchange a priori.
       * At most, only one of wseat and bseat should be used in the
       * same request. Omission of both implies no seat restrictions.
       * </pre>
       *
       * <code>repeated string bseat = 17;</code>
       * @param index The index of the element to return.
       * @return The bseat at the given index.
       */
      public java.lang.String getBseat(int index) {
        return bseat_.get(index);
      }
      /**
       * <pre>
       * Block list of buyer seats (e.g., advertisers, agencies) restricted
       * from bidding on this impression. IDs of seats and knowledge
       * of the buyer's customers to which they refer must be
       * coordinated between bidders and the exchange a priori.
       * At most, only one of wseat and bseat should be used in the
       * same request. Omission of both implies no seat restrictions.
       * </pre>
       *
       * <code>repeated string bseat = 17;</code>
       * @param index The index of the value to return.
       * @return The bytes of the bseat at the given index.
       */
      public com.google.protobuf.ByteString
          getBseatBytes(int index) {
        return bseat_.getByteString(index);
      }
      /**
       * <pre>
       * Block list of buyer seats (e.g., advertisers, agencies) restricted
       * from bidding on this impression. IDs of seats and knowledge
       * of the buyer's customers to which they refer must be
       * coordinated between bidders and the exchange a priori.
       * At most, only one of wseat and bseat should be used in the
       * same request. Omission of both implies no seat restrictions.
       * </pre>
       *
       * <code>repeated string bseat = 17;</code>
       * @param index The index to set the value at.
       * @param value The bseat to set.
       * @return This builder for chaining.
       */
      public Builder setBseat(
          int index, java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureBseatIsMutable();
        bseat_.set(index, value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Block list of buyer seats (e.g., advertisers, agencies) restricted
       * from bidding on this impression. IDs of seats and knowledge
       * of the buyer's customers to which they refer must be
       * coordinated between bidders and the exchange a priori.
       * At most, only one of wseat and bseat should be used in the
       * same request. Omission of both implies no seat restrictions.
       * </pre>
       *
       * <code>repeated string bseat = 17;</code>
       * @param value The bseat to add.
       * @return This builder for chaining.
       */
      public Builder addBseat(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureBseatIsMutable();
        bseat_.add(value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Block list of buyer seats (e.g., advertisers, agencies) restricted
       * from bidding on this impression. IDs of seats and knowledge
       * of the buyer's customers to which they refer must be
       * coordinated between bidders and the exchange a priori.
       * At most, only one of wseat and bseat should be used in the
       * same request. Omission of both implies no seat restrictions.
       * </pre>
       *
       * <code>repeated string bseat = 17;</code>
       * @param values The bseat to add.
       * @return This builder for chaining.
       */
      public Builder addAllBseat(
          java.lang.Iterable<java.lang.String> values) {
        ensureBseatIsMutable();
        com.google.protobuf.AbstractMessageLite.Builder.addAll(
            values, bseat_);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Block list of buyer seats (e.g., advertisers, agencies) restricted
       * from bidding on this impression. IDs of seats and knowledge
       * of the buyer's customers to which they refer must be
       * coordinated between bidders and the exchange a priori.
       * At most, only one of wseat and bseat should be used in the
       * same request. Omission of both implies no seat restrictions.
       * </pre>
       *
       * <code>repeated string bseat = 17;</code>
       * @return This builder for chaining.
       */
      public Builder clearBseat() {
        bseat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        bitField0_ = (bitField0_ & ~0x00040000);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Block list of buyer seats (e.g., advertisers, agencies) restricted
       * from bidding on this impression. IDs of seats and knowledge
       * of the buyer's customers to which they refer must be
       * coordinated between bidders and the exchange a priori.
       * At most, only one of wseat and bseat should be used in the
       * same request. Omission of both implies no seat restrictions.
       * </pre>
       *
       * <code>repeated string bseat = 17;</code>
       * @param value The bytes of the bseat to add.
       * @return This builder for chaining.
       */
      public Builder addBseatBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureBseatIsMutable();
        bseat_.add(value);
        onChanged();
        return this;
      }

      private com.google.protobuf.LazyStringList wlang_ = com.google.protobuf.LazyStringArrayList.EMPTY;
      private void ensureWlangIsMutable() {
        if (!((bitField0_ & 0x00080000) != 0)) {
          wlang_ = new com.google.protobuf.LazyStringArrayList(wlang_);
          bitField0_ |= 0x00080000;
         }
      }
      /**
       * <pre>
       * White list of languages for creatives using ISO-639-1-alpha-2.
       * Omission implies no specific restrictions, but buyers would be
       * advised to consider language attribute in the Device and/or
       * Content objects if available.
       * </pre>
       *
       * <code>repeated string wlang = 18;</code>
       * @return A list containing the wlang.
       */
      public com.google.protobuf.ProtocolStringList
          getWlangList() {
        return wlang_.getUnmodifiableView();
      }
      /**
       * <pre>
       * White list of languages for creatives using ISO-639-1-alpha-2.
       * Omission implies no specific restrictions, but buyers would be
       * advised to consider language attribute in the Device and/or
       * Content objects if available.
       * </pre>
       *
       * <code>repeated string wlang = 18;</code>
       * @return The count of wlang.
       */
      public int getWlangCount() {
        return wlang_.size();
      }
      /**
       * <pre>
       * White list of languages for creatives using ISO-639-1-alpha-2.
       * Omission implies no specific restrictions, but buyers would be
       * advised to consider language attribute in the Device and/or
       * Content objects if available.
       * </pre>
       *
       * <code>repeated string wlang = 18;</code>
       * @param index The index of the element to return.
       * @return The wlang at the given index.
       */
      public java.lang.String getWlang(int index) {
        return wlang_.get(index);
      }
      /**
       * <pre>
       * White list of languages for creatives using ISO-639-1-alpha-2.
       * Omission implies no specific restrictions, but buyers would be
       * advised to consider language attribute in the Device and/or
       * Content objects if available.
       * </pre>
       *
       * <code>repeated string wlang = 18;</code>
       * @param index The index of the value to return.
       * @return The bytes of the wlang at the given index.
       */
      public com.google.protobuf.ByteString
          getWlangBytes(int index) {
        return wlang_.getByteString(index);
      }
      /**
       * <pre>
       * White list of languages for creatives using ISO-639-1-alpha-2.
       * Omission implies no specific restrictions, but buyers would be
       * advised to consider language attribute in the Device and/or
       * Content objects if available.
       * </pre>
       *
       * <code>repeated string wlang = 18;</code>
       * @param index The index to set the value at.
       * @param value The wlang to set.
       * @return This builder for chaining.
       */
      public Builder setWlang(
          int index, java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureWlangIsMutable();
        wlang_.set(index, value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * White list of languages for creatives using ISO-639-1-alpha-2.
       * Omission implies no specific restrictions, but buyers would be
       * advised to consider language attribute in the Device and/or
       * Content objects if available.
       * </pre>
       *
       * <code>repeated string wlang = 18;</code>
       * @param value The wlang to add.
       * @return This builder for chaining.
       */
      public Builder addWlang(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureWlangIsMutable();
        wlang_.add(value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * White list of languages for creatives using ISO-639-1-alpha-2.
       * Omission implies no specific restrictions, but buyers would be
       * advised to consider language attribute in the Device and/or
       * Content objects if available.
       * </pre>
       *
       * <code>repeated string wlang = 18;</code>
       * @param values The wlang to add.
       * @return This builder for chaining.
       */
      public Builder addAllWlang(
          java.lang.Iterable<java.lang.String> values) {
        ensureWlangIsMutable();
        com.google.protobuf.AbstractMessageLite.Builder.addAll(
            values, wlang_);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * White list of languages for creatives using ISO-639-1-alpha-2.
       * Omission implies no specific restrictions, but buyers would be
       * advised to consider language attribute in the Device and/or
       * Content objects if available.
       * </pre>
       *
       * <code>repeated string wlang = 18;</code>
       * @return This builder for chaining.
       */
      public Builder clearWlang() {
        wlang_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        bitField0_ = (bitField0_ & ~0x00080000);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * White list of languages for creatives using ISO-639-1-alpha-2.
       * Omission implies no specific restrictions, but buyers would be
       * advised to consider language attribute in the Device and/or
       * Content objects if available.
       * </pre>
       *
       * <code>repeated string wlang = 18;</code>
       * @param value The bytes of the wlang to add.
       * @return This builder for chaining.
       */
      public Builder addWlangBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureWlangIsMutable();
        wlang_.add(value);
        onChanged();
        return this;
      }

      private com.google.protobuf.LazyStringList wlangb_ = com.google.protobuf.LazyStringArrayList.EMPTY;
      private void ensureWlangbIsMutable() {
        if (!((bitField0_ & 0x00100000) != 0)) {
          wlangb_ = new com.google.protobuf.LazyStringArrayList(wlangb_);
          bitField0_ |= 0x00100000;
         }
      }
      /**
       * <pre>
       * Allowed list of languages for creatives using IETF BCP 47I. Omission
       * implies no specific restrictions, but buyers would be advised to consider
       * language attribute in the Device and/or Content objects if available. Only
       * one of wlang or wlangb should be present.
       * </pre>
       *
       * <code>repeated string wlangb = 20;</code>
       * @return A list containing the wlangb.
       */
      public com.google.protobuf.ProtocolStringList
          getWlangbList() {
        return wlangb_.getUnmodifiableView();
      }
      /**
       * <pre>
       * Allowed list of languages for creatives using IETF BCP 47I. Omission
       * implies no specific restrictions, but buyers would be advised to consider
       * language attribute in the Device and/or Content objects if available. Only
       * one of wlang or wlangb should be present.
       * </pre>
       *
       * <code>repeated string wlangb = 20;</code>
       * @return The count of wlangb.
       */
      public int getWlangbCount() {
        return wlangb_.size();
      }
      /**
       * <pre>
       * Allowed list of languages for creatives using IETF BCP 47I. Omission
       * implies no specific restrictions, but buyers would be advised to consider
       * language attribute in the Device and/or Content objects if available. Only
       * one of wlang or wlangb should be present.
       * </pre>
       *
       * <code>repeated string wlangb = 20;</code>
       * @param index The index of the element to return.
       * @return The wlangb at the given index.
       */
      public java.lang.String getWlangb(int index) {
        return wlangb_.get(index);
      }
      /**
       * <pre>
       * Allowed list of languages for creatives using IETF BCP 47I. Omission
       * implies no specific restrictions, but buyers would be advised to consider
       * language attribute in the Device and/or Content objects if available. Only
       * one of wlang or wlangb should be present.
       * </pre>
       *
       * <code>repeated string wlangb = 20;</code>
       * @param index The index of the value to return.
       * @return The bytes of the wlangb at the given index.
       */
      public com.google.protobuf.ByteString
          getWlangbBytes(int index) {
        return wlangb_.getByteString(index);
      }
      /**
       * <pre>
       * Allowed list of languages for creatives using IETF BCP 47I. Omission
       * implies no specific restrictions, but buyers would be advised to consider
       * language attribute in the Device and/or Content objects if available. Only
       * one of wlang or wlangb should be present.
       * </pre>
       *
       * <code>repeated string wlangb = 20;</code>
       * @param index The index to set the value at.
       * @param value The wlangb to set.
       * @return This builder for chaining.
       */
      public Builder setWlangb(
          int index, java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureWlangbIsMutable();
        wlangb_.set(index, value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Allowed list of languages for creatives using IETF BCP 47I. Omission
       * implies no specific restrictions, but buyers would be advised to consider
       * language attribute in the Device and/or Content objects if available. Only
       * one of wlang or wlangb should be present.
       * </pre>
       *
       * <code>repeated string wlangb = 20;</code>
       * @param value The wlangb to add.
       * @return This builder for chaining.
       */
      public Builder addWlangb(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureWlangbIsMutable();
        wlangb_.add(value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Allowed list of languages for creatives using IETF BCP 47I. Omission
       * implies no specific restrictions, but buyers would be advised to consider
       * language attribute in the Device and/or Content objects if available. Only
       * one of wlang or wlangb should be present.
       * </pre>
       *
       * <code>repeated string wlangb = 20;</code>
       * @param values The wlangb to add.
       * @return This builder for chaining.
       */
      public Builder addAllWlangb(
          java.lang.Iterable<java.lang.String> values) {
        ensureWlangbIsMutable();
        com.google.protobuf.AbstractMessageLite.Builder.addAll(
            values, wlangb_);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Allowed list of languages for creatives using IETF BCP 47I. Omission
       * implies no specific restrictions, but buyers would be advised to consider
       * language attribute in the Device and/or Content objects if available. Only
       * one of wlang or wlangb should be present.
       * </pre>
       *
       * <code>repeated string wlangb = 20;</code>
       * @return This builder for chaining.
       */
      public Builder clearWlangb() {
        wlangb_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        bitField0_ = (bitField0_ & ~0x00100000);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Allowed list of languages for creatives using IETF BCP 47I. Omission
       * implies no specific restrictions, but buyers would be advised to consider
       * language attribute in the Device and/or Content objects if available. Only
       * one of wlang or wlangb should be present.
       * </pre>
       *
       * <code>repeated string wlangb = 20;</code>
       * @param value The bytes of the wlangb to add.
       * @return This builder for chaining.
       */
      public Builder addWlangbBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureWlangbIsMutable();
        wlangb_.add(value);
        onChanged();
        return this;
      }

      private com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source source_;
      private com.google.protobuf.SingleFieldBuilderV3<
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.SourceOrBuilder> sourceBuilder_;
      /**
       * <pre>
       * A Source object (Section 3.2.2) that provides data about the
       * inventory source and which entity makes the final decision.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Source source = 19;</code>
       * @return Whether the source field is set.
       */
      public boolean hasSource() {
        return ((bitField0_ & 0x00200000) != 0);
      }
      /**
       * <pre>
       * A Source object (Section 3.2.2) that provides data about the
       * inventory source and which entity makes the final decision.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Source source = 19;</code>
       * @return The source.
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source getSource() {
        if (sourceBuilder_ == null) {
          return source_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source.getDefaultInstance() : source_;
        } else {
          return sourceBuilder_.getMessage();
        }
      }
      /**
       * <pre>
       * A Source object (Section 3.2.2) that provides data about the
       * inventory source and which entity makes the final decision.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Source source = 19;</code>
       */
      public Builder setSource(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source value) {
        if (sourceBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          source_ = value;
          onChanged();
        } else {
          sourceBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00200000;
        return this;
      }
      /**
       * <pre>
       * A Source object (Section 3.2.2) that provides data about the
       * inventory source and which entity makes the final decision.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Source source = 19;</code>
       */
      public Builder setSource(
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source.Builder builderForValue) {
        if (sourceBuilder_ == null) {
          source_ = builderForValue.build();
          onChanged();
        } else {
          sourceBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00200000;
        return this;
      }
      /**
       * <pre>
       * A Source object (Section 3.2.2) that provides data about the
       * inventory source and which entity makes the final decision.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Source source = 19;</code>
       */
      public Builder mergeSource(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source value) {
        if (sourceBuilder_ == null) {
          if (((bitField0_ & 0x00200000) != 0) &&
              source_ != null &&
              source_ != com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source.getDefaultInstance()) {
            source_ =
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source.newBuilder(source_).mergeFrom(value).buildPartial();
          } else {
            source_ = value;
          }
          onChanged();
        } else {
          sourceBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00200000;
        return this;
      }
      /**
       * <pre>
       * A Source object (Section 3.2.2) that provides data about the
       * inventory source and which entity makes the final decision.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Source source = 19;</code>
       */
      public Builder clearSource() {
        if (sourceBuilder_ == null) {
          source_ = null;
          onChanged();
        } else {
          sourceBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00200000);
        return this;
      }
      /**
       * <pre>
       * A Source object (Section 3.2.2) that provides data about the
       * inventory source and which entity makes the final decision.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Source source = 19;</code>
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source.Builder getSourceBuilder() {
        bitField0_ |= 0x00200000;
        onChanged();
        return getSourceFieldBuilder().getBuilder();
      }
      /**
       * <pre>
       * A Source object (Section 3.2.2) that provides data about the
       * inventory source and which entity makes the final decision.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Source source = 19;</code>
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.SourceOrBuilder getSourceOrBuilder() {
        if (sourceBuilder_ != null) {
          return sourceBuilder_.getMessageOrBuilder();
        } else {
          return source_ == null ?
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source.getDefaultInstance() : source_;
        }
      }
      /**
       * <pre>
       * A Source object (Section 3.2.2) that provides data about the
       * inventory source and which entity makes the final decision.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.BidRequest.Source source = 19;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.SourceOrBuilder> 
          getSourceFieldBuilder() {
        if (sourceBuilder_ == null) {
          sourceBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Source.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.SourceOrBuilder>(
                  getSource(),
                  getParentForChildren(),
                  isClean());
          source_ = null;
        }
        return sourceBuilder_;
      }
      @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:com.iabtechlab.openrtb.v2.BidRequest)
    }

    // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.BidRequest)
    private static final com.iabtechlab.openrtb.v2.OpenRtb.BidRequest DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.BidRequest();
    }

    public static com.iabtechlab.openrtb.v2.OpenRtb.BidRequest getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    @java.lang.Deprecated public static final com.google.protobuf.Parser<BidRequest>
        PARSER = new com.google.protobuf.AbstractParser<BidRequest>() {
      @java.lang.Override
      public BidRequest parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new BidRequest(input, extensionRegistry);
      }
    };

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

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

    @java.lang.Override
    public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface BidResponseOrBuilder extends
      // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.BidResponse)
      com.google.protobuf.GeneratedMessageV3.
          ExtendableMessageOrBuilder<BidResponse> {

    /**
     * <pre>
     * ID of the bid request to which this is a response.
     * REQUIRED by the OpenRTB specification.
     * </pre>
     *
     * <code>required string id = 1;</code>
     * @return Whether the id field is set.
     */
    boolean hasId();
    /**
     * <pre>
     * ID of the bid request to which this is a response.
     * REQUIRED by the OpenRTB specification.
     * </pre>
     *
     * <code>required string id = 1;</code>
     * @return The id.
     */
    java.lang.String getId();
    /**
     * <pre>
     * ID of the bid request to which this is a response.
     * REQUIRED by the OpenRTB specification.
     * </pre>
     *
     * <code>required string id = 1;</code>
     * @return The bytes for id.
     */
    com.google.protobuf.ByteString
        getIdBytes();

    /**
     * <pre>
     * Array of seatbid objects; 1+ required if a bid is to be made.
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid seatbid = 2;</code>
     */
    java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid> 
        getSeatbidList();
    /**
     * <pre>
     * Array of seatbid objects; 1+ required if a bid is to be made.
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid seatbid = 2;</code>
     */
    com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid getSeatbid(int index);
    /**
     * <pre>
     * Array of seatbid objects; 1+ required if a bid is to be made.
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid seatbid = 2;</code>
     */
    int getSeatbidCount();
    /**
     * <pre>
     * Array of seatbid objects; 1+ required if a bid is to be made.
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid seatbid = 2;</code>
     */
    java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBidOrBuilder> 
        getSeatbidOrBuilderList();
    /**
     * <pre>
     * Array of seatbid objects; 1+ required if a bid is to be made.
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid seatbid = 2;</code>
     */
    com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBidOrBuilder getSeatbidOrBuilder(
        int index);

    /**
     * <pre>
     * Bidder generated response ID to assist with logging/tracking.
     * </pre>
     *
     * <code>optional string bidid = 3;</code>
     * @return Whether the bidid field is set.
     */
    boolean hasBidid();
    /**
     * <pre>
     * Bidder generated response ID to assist with logging/tracking.
     * </pre>
     *
     * <code>optional string bidid = 3;</code>
     * @return The bidid.
     */
    java.lang.String getBidid();
    /**
     * <pre>
     * Bidder generated response ID to assist with logging/tracking.
     * </pre>
     *
     * <code>optional string bidid = 3;</code>
     * @return The bytes for bidid.
     */
    com.google.protobuf.ByteString
        getBididBytes();

    /**
     * <pre>
     * Bid currency using ISO-4217 alpha codes.
     * </pre>
     *
     * <code>optional string cur = 4;</code>
     * @return Whether the cur field is set.
     */
    boolean hasCur();
    /**
     * <pre>
     * Bid currency using ISO-4217 alpha codes.
     * </pre>
     *
     * <code>optional string cur = 4;</code>
     * @return The cur.
     */
    java.lang.String getCur();
    /**
     * <pre>
     * Bid currency using ISO-4217 alpha codes.
     * </pre>
     *
     * <code>optional string cur = 4;</code>
     * @return The bytes for cur.
     */
    com.google.protobuf.ByteString
        getCurBytes();

    /**
     * <pre>
     * Optional feature to allow a bidder to set data in the exchange's cookie.
     * The string must be in base85 cookie safe characters and be in any format.
     * Proper JSON encoding must be used to include "escaped" quotation marks.
     * </pre>
     *
     * <code>optional string customdata = 5;</code>
     * @return Whether the customdata field is set.
     */
    boolean hasCustomdata();
    /**
     * <pre>
     * Optional feature to allow a bidder to set data in the exchange's cookie.
     * The string must be in base85 cookie safe characters and be in any format.
     * Proper JSON encoding must be used to include "escaped" quotation marks.
     * </pre>
     *
     * <code>optional string customdata = 5;</code>
     * @return The customdata.
     */
    java.lang.String getCustomdata();
    /**
     * <pre>
     * Optional feature to allow a bidder to set data in the exchange's cookie.
     * The string must be in base85 cookie safe characters and be in any format.
     * Proper JSON encoding must be used to include "escaped" quotation marks.
     * </pre>
     *
     * <code>optional string customdata = 5;</code>
     * @return The bytes for customdata.
     */
    com.google.protobuf.ByteString
        getCustomdataBytes();

    /**
     * <pre>
     * Reason for not bidding.
     * Refer to enum com.iabtechlab.openrtb.v3.NoBidReason for generic values.
     * </pre>
     *
     * <code>optional int32 nbr = 6;</code>
     * @return Whether the nbr field is set.
     */
    boolean hasNbr();
    /**
     * <pre>
     * Reason for not bidding.
     * Refer to enum com.iabtechlab.openrtb.v3.NoBidReason for generic values.
     * </pre>
     *
     * <code>optional int32 nbr = 6;</code>
     * @return The nbr.
     */
    int getNbr();
  }
  /**
   * <pre>
   * OpenRTB 2.0: This object is the top-level bid response object (i.e., the
   * unnamed outer JSON object). The id attribute is a reflection of the bid
   * request ID for logging purposes. Similarly, bidid is an optional response
   * tracking ID for bidders. If specified, it can be included in the subsequent
   * win notice call if the bidder wins. At least one seatbid object is required,
   * which contains at least one bid for an impression. Other attributes are
   * optional. To express a "no-bid", the options are to return an empty response
   * with HTTP 204. Alternately if the bidder wishes to convey to the exchange a
   * reason for not bidding, just a BidResponse object is returned with a
   * reason code in the nbr attribute.
   * </pre>
   *
   * Protobuf type {@code com.iabtechlab.openrtb.v2.BidResponse}
   */
  public static final class BidResponse extends
      com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
        BidResponse> implements
      // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.BidResponse)
      BidResponseOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use BidResponse.newBuilder() to construct.
    private BidResponse(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.BidResponse, ?> builder) {
      super(builder);
    }
    private BidResponse() {
      id_ = "";
      seatbid_ = java.util.Collections.emptyList();
      bidid_ = "";
      cur_ = "";
      customdata_ = "";
    }

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

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    private BidResponse(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      this();
      if (extensionRegistry == null) {
        throw new java.lang.NullPointerException();
      }
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            case 10: {
              com.google.protobuf.ByteString bs = input.readBytes();
              bitField0_ |= 0x00000001;
              id_ = bs;
              break;
            }
            case 18: {
              if (!((mutable_bitField0_ & 0x00000002) != 0)) {
                seatbid_ = new java.util.ArrayList<com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid>();
                mutable_bitField0_ |= 0x00000002;
              }
              seatbid_.add(
                  input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.PARSER, extensionRegistry));
              break;
            }
            case 26: {
              com.google.protobuf.ByteString bs = input.readBytes();
              bitField0_ |= 0x00000002;
              bidid_ = bs;
              break;
            }
            case 34: {
              com.google.protobuf.ByteString bs = input.readBytes();
              bitField0_ |= 0x00000004;
              cur_ = bs;
              break;
            }
            case 42: {
              com.google.protobuf.ByteString bs = input.readBytes();
              bitField0_ |= 0x00000008;
              customdata_ = bs;
              break;
            }
            case 48: {
              bitField0_ |= 0x00000010;
              nbr_ = input.readInt32();
              break;
            }
            default: {
              if (!parseUnknownField(
                  input, unknownFields, extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e).setUnfinishedMessage(this);
      } finally {
        if (((mutable_bitField0_ & 0x00000002) != 0)) {
          seatbid_ = java.util.Collections.unmodifiableList(seatbid_);
        }
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidResponse_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidResponse_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.class, com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.Builder.class);
    }

    public interface SeatBidOrBuilder extends
        // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.BidResponse.SeatBid)
        com.google.protobuf.GeneratedMessageV3.
            ExtendableMessageOrBuilder<SeatBid> {

      /**
       * <pre>
       * Array of 1+ Bid objects (Section 4.2.3) each related to an impression.
       * Multiple bids can relate to the same impression.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid.Bid bid = 1;</code>
       */
      java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid> 
          getBidList();
      /**
       * <pre>
       * Array of 1+ Bid objects (Section 4.2.3) each related to an impression.
       * Multiple bids can relate to the same impression.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid.Bid bid = 1;</code>
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid getBid(int index);
      /**
       * <pre>
       * Array of 1+ Bid objects (Section 4.2.3) each related to an impression.
       * Multiple bids can relate to the same impression.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid.Bid bid = 1;</code>
       */
      int getBidCount();
      /**
       * <pre>
       * Array of 1+ Bid objects (Section 4.2.3) each related to an impression.
       * Multiple bids can relate to the same impression.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid.Bid bid = 1;</code>
       */
      java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.BidOrBuilder> 
          getBidOrBuilderList();
      /**
       * <pre>
       * Array of 1+ Bid objects (Section 4.2.3) each related to an impression.
       * Multiple bids can relate to the same impression.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid.Bid bid = 1;</code>
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.BidOrBuilder getBidOrBuilder(
          int index);

      /**
       * <pre>
       * ID of the buyer seat (e.g., advertiser, agency) on whose behalf
       * this bid is made.
       * This ID will be used to breakdown spend and invalid traffic metrics in
       * IVT transparency reporting, given that it is no longer than 64 bytes.
       * </pre>
       *
       * <code>optional string seat = 2;</code>
       * @return Whether the seat field is set.
       */
      boolean hasSeat();
      /**
       * <pre>
       * ID of the buyer seat (e.g., advertiser, agency) on whose behalf
       * this bid is made.
       * This ID will be used to breakdown spend and invalid traffic metrics in
       * IVT transparency reporting, given that it is no longer than 64 bytes.
       * </pre>
       *
       * <code>optional string seat = 2;</code>
       * @return The seat.
       */
      java.lang.String getSeat();
      /**
       * <pre>
       * ID of the buyer seat (e.g., advertiser, agency) on whose behalf
       * this bid is made.
       * This ID will be used to breakdown spend and invalid traffic metrics in
       * IVT transparency reporting, given that it is no longer than 64 bytes.
       * </pre>
       *
       * <code>optional string seat = 2;</code>
       * @return The bytes for seat.
       */
      com.google.protobuf.ByteString
          getSeatBytes();

      /**
       * <pre>
       * 0 = impressions can be won individually; 1 = impressions must be won or
       * lost as a group.
       * </pre>
       *
       * <code>optional bool group = 3 [default = false];</code>
       * @return Whether the group field is set.
       */
      boolean hasGroup();
      /**
       * <pre>
       * 0 = impressions can be won individually; 1 = impressions must be won or
       * lost as a group.
       * </pre>
       *
       * <code>optional bool group = 3 [default = false];</code>
       * @return The group.
       */
      boolean getGroup();
    }
    /**
     * <pre>
     * OpenRTB 2.0: A bid response can contain multiple SeatBid objects, each on
     * behalf of a different bidder seat and each containing one or more
     * individual bids. If multiple impressions are presented in the request, the
     * group attribute can be used to specify if a seat is willing to accept any
     * impressions that it can win (default) or if it is only interested in
     * winning any if it can win them all as a group.
     * </pre>
     *
     * Protobuf type {@code com.iabtechlab.openrtb.v2.BidResponse.SeatBid}
     */
    public static final class SeatBid extends
        com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
          SeatBid> implements
        // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.BidResponse.SeatBid)
        SeatBidOrBuilder {
    private static final long serialVersionUID = 0L;
      // Use SeatBid.newBuilder() to construct.
      private SeatBid(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid, ?> builder) {
        super(builder);
      }
      private SeatBid() {
        bid_ = java.util.Collections.emptyList();
        seat_ = "";
      }

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

      @java.lang.Override
      public final com.google.protobuf.UnknownFieldSet
      getUnknownFields() {
        return this.unknownFields;
      }
      private SeatBid(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        this();
        if (extensionRegistry == null) {
          throw new java.lang.NullPointerException();
        }
        int mutable_bitField0_ = 0;
        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
            com.google.protobuf.UnknownFieldSet.newBuilder();
        try {
          boolean done = false;
          while (!done) {
            int tag = input.readTag();
            switch (tag) {
              case 0:
                done = true;
                break;
              case 10: {
                if (!((mutable_bitField0_ & 0x00000001) != 0)) {
                  bid_ = new java.util.ArrayList<com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid>();
                  mutable_bitField0_ |= 0x00000001;
                }
                bid_.add(
                    input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid.PARSER, extensionRegistry));
                break;
              }
              case 18: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000001;
                seat_ = bs;
                break;
              }
              case 24: {
                bitField0_ |= 0x00000002;
                group_ = input.readBool();
                break;
              }
              default: {
                if (!parseUnknownField(
                    input, unknownFields, extensionRegistry, tag)) {
                  done = true;
                }
                break;
              }
            }
          }
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          throw e.setUnfinishedMessage(this);
        } catch (java.io.IOException e) {
          throw new com.google.protobuf.InvalidProtocolBufferException(
              e).setUnfinishedMessage(this);
        } finally {
          if (((mutable_bitField0_ & 0x00000001) != 0)) {
            bid_ = java.util.Collections.unmodifiableList(bid_);
          }
          this.unknownFields = unknownFields.build();
          makeExtensionsImmutable();
        }
      }
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidResponse_SeatBid_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidResponse_SeatBid_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.class, com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Builder.class);
      }

      public interface BidOrBuilder extends
          // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.BidResponse.SeatBid.Bid)
          com.google.protobuf.GeneratedMessageV3.
              ExtendableMessageOrBuilder<Bid> {

        /**
         * <pre>
         * Bidder generated bid ID to assist with logging/tracking.
         * REQUIRED by the OpenRTB specification.
         * </pre>
         *
         * <code>required string id = 1;</code>
         * @return Whether the id field is set.
         */
        boolean hasId();
        /**
         * <pre>
         * Bidder generated bid ID to assist with logging/tracking.
         * REQUIRED by the OpenRTB specification.
         * </pre>
         *
         * <code>required string id = 1;</code>
         * @return The id.
         */
        java.lang.String getId();
        /**
         * <pre>
         * Bidder generated bid ID to assist with logging/tracking.
         * REQUIRED by the OpenRTB specification.
         * </pre>
         *
         * <code>required string id = 1;</code>
         * @return The bytes for id.
         */
        com.google.protobuf.ByteString
            getIdBytes();

        /**
         * <pre>
         * ID of the Imp object in the related bid request.
         * REQUIRED by the OpenRTB specification.
         * </pre>
         *
         * <code>required string impid = 2;</code>
         * @return Whether the impid field is set.
         */
        boolean hasImpid();
        /**
         * <pre>
         * ID of the Imp object in the related bid request.
         * REQUIRED by the OpenRTB specification.
         * </pre>
         *
         * <code>required string impid = 2;</code>
         * @return The impid.
         */
        java.lang.String getImpid();
        /**
         * <pre>
         * ID of the Imp object in the related bid request.
         * REQUIRED by the OpenRTB specification.
         * </pre>
         *
         * <code>required string impid = 2;</code>
         * @return The bytes for impid.
         */
        com.google.protobuf.ByteString
            getImpidBytes();

        /**
         * <pre>
         * Bid price expressed as CPM although the actual transaction is for a
         * unit impression only. Note that while the type indicates float, integer
         * math is highly recommended when handling currencies
         * (e.g., BigDecimal in Java).
         * REQUIRED by the OpenRTB specification.
         * </pre>
         *
         * <code>required double price = 3;</code>
         * @return Whether the price field is set.
         */
        boolean hasPrice();
        /**
         * <pre>
         * Bid price expressed as CPM although the actual transaction is for a
         * unit impression only. Note that while the type indicates float, integer
         * math is highly recommended when handling currencies
         * (e.g., BigDecimal in Java).
         * REQUIRED by the OpenRTB specification.
         * </pre>
         *
         * <code>required double price = 3;</code>
         * @return The price.
         */
        double getPrice();

        /**
         * <pre>
         * ID of a preloaded ad to be served if the bid wins.
         * </pre>
         *
         * <code>optional string adid = 4;</code>
         * @return Whether the adid field is set.
         */
        boolean hasAdid();
        /**
         * <pre>
         * ID of a preloaded ad to be served if the bid wins.
         * </pre>
         *
         * <code>optional string adid = 4;</code>
         * @return The adid.
         */
        java.lang.String getAdid();
        /**
         * <pre>
         * ID of a preloaded ad to be served if the bid wins.
         * </pre>
         *
         * <code>optional string adid = 4;</code>
         * @return The bytes for adid.
         */
        com.google.protobuf.ByteString
            getAdidBytes();

        /**
         * <pre>
         * Win notice URL called by the exchange if the bid wins; optional means
         * of serving ad markup.
         * </pre>
         *
         * <code>optional string nurl = 5;</code>
         * @return Whether the nurl field is set.
         */
        boolean hasNurl();
        /**
         * <pre>
         * Win notice URL called by the exchange if the bid wins; optional means
         * of serving ad markup.
         * </pre>
         *
         * <code>optional string nurl = 5;</code>
         * @return The nurl.
         */
        java.lang.String getNurl();
        /**
         * <pre>
         * Win notice URL called by the exchange if the bid wins; optional means
         * of serving ad markup.
         * </pre>
         *
         * <code>optional string nurl = 5;</code>
         * @return The bytes for nurl.
         */
        com.google.protobuf.ByteString
            getNurlBytes();

        /**
         * <pre>
         * Optional means of conveying ad markup in case the bid wins;
         * supersedes the win notice if markup is included in both.
         * For native ad bids, exactly one of {adm, adm_native} should be used;
         * this is the OpenRTB-compliant field for JSON serialization.
         * </pre>
         *
         * <code>string adm = 6;</code>
         * @return Whether the adm field is set.
         */
        boolean hasAdm();
        /**
         * <pre>
         * Optional means of conveying ad markup in case the bid wins;
         * supersedes the win notice if markup is included in both.
         * For native ad bids, exactly one of {adm, adm_native} should be used;
         * this is the OpenRTB-compliant field for JSON serialization.
         * </pre>
         *
         * <code>string adm = 6;</code>
         * @return The adm.
         */
        java.lang.String getAdm();
        /**
         * <pre>
         * Optional means of conveying ad markup in case the bid wins;
         * supersedes the win notice if markup is included in both.
         * For native ad bids, exactly one of {adm, adm_native} should be used;
         * this is the OpenRTB-compliant field for JSON serialization.
         * </pre>
         *
         * <code>string adm = 6;</code>
         * @return The bytes for adm.
         */
        com.google.protobuf.ByteString
            getAdmBytes();

        /**
         * <pre>
         * Native ad response.
         * For native ad bids, exactly one of {adm, adm_native} should be used;
         * this is the field used for Protobuf serialization.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeResponse adm_native = 50;</code>
         * @return Whether the admNative field is set.
         */
        boolean hasAdmNative();
        /**
         * <pre>
         * Native ad response.
         * For native ad bids, exactly one of {adm, adm_native} should be used;
         * this is the field used for Protobuf serialization.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeResponse adm_native = 50;</code>
         * @return The admNative.
         */
        com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse getAdmNative();
        /**
         * <pre>
         * Native ad response.
         * For native ad bids, exactly one of {adm, adm_native} should be used;
         * this is the field used for Protobuf serialization.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeResponse adm_native = 50;</code>
         */
        com.iabtechlab.openrtb.v2.OpenRtb.NativeResponseOrBuilder getAdmNativeOrBuilder();

        /**
         * <pre>
         * Advertiser domain for block list checking (e.g., "ford.com"). This can
         * be an array of for the case of rotating creatives. Exchanges can
         * mandate that only one domain is allowed.
         * </pre>
         *
         * <code>repeated string adomain = 7;</code>
         * @return A list containing the adomain.
         */
        java.util.List<java.lang.String>
            getAdomainList();
        /**
         * <pre>
         * Advertiser domain for block list checking (e.g., "ford.com"). This can
         * be an array of for the case of rotating creatives. Exchanges can
         * mandate that only one domain is allowed.
         * </pre>
         *
         * <code>repeated string adomain = 7;</code>
         * @return The count of adomain.
         */
        int getAdomainCount();
        /**
         * <pre>
         * Advertiser domain for block list checking (e.g., "ford.com"). This can
         * be an array of for the case of rotating creatives. Exchanges can
         * mandate that only one domain is allowed.
         * </pre>
         *
         * <code>repeated string adomain = 7;</code>
         * @param index The index of the element to return.
         * @return The adomain at the given index.
         */
        java.lang.String getAdomain(int index);
        /**
         * <pre>
         * Advertiser domain for block list checking (e.g., "ford.com"). This can
         * be an array of for the case of rotating creatives. Exchanges can
         * mandate that only one domain is allowed.
         * </pre>
         *
         * <code>repeated string adomain = 7;</code>
         * @param index The index of the value to return.
         * @return The bytes of the adomain at the given index.
         */
        com.google.protobuf.ByteString
            getAdomainBytes(int index);

        /**
         * <pre>
         * A platform-specific application identifier intended to be
         * unique to the app and independent of the exchange. On Android,
         * this should be a bundle or package name (e.g., com.foo.mygame).
         * On iOS, it is a numeric ID.
         * </pre>
         *
         * <code>optional string bundle = 14;</code>
         * @return Whether the bundle field is set.
         */
        boolean hasBundle();
        /**
         * <pre>
         * A platform-specific application identifier intended to be
         * unique to the app and independent of the exchange. On Android,
         * this should be a bundle or package name (e.g., com.foo.mygame).
         * On iOS, it is a numeric ID.
         * </pre>
         *
         * <code>optional string bundle = 14;</code>
         * @return The bundle.
         */
        java.lang.String getBundle();
        /**
         * <pre>
         * A platform-specific application identifier intended to be
         * unique to the app and independent of the exchange. On Android,
         * this should be a bundle or package name (e.g., com.foo.mygame).
         * On iOS, it is a numeric ID.
         * </pre>
         *
         * <code>optional string bundle = 14;</code>
         * @return The bytes for bundle.
         */
        com.google.protobuf.ByteString
            getBundleBytes();

        /**
         * <pre>
         * URL without cache-busting to an image that is representative of the
         * content of the campaign for ad quality/safety checking.
         * </pre>
         *
         * <code>optional string iurl = 8;</code>
         * @return Whether the iurl field is set.
         */
        boolean hasIurl();
        /**
         * <pre>
         * URL without cache-busting to an image that is representative of the
         * content of the campaign for ad quality/safety checking.
         * </pre>
         *
         * <code>optional string iurl = 8;</code>
         * @return The iurl.
         */
        java.lang.String getIurl();
        /**
         * <pre>
         * URL without cache-busting to an image that is representative of the
         * content of the campaign for ad quality/safety checking.
         * </pre>
         *
         * <code>optional string iurl = 8;</code>
         * @return The bytes for iurl.
         */
        com.google.protobuf.ByteString
            getIurlBytes();

        /**
         * <pre>
         * Campaign ID to assist with ad quality checking; the collection of
         * creatives for which iurl should be representative.
         * </pre>
         *
         * <code>optional string cid = 9;</code>
         * @return Whether the cid field is set.
         */
        boolean hasCid();
        /**
         * <pre>
         * Campaign ID to assist with ad quality checking; the collection of
         * creatives for which iurl should be representative.
         * </pre>
         *
         * <code>optional string cid = 9;</code>
         * @return The cid.
         */
        java.lang.String getCid();
        /**
         * <pre>
         * Campaign ID to assist with ad quality checking; the collection of
         * creatives for which iurl should be representative.
         * </pre>
         *
         * <code>optional string cid = 9;</code>
         * @return The bytes for cid.
         */
        com.google.protobuf.ByteString
            getCidBytes();

        /**
         * <pre>
         * Creative ID to assist with ad quality checking.
         * </pre>
         *
         * <code>optional string crid = 10;</code>
         * @return Whether the crid field is set.
         */
        boolean hasCrid();
        /**
         * <pre>
         * Creative ID to assist with ad quality checking.
         * </pre>
         *
         * <code>optional string crid = 10;</code>
         * @return The crid.
         */
        java.lang.String getCrid();
        /**
         * <pre>
         * Creative ID to assist with ad quality checking.
         * </pre>
         *
         * <code>optional string crid = 10;</code>
         * @return The bytes for crid.
         */
        com.google.protobuf.ByteString
            getCridBytes();

        /**
         * <pre>
         * The taxonomy in use.
         * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
         * </pre>
         *
         * <code>optional int32 cattax = 30 [default = 1];</code>
         * @return Whether the cattax field is set.
         */
        boolean hasCattax();
        /**
         * <pre>
         * The taxonomy in use.
         * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
         * </pre>
         *
         * <code>optional int32 cattax = 30 [default = 1];</code>
         * @return The cattax.
         */
        int getCattax();

        /**
         * <pre>
         * IAB content categories of the creative.
         * </pre>
         *
         * <code>repeated string cat = 15;</code>
         * @return A list containing the cat.
         */
        java.util.List<java.lang.String>
            getCatList();
        /**
         * <pre>
         * IAB content categories of the creative.
         * </pre>
         *
         * <code>repeated string cat = 15;</code>
         * @return The count of cat.
         */
        int getCatCount();
        /**
         * <pre>
         * IAB content categories of the creative.
         * </pre>
         *
         * <code>repeated string cat = 15;</code>
         * @param index The index of the element to return.
         * @return The cat at the given index.
         */
        java.lang.String getCat(int index);
        /**
         * <pre>
         * IAB content categories of the creative.
         * </pre>
         *
         * <code>repeated string cat = 15;</code>
         * @param index The index of the value to return.
         * @return The bytes of the cat at the given index.
         */
        com.google.protobuf.ByteString
            getCatBytes(int index);

        /**
         * <pre>
         * Set of attributes describing the creative.
         * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
         * </pre>
         *
         * <code>repeated int32 attr = 11 [packed = true];</code>
         * @return A list containing the attr.
         */
        java.util.List<java.lang.Integer> getAttrList();
        /**
         * <pre>
         * Set of attributes describing the creative.
         * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
         * </pre>
         *
         * <code>repeated int32 attr = 11 [packed = true];</code>
         * @return The count of attr.
         */
        int getAttrCount();
        /**
         * <pre>
         * Set of attributes describing the creative.
         * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
         * </pre>
         *
         * <code>repeated int32 attr = 11 [packed = true];</code>
         * @param index The index of the element to return.
         * @return The attr at the given index.
         */
        int getAttr(int index);

        /**
         * <pre>
         * List of supported APIs for the markup. If an API is not explicitly
         * listed, it is assumed to be unsupported.
         * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
         * </pre>
         *
         * <code>repeated int32 apis = 31 [packed = true];</code>
         * @return A list containing the apis.
         */
        java.util.List<java.lang.Integer> getApisList();
        /**
         * <pre>
         * List of supported APIs for the markup. If an API is not explicitly
         * listed, it is assumed to be unsupported.
         * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
         * </pre>
         *
         * <code>repeated int32 apis = 31 [packed = true];</code>
         * @return The count of apis.
         */
        int getApisCount();
        /**
         * <pre>
         * List of supported APIs for the markup. If an API is not explicitly
         * listed, it is assumed to be unsupported.
         * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
         * </pre>
         *
         * <code>repeated int32 apis = 31 [packed = true];</code>
         * @param index The index of the element to return.
         * @return The apis at the given index.
         */
        int getApis(int index);

        /**
         * <pre>
         * API required by the markup if applicable.
         * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
         * </pre>
         *
         * <code>optional int32 api = 18 [deprecated = true];</code>
         * @return Whether the api field is set.
         */
        @java.lang.Deprecated boolean hasApi();
        /**
         * <pre>
         * API required by the markup if applicable.
         * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
         * </pre>
         *
         * <code>optional int32 api = 18 [deprecated = true];</code>
         * @return The api.
         */
        @java.lang.Deprecated int getApi();

        /**
         * <pre>
         * Video response protocol of the markup if applicable.
         * Refer to enum com.iabtechlab.adcom.v1.Creative.AudioVideoType for generic values.
         * </pre>
         *
         * <code>optional int32 protocol = 19;</code>
         * @return Whether the protocol field is set.
         */
        boolean hasProtocol();
        /**
         * <pre>
         * Video response protocol of the markup if applicable.
         * Refer to enum com.iabtechlab.adcom.v1.Creative.AudioVideoType for generic values.
         * </pre>
         *
         * <code>optional int32 protocol = 19;</code>
         * @return The protocol.
         */
        int getProtocol();

        /**
         * <pre>
         * Creative media rating per QAG guidelines.
         * Refer to enum com.iabtechlab.adcom.v1.MediaRating for generic values.
         * </pre>
         *
         * <code>optional int32 qagmediarating = 20;</code>
         * @return Whether the qagmediarating field is set.
         */
        boolean hasQagmediarating();
        /**
         * <pre>
         * Creative media rating per QAG guidelines.
         * Refer to enum com.iabtechlab.adcom.v1.MediaRating for generic values.
         * </pre>
         *
         * <code>optional int32 qagmediarating = 20;</code>
         * @return The qagmediarating.
         */
        int getQagmediarating();

        /**
         * <pre>
         * Reference to the deal.id from the bid request if this bid pertains to a
         * private marketplace direct deal.
         * </pre>
         *
         * <code>optional string dealid = 13;</code>
         * @return Whether the dealid field is set.
         */
        boolean hasDealid();
        /**
         * <pre>
         * Reference to the deal.id from the bid request if this bid pertains to a
         * private marketplace direct deal.
         * </pre>
         *
         * <code>optional string dealid = 13;</code>
         * @return The dealid.
         */
        java.lang.String getDealid();
        /**
         * <pre>
         * Reference to the deal.id from the bid request if this bid pertains to a
         * private marketplace direct deal.
         * </pre>
         *
         * <code>optional string dealid = 13;</code>
         * @return The bytes for dealid.
         */
        com.google.protobuf.ByteString
            getDealidBytes();

        /**
         * <pre>
         * Width of the creative in device independent pixels (DIPS).
         * </pre>
         *
         * <code>optional int32 w = 16;</code>
         * @return Whether the w field is set.
         */
        boolean hasW();
        /**
         * <pre>
         * Width of the creative in device independent pixels (DIPS).
         * </pre>
         *
         * <code>optional int32 w = 16;</code>
         * @return The w.
         */
        int getW();

        /**
         * <pre>
         * Height of the creative in device independent pixels (DIPS).
         * </pre>
         *
         * <code>optional int32 h = 17;</code>
         * @return Whether the h field is set.
         */
        boolean hasH();
        /**
         * <pre>
         * Height of the creative in device independent pixels (DIPS).
         * </pre>
         *
         * <code>optional int32 h = 17;</code>
         * @return The h.
         */
        int getH();

        /**
         * <pre>
         * Advisory as to the number of seconds the bidder is willing to
         * wait between the auction and the actual impression.
         * </pre>
         *
         * <code>optional int32 exp = 21;</code>
         * @return Whether the exp field is set.
         */
        boolean hasExp();
        /**
         * <pre>
         * Advisory as to the number of seconds the bidder is willing to
         * wait between the auction and the actual impression.
         * </pre>
         *
         * <code>optional int32 exp = 21;</code>
         * @return The exp.
         */
        int getExp();

        /**
         * <pre>
         * Billing notice URL called by the exchange when a winning bid
         * becomes billable based on exchange-specific business policy
         * (e.g., typically delivered, viewed, etc.). Substitution macros
         * (Section 4.4) may be included.
         * </pre>
         *
         * <code>optional string burl = 22;</code>
         * @return Whether the burl field is set.
         */
        boolean hasBurl();
        /**
         * <pre>
         * Billing notice URL called by the exchange when a winning bid
         * becomes billable based on exchange-specific business policy
         * (e.g., typically delivered, viewed, etc.). Substitution macros
         * (Section 4.4) may be included.
         * </pre>
         *
         * <code>optional string burl = 22;</code>
         * @return The burl.
         */
        java.lang.String getBurl();
        /**
         * <pre>
         * Billing notice URL called by the exchange when a winning bid
         * becomes billable based on exchange-specific business policy
         * (e.g., typically delivered, viewed, etc.). Substitution macros
         * (Section 4.4) may be included.
         * </pre>
         *
         * <code>optional string burl = 22;</code>
         * @return The bytes for burl.
         */
        com.google.protobuf.ByteString
            getBurlBytes();

        /**
         * <pre>
         * Loss notice URL called by the exchange when a bid is known to
         * have been lost. Substitution macros (Section 4.4) may be
         * included. Exchange-specific policy may preclude support for
         * loss notices or the disclosure of winning clearing prices
         * resulting in ${AUCTION_PRICE} macros being removed (i.e.,
         * replaced with a zero-length string).
         * </pre>
         *
         * <code>optional string lurl = 23;</code>
         * @return Whether the lurl field is set.
         */
        boolean hasLurl();
        /**
         * <pre>
         * Loss notice URL called by the exchange when a bid is known to
         * have been lost. Substitution macros (Section 4.4) may be
         * included. Exchange-specific policy may preclude support for
         * loss notices or the disclosure of winning clearing prices
         * resulting in ${AUCTION_PRICE} macros being removed (i.e.,
         * replaced with a zero-length string).
         * </pre>
         *
         * <code>optional string lurl = 23;</code>
         * @return The lurl.
         */
        java.lang.String getLurl();
        /**
         * <pre>
         * Loss notice URL called by the exchange when a bid is known to
         * have been lost. Substitution macros (Section 4.4) may be
         * included. Exchange-specific policy may preclude support for
         * loss notices or the disclosure of winning clearing prices
         * resulting in ${AUCTION_PRICE} macros being removed (i.e.,
         * replaced with a zero-length string).
         * </pre>
         *
         * <code>optional string lurl = 23;</code>
         * @return The bytes for lurl.
         */
        com.google.protobuf.ByteString
            getLurlBytes();

        /**
         * <pre>
         * Tactic ID to enable buyers to label bids for reporting to the
         * exchange the tactic through which their bid was submitted.
         * The specific usage and meaning of the tactic ID should be
         * communicated between buyer and exchanges a priori.
         * </pre>
         *
         * <code>optional string tactic = 24;</code>
         * @return Whether the tactic field is set.
         */
        boolean hasTactic();
        /**
         * <pre>
         * Tactic ID to enable buyers to label bids for reporting to the
         * exchange the tactic through which their bid was submitted.
         * The specific usage and meaning of the tactic ID should be
         * communicated between buyer and exchanges a priori.
         * </pre>
         *
         * <code>optional string tactic = 24;</code>
         * @return The tactic.
         */
        java.lang.String getTactic();
        /**
         * <pre>
         * Tactic ID to enable buyers to label bids for reporting to the
         * exchange the tactic through which their bid was submitted.
         * The specific usage and meaning of the tactic ID should be
         * communicated between buyer and exchanges a priori.
         * </pre>
         *
         * <code>optional string tactic = 24;</code>
         * @return The bytes for tactic.
         */
        com.google.protobuf.ByteString
            getTacticBytes();

        /**
         * <pre>
         * Language of the creative using ISO-639-1-alpha-2. The nonstandard
         * code "xx" may also be used if the creative has no
         * linguistic content (e.g., a banner with just a company logo).
         * </pre>
         *
         * <code>optional string language = 25;</code>
         * @return Whether the language field is set.
         */
        boolean hasLanguage();
        /**
         * <pre>
         * Language of the creative using ISO-639-1-alpha-2. The nonstandard
         * code "xx" may also be used if the creative has no
         * linguistic content (e.g., a banner with just a company logo).
         * </pre>
         *
         * <code>optional string language = 25;</code>
         * @return The language.
         */
        java.lang.String getLanguage();
        /**
         * <pre>
         * Language of the creative using ISO-639-1-alpha-2. The nonstandard
         * code "xx" may also be used if the creative has no
         * linguistic content (e.g., a banner with just a company logo).
         * </pre>
         *
         * <code>optional string language = 25;</code>
         * @return The bytes for language.
         */
        com.google.protobuf.ByteString
            getLanguageBytes();

        /**
         * <pre>
         * Language of the creative using IETF BCP 47. Only one of language or
         * langb should be present.
         * </pre>
         *
         * <code>optional string langb = 29;</code>
         * @return Whether the langb field is set.
         */
        boolean hasLangb();
        /**
         * <pre>
         * Language of the creative using IETF BCP 47. Only one of language or
         * langb should be present.
         * </pre>
         *
         * <code>optional string langb = 29;</code>
         * @return The langb.
         */
        java.lang.String getLangb();
        /**
         * <pre>
         * Language of the creative using IETF BCP 47. Only one of language or
         * langb should be present.
         * </pre>
         *
         * <code>optional string langb = 29;</code>
         * @return The bytes for langb.
         */
        com.google.protobuf.ByteString
            getLangbBytes();

        /**
         * <pre>
         * Relative width of the creative when expressing size as a ratio.
         * Required for Flex Ads.
         * </pre>
         *
         * <code>optional int32 wratio = 26;</code>
         * @return Whether the wratio field is set.
         */
        boolean hasWratio();
        /**
         * <pre>
         * Relative width of the creative when expressing size as a ratio.
         * Required for Flex Ads.
         * </pre>
         *
         * <code>optional int32 wratio = 26;</code>
         * @return The wratio.
         */
        int getWratio();

        /**
         * <pre>
         * Relative height of the creative when expressing size as a ratio.
         * Required for Flex Ads.
         * </pre>
         *
         * <code>optional int32 hratio = 27;</code>
         * @return Whether the hratio field is set.
         */
        boolean hasHratio();
        /**
         * <pre>
         * Relative height of the creative when expressing size as a ratio.
         * Required for Flex Ads.
         * </pre>
         *
         * <code>optional int32 hratio = 27;</code>
         * @return The hratio.
         */
        int getHratio();

        /**
         * <pre>
         * Duration of the video or audio creative in seconds.
         * </pre>
         *
         * <code>optional int32 dur = 32;</code>
         * @return Whether the dur field is set.
         */
        boolean hasDur();
        /**
         * <pre>
         * Duration of the video or audio creative in seconds.
         * </pre>
         *
         * <code>optional int32 dur = 32;</code>
         * @return The dur.
         */
        int getDur();

        /**
         * <pre>
         * Type of the creative markup so that it can properly be associated with
         * the right sub-object of the BidRequest.Imp.
         * </pre>
         *
         * <code>optional int32 mtype = 33;</code>
         * @return Whether the mtype field is set.
         */
        boolean hasMtype();
        /**
         * <pre>
         * Type of the creative markup so that it can properly be associated with
         * the right sub-object of the BidRequest.Imp.
         * </pre>
         *
         * <code>optional int32 mtype = 33;</code>
         * @return The mtype.
         */
        int getMtype();

        /**
         * <pre>
         * Indicates that the bid response is only eligible for a specific
         * position within a video or audio ad pod (e.g. first position, last
         * position, or any).
         * </pre>
         *
         * <code>optional int32 slotinpod = 28 [default = 0];</code>
         * @return Whether the slotinpod field is set.
         */
        boolean hasSlotinpod();
        /**
         * <pre>
         * Indicates that the bid response is only eligible for a specific
         * position within a video or audio ad pod (e.g. first position, last
         * position, or any).
         * </pre>
         *
         * <code>optional int32 slotinpod = 28 [default = 0];</code>
         * @return The slotinpod.
         */
        int getSlotinpod();

        public com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid.AdmOneofCase getAdmOneofCase();
      }
      /**
       * <pre>
       * OpenRTB 2.0: A SeatBid object contains one or more Bid objects,
       * each of which relates to a specific impression in the bid request
       * via the impid attribute and constitutes an offer to buy that impression
       * for a given price.
       * </pre>
       *
       * Protobuf type {@code com.iabtechlab.openrtb.v2.BidResponse.SeatBid.Bid}
       */
      public static final class Bid extends
          com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
            Bid> implements
          // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.BidResponse.SeatBid.Bid)
          BidOrBuilder {
      private static final long serialVersionUID = 0L;
        // Use Bid.newBuilder() to construct.
        private Bid(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid, ?> builder) {
          super(builder);
        }
        private Bid() {
          id_ = "";
          impid_ = "";
          adid_ = "";
          nurl_ = "";
          adomain_ = com.google.protobuf.LazyStringArrayList.EMPTY;
          bundle_ = "";
          iurl_ = "";
          cid_ = "";
          crid_ = "";
          cattax_ = 1;
          cat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
          attr_ = emptyIntList();
          apis_ = emptyIntList();
          dealid_ = "";
          burl_ = "";
          lurl_ = "";
          tactic_ = "";
          language_ = "";
          langb_ = "";
        }

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

        @java.lang.Override
        public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
          return this.unknownFields;
        }
        private Bid(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          this();
          if (extensionRegistry == null) {
            throw new java.lang.NullPointerException();
          }
          int mutable_bitField0_ = 0;
          int mutable_bitField1_ = 0;
          com.google.protobuf.UnknownFieldSet.Builder unknownFields =
              com.google.protobuf.UnknownFieldSet.newBuilder();
          try {
            boolean done = false;
            while (!done) {
              int tag = input.readTag();
              switch (tag) {
                case 0:
                  done = true;
                  break;
                case 10: {
                  com.google.protobuf.ByteString bs = input.readBytes();
                  bitField0_ |= 0x00000001;
                  id_ = bs;
                  break;
                }
                case 18: {
                  com.google.protobuf.ByteString bs = input.readBytes();
                  bitField0_ |= 0x00000002;
                  impid_ = bs;
                  break;
                }
                case 25: {
                  bitField0_ |= 0x00000004;
                  price_ = input.readDouble();
                  break;
                }
                case 34: {
                  com.google.protobuf.ByteString bs = input.readBytes();
                  bitField0_ |= 0x00000008;
                  adid_ = bs;
                  break;
                }
                case 42: {
                  com.google.protobuf.ByteString bs = input.readBytes();
                  bitField0_ |= 0x00000010;
                  nurl_ = bs;
                  break;
                }
                case 50: {
                  com.google.protobuf.ByteString bs = input.readBytes();
                  admOneofCase_ = 6;
                  admOneof_ = bs;
                  break;
                }
                case 58: {
                  com.google.protobuf.ByteString bs = input.readBytes();
                  if (!((mutable_bitField0_ & 0x00000080) != 0)) {
                    adomain_ = new com.google.protobuf.LazyStringArrayList();
                    mutable_bitField0_ |= 0x00000080;
                  }
                  adomain_.add(bs);
                  break;
                }
                case 66: {
                  com.google.protobuf.ByteString bs = input.readBytes();
                  bitField0_ |= 0x00000100;
                  iurl_ = bs;
                  break;
                }
                case 74: {
                  com.google.protobuf.ByteString bs = input.readBytes();
                  bitField0_ |= 0x00000200;
                  cid_ = bs;
                  break;
                }
                case 82: {
                  com.google.protobuf.ByteString bs = input.readBytes();
                  bitField0_ |= 0x00000400;
                  crid_ = bs;
                  break;
                }
                case 88: {
                  if (!((mutable_bitField0_ & 0x00004000) != 0)) {
                    attr_ = newIntList();
                    mutable_bitField0_ |= 0x00004000;
                  }
                  attr_.addInt(input.readInt32());
                  break;
                }
                case 90: {
                  int length = input.readRawVarint32();
                  int limit = input.pushLimit(length);
                  if (!((mutable_bitField0_ & 0x00004000) != 0) && input.getBytesUntilLimit() > 0) {
                    attr_ = newIntList();
                    mutable_bitField0_ |= 0x00004000;
                  }
                  while (input.getBytesUntilLimit() > 0) {
                    attr_.addInt(input.readInt32());
                  }
                  input.popLimit(limit);
                  break;
                }
                case 106: {
                  com.google.protobuf.ByteString bs = input.readBytes();
                  bitField0_ |= 0x00008000;
                  dealid_ = bs;
                  break;
                }
                case 114: {
                  com.google.protobuf.ByteString bs = input.readBytes();
                  bitField0_ |= 0x00000080;
                  bundle_ = bs;
                  break;
                }
                case 122: {
                  com.google.protobuf.ByteString bs = input.readBytes();
                  if (!((mutable_bitField0_ & 0x00002000) != 0)) {
                    cat_ = new com.google.protobuf.LazyStringArrayList();
                    mutable_bitField0_ |= 0x00002000;
                  }
                  cat_.add(bs);
                  break;
                }
                case 128: {
                  bitField0_ |= 0x00010000;
                  w_ = input.readInt32();
                  break;
                }
                case 136: {
                  bitField0_ |= 0x00020000;
                  h_ = input.readInt32();
                  break;
                }
                case 144: {
                  bitField0_ |= 0x00001000;
                  api_ = input.readInt32();
                  break;
                }
                case 152: {
                  bitField0_ |= 0x00002000;
                  protocol_ = input.readInt32();
                  break;
                }
                case 160: {
                  bitField0_ |= 0x00004000;
                  qagmediarating_ = input.readInt32();
                  break;
                }
                case 168: {
                  bitField0_ |= 0x00040000;
                  exp_ = input.readInt32();
                  break;
                }
                case 178: {
                  com.google.protobuf.ByteString bs = input.readBytes();
                  bitField0_ |= 0x00080000;
                  burl_ = bs;
                  break;
                }
                case 186: {
                  com.google.protobuf.ByteString bs = input.readBytes();
                  bitField0_ |= 0x00100000;
                  lurl_ = bs;
                  break;
                }
                case 194: {
                  com.google.protobuf.ByteString bs = input.readBytes();
                  bitField0_ |= 0x00200000;
                  tactic_ = bs;
                  break;
                }
                case 202: {
                  com.google.protobuf.ByteString bs = input.readBytes();
                  bitField0_ |= 0x00400000;
                  language_ = bs;
                  break;
                }
                case 208: {
                  bitField0_ |= 0x01000000;
                  wratio_ = input.readInt32();
                  break;
                }
                case 216: {
                  bitField0_ |= 0x02000000;
                  hratio_ = input.readInt32();
                  break;
                }
                case 224: {
                  bitField0_ |= 0x10000000;
                  slotinpod_ = input.readInt32();
                  break;
                }
                case 234: {
                  com.google.protobuf.ByteString bs = input.readBytes();
                  bitField0_ |= 0x00800000;
                  langb_ = bs;
                  break;
                }
                case 240: {
                  bitField0_ |= 0x00000800;
                  cattax_ = input.readInt32();
                  break;
                }
                case 248: {
                  if (!((mutable_bitField0_ & 0x00008000) != 0)) {
                    apis_ = newIntList();
                    mutable_bitField0_ |= 0x00008000;
                  }
                  apis_.addInt(input.readInt32());
                  break;
                }
                case 250: {
                  int length = input.readRawVarint32();
                  int limit = input.pushLimit(length);
                  if (!((mutable_bitField0_ & 0x00008000) != 0) && input.getBytesUntilLimit() > 0) {
                    apis_ = newIntList();
                    mutable_bitField0_ |= 0x00008000;
                  }
                  while (input.getBytesUntilLimit() > 0) {
                    apis_.addInt(input.readInt32());
                  }
                  input.popLimit(limit);
                  break;
                }
                case 256: {
                  bitField0_ |= 0x04000000;
                  dur_ = input.readInt32();
                  break;
                }
                case 264: {
                  bitField0_ |= 0x08000000;
                  mtype_ = input.readInt32();
                  break;
                }
                case 402: {
                  com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Builder subBuilder = null;
                  if (admOneofCase_ == 50) {
                    subBuilder = ((com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse) admOneof_).toBuilder();
                  }
                  admOneof_ =
                      input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.PARSER, extensionRegistry);
                  if (subBuilder != null) {
                    subBuilder.mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse) admOneof_);
                    admOneof_ = subBuilder.buildPartial();
                  }
                  admOneofCase_ = 50;
                  break;
                }
                default: {
                  if (!parseUnknownField(
                      input, unknownFields, extensionRegistry, tag)) {
                    done = true;
                  }
                  break;
                }
              }
            }
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            throw e.setUnfinishedMessage(this);
          } catch (java.io.IOException e) {
            throw new com.google.protobuf.InvalidProtocolBufferException(
                e).setUnfinishedMessage(this);
          } finally {
            if (((mutable_bitField0_ & 0x00000080) != 0)) {
              adomain_ = adomain_.getUnmodifiableView();
            }
            if (((mutable_bitField0_ & 0x00004000) != 0)) {
              attr_.makeImmutable(); // C
            }
            if (((mutable_bitField0_ & 0x00002000) != 0)) {
              cat_ = cat_.getUnmodifiableView();
            }
            if (((mutable_bitField0_ & 0x00008000) != 0)) {
              apis_.makeImmutable(); // C
            }
            this.unknownFields = unknownFields.build();
            makeExtensionsImmutable();
          }
        }
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidResponse_SeatBid_Bid_descriptor;
        }

        @java.lang.Override
        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidResponse_SeatBid_Bid_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid.class, com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid.Builder.class);
        }

        private int bitField0_;
        private int admOneofCase_ = 0;
        private java.lang.Object admOneof_;
        public enum AdmOneofCase
            implements com.google.protobuf.Internal.EnumLite,
                com.google.protobuf.AbstractMessage.InternalOneOfEnum {
          ADM(6),
          ADM_NATIVE(50),
          ADMONEOF_NOT_SET(0);
          private final int value;
          private AdmOneofCase(int value) {
            this.value = value;
          }
          /**
           * @param value The number of the enum to look for.
           * @return The enum associated with the given number.
           * @deprecated Use {@link #forNumber(int)} instead.
           */
          @java.lang.Deprecated
          public static AdmOneofCase valueOf(int value) {
            return forNumber(value);
          }

          public static AdmOneofCase forNumber(int value) {
            switch (value) {
              case 6: return ADM;
              case 50: return ADM_NATIVE;
              case 0: return ADMONEOF_NOT_SET;
              default: return null;
            }
          }
          public int getNumber() {
            return this.value;
          }
        };

        public AdmOneofCase
        getAdmOneofCase() {
          return AdmOneofCase.forNumber(
              admOneofCase_);
        }

        public static final int ID_FIELD_NUMBER = 1;
        private volatile java.lang.Object id_;
        /**
         * <pre>
         * Bidder generated bid ID to assist with logging/tracking.
         * REQUIRED by the OpenRTB specification.
         * </pre>
         *
         * <code>required string id = 1;</code>
         * @return Whether the id field is set.
         */
        @java.lang.Override
        public boolean hasId() {
          return ((bitField0_ & 0x00000001) != 0);
        }
        /**
         * <pre>
         * Bidder generated bid ID to assist with logging/tracking.
         * REQUIRED by the OpenRTB specification.
         * </pre>
         *
         * <code>required string id = 1;</code>
         * @return The id.
         */
        @java.lang.Override
        public java.lang.String getId() {
          java.lang.Object ref = id_;
          if (ref instanceof java.lang.String) {
            return (java.lang.String) ref;
          } else {
            com.google.protobuf.ByteString bs = 
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              id_ = s;
            }
            return s;
          }
        }
        /**
         * <pre>
         * Bidder generated bid ID to assist with logging/tracking.
         * REQUIRED by the OpenRTB specification.
         * </pre>
         *
         * <code>required string id = 1;</code>
         * @return The bytes for id.
         */
        @java.lang.Override
        public com.google.protobuf.ByteString
            getIdBytes() {
          java.lang.Object ref = id_;
          if (ref instanceof java.lang.String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            id_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }

        public static final int IMPID_FIELD_NUMBER = 2;
        private volatile java.lang.Object impid_;
        /**
         * <pre>
         * ID of the Imp object in the related bid request.
         * REQUIRED by the OpenRTB specification.
         * </pre>
         *
         * <code>required string impid = 2;</code>
         * @return Whether the impid field is set.
         */
        @java.lang.Override
        public boolean hasImpid() {
          return ((bitField0_ & 0x00000002) != 0);
        }
        /**
         * <pre>
         * ID of the Imp object in the related bid request.
         * REQUIRED by the OpenRTB specification.
         * </pre>
         *
         * <code>required string impid = 2;</code>
         * @return The impid.
         */
        @java.lang.Override
        public java.lang.String getImpid() {
          java.lang.Object ref = impid_;
          if (ref instanceof java.lang.String) {
            return (java.lang.String) ref;
          } else {
            com.google.protobuf.ByteString bs = 
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              impid_ = s;
            }
            return s;
          }
        }
        /**
         * <pre>
         * ID of the Imp object in the related bid request.
         * REQUIRED by the OpenRTB specification.
         * </pre>
         *
         * <code>required string impid = 2;</code>
         * @return The bytes for impid.
         */
        @java.lang.Override
        public com.google.protobuf.ByteString
            getImpidBytes() {
          java.lang.Object ref = impid_;
          if (ref instanceof java.lang.String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            impid_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }

        public static final int PRICE_FIELD_NUMBER = 3;
        private double price_;
        /**
         * <pre>
         * Bid price expressed as CPM although the actual transaction is for a
         * unit impression only. Note that while the type indicates float, integer
         * math is highly recommended when handling currencies
         * (e.g., BigDecimal in Java).
         * REQUIRED by the OpenRTB specification.
         * </pre>
         *
         * <code>required double price = 3;</code>
         * @return Whether the price field is set.
         */
        @java.lang.Override
        public boolean hasPrice() {
          return ((bitField0_ & 0x00000004) != 0);
        }
        /**
         * <pre>
         * Bid price expressed as CPM although the actual transaction is for a
         * unit impression only. Note that while the type indicates float, integer
         * math is highly recommended when handling currencies
         * (e.g., BigDecimal in Java).
         * REQUIRED by the OpenRTB specification.
         * </pre>
         *
         * <code>required double price = 3;</code>
         * @return The price.
         */
        @java.lang.Override
        public double getPrice() {
          return price_;
        }

        public static final int ADID_FIELD_NUMBER = 4;
        private volatile java.lang.Object adid_;
        /**
         * <pre>
         * ID of a preloaded ad to be served if the bid wins.
         * </pre>
         *
         * <code>optional string adid = 4;</code>
         * @return Whether the adid field is set.
         */
        @java.lang.Override
        public boolean hasAdid() {
          return ((bitField0_ & 0x00000008) != 0);
        }
        /**
         * <pre>
         * ID of a preloaded ad to be served if the bid wins.
         * </pre>
         *
         * <code>optional string adid = 4;</code>
         * @return The adid.
         */
        @java.lang.Override
        public java.lang.String getAdid() {
          java.lang.Object ref = adid_;
          if (ref instanceof java.lang.String) {
            return (java.lang.String) ref;
          } else {
            com.google.protobuf.ByteString bs = 
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              adid_ = s;
            }
            return s;
          }
        }
        /**
         * <pre>
         * ID of a preloaded ad to be served if the bid wins.
         * </pre>
         *
         * <code>optional string adid = 4;</code>
         * @return The bytes for adid.
         */
        @java.lang.Override
        public com.google.protobuf.ByteString
            getAdidBytes() {
          java.lang.Object ref = adid_;
          if (ref instanceof java.lang.String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            adid_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }

        public static final int NURL_FIELD_NUMBER = 5;
        private volatile java.lang.Object nurl_;
        /**
         * <pre>
         * Win notice URL called by the exchange if the bid wins; optional means
         * of serving ad markup.
         * </pre>
         *
         * <code>optional string nurl = 5;</code>
         * @return Whether the nurl field is set.
         */
        @java.lang.Override
        public boolean hasNurl() {
          return ((bitField0_ & 0x00000010) != 0);
        }
        /**
         * <pre>
         * Win notice URL called by the exchange if the bid wins; optional means
         * of serving ad markup.
         * </pre>
         *
         * <code>optional string nurl = 5;</code>
         * @return The nurl.
         */
        @java.lang.Override
        public java.lang.String getNurl() {
          java.lang.Object ref = nurl_;
          if (ref instanceof java.lang.String) {
            return (java.lang.String) ref;
          } else {
            com.google.protobuf.ByteString bs = 
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              nurl_ = s;
            }
            return s;
          }
        }
        /**
         * <pre>
         * Win notice URL called by the exchange if the bid wins; optional means
         * of serving ad markup.
         * </pre>
         *
         * <code>optional string nurl = 5;</code>
         * @return The bytes for nurl.
         */
        @java.lang.Override
        public com.google.protobuf.ByteString
            getNurlBytes() {
          java.lang.Object ref = nurl_;
          if (ref instanceof java.lang.String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            nurl_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }

        public static final int ADM_FIELD_NUMBER = 6;
        /**
         * <pre>
         * Optional means of conveying ad markup in case the bid wins;
         * supersedes the win notice if markup is included in both.
         * For native ad bids, exactly one of {adm, adm_native} should be used;
         * this is the OpenRTB-compliant field for JSON serialization.
         * </pre>
         *
         * <code>string adm = 6;</code>
         * @return Whether the adm field is set.
         */
        public boolean hasAdm() {
          return admOneofCase_ == 6;
        }
        /**
         * <pre>
         * Optional means of conveying ad markup in case the bid wins;
         * supersedes the win notice if markup is included in both.
         * For native ad bids, exactly one of {adm, adm_native} should be used;
         * this is the OpenRTB-compliant field for JSON serialization.
         * </pre>
         *
         * <code>string adm = 6;</code>
         * @return The adm.
         */
        public java.lang.String getAdm() {
          java.lang.Object ref = "";
          if (admOneofCase_ == 6) {
            ref = admOneof_;
          }
          if (ref instanceof java.lang.String) {
            return (java.lang.String) ref;
          } else {
            com.google.protobuf.ByteString bs = 
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8() && (admOneofCase_ == 6)) {
              admOneof_ = s;
            }
            return s;
          }
        }
        /**
         * <pre>
         * Optional means of conveying ad markup in case the bid wins;
         * supersedes the win notice if markup is included in both.
         * For native ad bids, exactly one of {adm, adm_native} should be used;
         * this is the OpenRTB-compliant field for JSON serialization.
         * </pre>
         *
         * <code>string adm = 6;</code>
         * @return The bytes for adm.
         */
        public com.google.protobuf.ByteString
            getAdmBytes() {
          java.lang.Object ref = "";
          if (admOneofCase_ == 6) {
            ref = admOneof_;
          }
          if (ref instanceof java.lang.String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            if (admOneofCase_ == 6) {
              admOneof_ = b;
            }
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }

        public static final int ADM_NATIVE_FIELD_NUMBER = 50;
        /**
         * <pre>
         * Native ad response.
         * For native ad bids, exactly one of {adm, adm_native} should be used;
         * this is the field used for Protobuf serialization.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeResponse adm_native = 50;</code>
         * @return Whether the admNative field is set.
         */
        @java.lang.Override
        public boolean hasAdmNative() {
          return admOneofCase_ == 50;
        }
        /**
         * <pre>
         * Native ad response.
         * For native ad bids, exactly one of {adm, adm_native} should be used;
         * this is the field used for Protobuf serialization.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeResponse adm_native = 50;</code>
         * @return The admNative.
         */
        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse getAdmNative() {
          if (admOneofCase_ == 50) {
             return (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse) admOneof_;
          }
          return com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.getDefaultInstance();
        }
        /**
         * <pre>
         * Native ad response.
         * For native ad bids, exactly one of {adm, adm_native} should be used;
         * this is the field used for Protobuf serialization.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeResponse adm_native = 50;</code>
         */
        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponseOrBuilder getAdmNativeOrBuilder() {
          if (admOneofCase_ == 50) {
             return (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse) admOneof_;
          }
          return com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.getDefaultInstance();
        }

        public static final int ADOMAIN_FIELD_NUMBER = 7;
        private com.google.protobuf.LazyStringList adomain_;
        /**
         * <pre>
         * Advertiser domain for block list checking (e.g., "ford.com"). This can
         * be an array of for the case of rotating creatives. Exchanges can
         * mandate that only one domain is allowed.
         * </pre>
         *
         * <code>repeated string adomain = 7;</code>
         * @return A list containing the adomain.
         */
        public com.google.protobuf.ProtocolStringList
            getAdomainList() {
          return adomain_;
        }
        /**
         * <pre>
         * Advertiser domain for block list checking (e.g., "ford.com"). This can
         * be an array of for the case of rotating creatives. Exchanges can
         * mandate that only one domain is allowed.
         * </pre>
         *
         * <code>repeated string adomain = 7;</code>
         * @return The count of adomain.
         */
        public int getAdomainCount() {
          return adomain_.size();
        }
        /**
         * <pre>
         * Advertiser domain for block list checking (e.g., "ford.com"). This can
         * be an array of for the case of rotating creatives. Exchanges can
         * mandate that only one domain is allowed.
         * </pre>
         *
         * <code>repeated string adomain = 7;</code>
         * @param index The index of the element to return.
         * @return The adomain at the given index.
         */
        public java.lang.String getAdomain(int index) {
          return adomain_.get(index);
        }
        /**
         * <pre>
         * Advertiser domain for block list checking (e.g., "ford.com"). This can
         * be an array of for the case of rotating creatives. Exchanges can
         * mandate that only one domain is allowed.
         * </pre>
         *
         * <code>repeated string adomain = 7;</code>
         * @param index The index of the value to return.
         * @return The bytes of the adomain at the given index.
         */
        public com.google.protobuf.ByteString
            getAdomainBytes(int index) {
          return adomain_.getByteString(index);
        }

        public static final int BUNDLE_FIELD_NUMBER = 14;
        private volatile java.lang.Object bundle_;
        /**
         * <pre>
         * A platform-specific application identifier intended to be
         * unique to the app and independent of the exchange. On Android,
         * this should be a bundle or package name (e.g., com.foo.mygame).
         * On iOS, it is a numeric ID.
         * </pre>
         *
         * <code>optional string bundle = 14;</code>
         * @return Whether the bundle field is set.
         */
        @java.lang.Override
        public boolean hasBundle() {
          return ((bitField0_ & 0x00000080) != 0);
        }
        /**
         * <pre>
         * A platform-specific application identifier intended to be
         * unique to the app and independent of the exchange. On Android,
         * this should be a bundle or package name (e.g., com.foo.mygame).
         * On iOS, it is a numeric ID.
         * </pre>
         *
         * <code>optional string bundle = 14;</code>
         * @return The bundle.
         */
        @java.lang.Override
        public java.lang.String getBundle() {
          java.lang.Object ref = bundle_;
          if (ref instanceof java.lang.String) {
            return (java.lang.String) ref;
          } else {
            com.google.protobuf.ByteString bs = 
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              bundle_ = s;
            }
            return s;
          }
        }
        /**
         * <pre>
         * A platform-specific application identifier intended to be
         * unique to the app and independent of the exchange. On Android,
         * this should be a bundle or package name (e.g., com.foo.mygame).
         * On iOS, it is a numeric ID.
         * </pre>
         *
         * <code>optional string bundle = 14;</code>
         * @return The bytes for bundle.
         */
        @java.lang.Override
        public com.google.protobuf.ByteString
            getBundleBytes() {
          java.lang.Object ref = bundle_;
          if (ref instanceof java.lang.String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            bundle_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }

        public static final int IURL_FIELD_NUMBER = 8;
        private volatile java.lang.Object iurl_;
        /**
         * <pre>
         * URL without cache-busting to an image that is representative of the
         * content of the campaign for ad quality/safety checking.
         * </pre>
         *
         * <code>optional string iurl = 8;</code>
         * @return Whether the iurl field is set.
         */
        @java.lang.Override
        public boolean hasIurl() {
          return ((bitField0_ & 0x00000100) != 0);
        }
        /**
         * <pre>
         * URL without cache-busting to an image that is representative of the
         * content of the campaign for ad quality/safety checking.
         * </pre>
         *
         * <code>optional string iurl = 8;</code>
         * @return The iurl.
         */
        @java.lang.Override
        public java.lang.String getIurl() {
          java.lang.Object ref = iurl_;
          if (ref instanceof java.lang.String) {
            return (java.lang.String) ref;
          } else {
            com.google.protobuf.ByteString bs = 
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              iurl_ = s;
            }
            return s;
          }
        }
        /**
         * <pre>
         * URL without cache-busting to an image that is representative of the
         * content of the campaign for ad quality/safety checking.
         * </pre>
         *
         * <code>optional string iurl = 8;</code>
         * @return The bytes for iurl.
         */
        @java.lang.Override
        public com.google.protobuf.ByteString
            getIurlBytes() {
          java.lang.Object ref = iurl_;
          if (ref instanceof java.lang.String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            iurl_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }

        public static final int CID_FIELD_NUMBER = 9;
        private volatile java.lang.Object cid_;
        /**
         * <pre>
         * Campaign ID to assist with ad quality checking; the collection of
         * creatives for which iurl should be representative.
         * </pre>
         *
         * <code>optional string cid = 9;</code>
         * @return Whether the cid field is set.
         */
        @java.lang.Override
        public boolean hasCid() {
          return ((bitField0_ & 0x00000200) != 0);
        }
        /**
         * <pre>
         * Campaign ID to assist with ad quality checking; the collection of
         * creatives for which iurl should be representative.
         * </pre>
         *
         * <code>optional string cid = 9;</code>
         * @return The cid.
         */
        @java.lang.Override
        public java.lang.String getCid() {
          java.lang.Object ref = cid_;
          if (ref instanceof java.lang.String) {
            return (java.lang.String) ref;
          } else {
            com.google.protobuf.ByteString bs = 
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              cid_ = s;
            }
            return s;
          }
        }
        /**
         * <pre>
         * Campaign ID to assist with ad quality checking; the collection of
         * creatives for which iurl should be representative.
         * </pre>
         *
         * <code>optional string cid = 9;</code>
         * @return The bytes for cid.
         */
        @java.lang.Override
        public com.google.protobuf.ByteString
            getCidBytes() {
          java.lang.Object ref = cid_;
          if (ref instanceof java.lang.String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            cid_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }

        public static final int CRID_FIELD_NUMBER = 10;
        private volatile java.lang.Object crid_;
        /**
         * <pre>
         * Creative ID to assist with ad quality checking.
         * </pre>
         *
         * <code>optional string crid = 10;</code>
         * @return Whether the crid field is set.
         */
        @java.lang.Override
        public boolean hasCrid() {
          return ((bitField0_ & 0x00000400) != 0);
        }
        /**
         * <pre>
         * Creative ID to assist with ad quality checking.
         * </pre>
         *
         * <code>optional string crid = 10;</code>
         * @return The crid.
         */
        @java.lang.Override
        public java.lang.String getCrid() {
          java.lang.Object ref = crid_;
          if (ref instanceof java.lang.String) {
            return (java.lang.String) ref;
          } else {
            com.google.protobuf.ByteString bs = 
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              crid_ = s;
            }
            return s;
          }
        }
        /**
         * <pre>
         * Creative ID to assist with ad quality checking.
         * </pre>
         *
         * <code>optional string crid = 10;</code>
         * @return The bytes for crid.
         */
        @java.lang.Override
        public com.google.protobuf.ByteString
            getCridBytes() {
          java.lang.Object ref = crid_;
          if (ref instanceof java.lang.String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            crid_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }

        public static final int CATTAX_FIELD_NUMBER = 30;
        private int cattax_;
        /**
         * <pre>
         * The taxonomy in use.
         * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
         * </pre>
         *
         * <code>optional int32 cattax = 30 [default = 1];</code>
         * @return Whether the cattax field is set.
         */
        @java.lang.Override
        public boolean hasCattax() {
          return ((bitField0_ & 0x00000800) != 0);
        }
        /**
         * <pre>
         * The taxonomy in use.
         * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
         * </pre>
         *
         * <code>optional int32 cattax = 30 [default = 1];</code>
         * @return The cattax.
         */
        @java.lang.Override
        public int getCattax() {
          return cattax_;
        }

        public static final int CAT_FIELD_NUMBER = 15;
        private com.google.protobuf.LazyStringList cat_;
        /**
         * <pre>
         * IAB content categories of the creative.
         * </pre>
         *
         * <code>repeated string cat = 15;</code>
         * @return A list containing the cat.
         */
        public com.google.protobuf.ProtocolStringList
            getCatList() {
          return cat_;
        }
        /**
         * <pre>
         * IAB content categories of the creative.
         * </pre>
         *
         * <code>repeated string cat = 15;</code>
         * @return The count of cat.
         */
        public int getCatCount() {
          return cat_.size();
        }
        /**
         * <pre>
         * IAB content categories of the creative.
         * </pre>
         *
         * <code>repeated string cat = 15;</code>
         * @param index The index of the element to return.
         * @return The cat at the given index.
         */
        public java.lang.String getCat(int index) {
          return cat_.get(index);
        }
        /**
         * <pre>
         * IAB content categories of the creative.
         * </pre>
         *
         * <code>repeated string cat = 15;</code>
         * @param index The index of the value to return.
         * @return The bytes of the cat at the given index.
         */
        public com.google.protobuf.ByteString
            getCatBytes(int index) {
          return cat_.getByteString(index);
        }

        public static final int ATTR_FIELD_NUMBER = 11;
        private com.google.protobuf.Internal.IntList attr_;
        /**
         * <pre>
         * Set of attributes describing the creative.
         * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
         * </pre>
         *
         * <code>repeated int32 attr = 11 [packed = true];</code>
         * @return A list containing the attr.
         */
        @java.lang.Override
        public java.util.List<java.lang.Integer>
            getAttrList() {
          return attr_;
        }
        /**
         * <pre>
         * Set of attributes describing the creative.
         * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
         * </pre>
         *
         * <code>repeated int32 attr = 11 [packed = true];</code>
         * @return The count of attr.
         */
        public int getAttrCount() {
          return attr_.size();
        }
        /**
         * <pre>
         * Set of attributes describing the creative.
         * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
         * </pre>
         *
         * <code>repeated int32 attr = 11 [packed = true];</code>
         * @param index The index of the element to return.
         * @return The attr at the given index.
         */
        public int getAttr(int index) {
          return attr_.getInt(index);
        }
        private int attrMemoizedSerializedSize = -1;

        public static final int APIS_FIELD_NUMBER = 31;
        private com.google.protobuf.Internal.IntList apis_;
        /**
         * <pre>
         * List of supported APIs for the markup. If an API is not explicitly
         * listed, it is assumed to be unsupported.
         * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
         * </pre>
         *
         * <code>repeated int32 apis = 31 [packed = true];</code>
         * @return A list containing the apis.
         */
        @java.lang.Override
        public java.util.List<java.lang.Integer>
            getApisList() {
          return apis_;
        }
        /**
         * <pre>
         * List of supported APIs for the markup. If an API is not explicitly
         * listed, it is assumed to be unsupported.
         * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
         * </pre>
         *
         * <code>repeated int32 apis = 31 [packed = true];</code>
         * @return The count of apis.
         */
        public int getApisCount() {
          return apis_.size();
        }
        /**
         * <pre>
         * List of supported APIs for the markup. If an API is not explicitly
         * listed, it is assumed to be unsupported.
         * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
         * </pre>
         *
         * <code>repeated int32 apis = 31 [packed = true];</code>
         * @param index The index of the element to return.
         * @return The apis at the given index.
         */
        public int getApis(int index) {
          return apis_.getInt(index);
        }
        private int apisMemoizedSerializedSize = -1;

        public static final int API_FIELD_NUMBER = 18;
        private int api_;
        /**
         * <pre>
         * API required by the markup if applicable.
         * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
         * </pre>
         *
         * <code>optional int32 api = 18 [deprecated = true];</code>
         * @return Whether the api field is set.
         */
        @java.lang.Override
        @java.lang.Deprecated public boolean hasApi() {
          return ((bitField0_ & 0x00001000) != 0);
        }
        /**
         * <pre>
         * API required by the markup if applicable.
         * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
         * </pre>
         *
         * <code>optional int32 api = 18 [deprecated = true];</code>
         * @return The api.
         */
        @java.lang.Override
        @java.lang.Deprecated public int getApi() {
          return api_;
        }

        public static final int PROTOCOL_FIELD_NUMBER = 19;
        private int protocol_;
        /**
         * <pre>
         * Video response protocol of the markup if applicable.
         * Refer to enum com.iabtechlab.adcom.v1.Creative.AudioVideoType for generic values.
         * </pre>
         *
         * <code>optional int32 protocol = 19;</code>
         * @return Whether the protocol field is set.
         */
        @java.lang.Override
        public boolean hasProtocol() {
          return ((bitField0_ & 0x00002000) != 0);
        }
        /**
         * <pre>
         * Video response protocol of the markup if applicable.
         * Refer to enum com.iabtechlab.adcom.v1.Creative.AudioVideoType for generic values.
         * </pre>
         *
         * <code>optional int32 protocol = 19;</code>
         * @return The protocol.
         */
        @java.lang.Override
        public int getProtocol() {
          return protocol_;
        }

        public static final int QAGMEDIARATING_FIELD_NUMBER = 20;
        private int qagmediarating_;
        /**
         * <pre>
         * Creative media rating per QAG guidelines.
         * Refer to enum com.iabtechlab.adcom.v1.MediaRating for generic values.
         * </pre>
         *
         * <code>optional int32 qagmediarating = 20;</code>
         * @return Whether the qagmediarating field is set.
         */
        @java.lang.Override
        public boolean hasQagmediarating() {
          return ((bitField0_ & 0x00004000) != 0);
        }
        /**
         * <pre>
         * Creative media rating per QAG guidelines.
         * Refer to enum com.iabtechlab.adcom.v1.MediaRating for generic values.
         * </pre>
         *
         * <code>optional int32 qagmediarating = 20;</code>
         * @return The qagmediarating.
         */
        @java.lang.Override
        public int getQagmediarating() {
          return qagmediarating_;
        }

        public static final int DEALID_FIELD_NUMBER = 13;
        private volatile java.lang.Object dealid_;
        /**
         * <pre>
         * Reference to the deal.id from the bid request if this bid pertains to a
         * private marketplace direct deal.
         * </pre>
         *
         * <code>optional string dealid = 13;</code>
         * @return Whether the dealid field is set.
         */
        @java.lang.Override
        public boolean hasDealid() {
          return ((bitField0_ & 0x00008000) != 0);
        }
        /**
         * <pre>
         * Reference to the deal.id from the bid request if this bid pertains to a
         * private marketplace direct deal.
         * </pre>
         *
         * <code>optional string dealid = 13;</code>
         * @return The dealid.
         */
        @java.lang.Override
        public java.lang.String getDealid() {
          java.lang.Object ref = dealid_;
          if (ref instanceof java.lang.String) {
            return (java.lang.String) ref;
          } else {
            com.google.protobuf.ByteString bs = 
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              dealid_ = s;
            }
            return s;
          }
        }
        /**
         * <pre>
         * Reference to the deal.id from the bid request if this bid pertains to a
         * private marketplace direct deal.
         * </pre>
         *
         * <code>optional string dealid = 13;</code>
         * @return The bytes for dealid.
         */
        @java.lang.Override
        public com.google.protobuf.ByteString
            getDealidBytes() {
          java.lang.Object ref = dealid_;
          if (ref instanceof java.lang.String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            dealid_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }

        public static final int W_FIELD_NUMBER = 16;
        private int w_;
        /**
         * <pre>
         * Width of the creative in device independent pixels (DIPS).
         * </pre>
         *
         * <code>optional int32 w = 16;</code>
         * @return Whether the w field is set.
         */
        @java.lang.Override
        public boolean hasW() {
          return ((bitField0_ & 0x00010000) != 0);
        }
        /**
         * <pre>
         * Width of the creative in device independent pixels (DIPS).
         * </pre>
         *
         * <code>optional int32 w = 16;</code>
         * @return The w.
         */
        @java.lang.Override
        public int getW() {
          return w_;
        }

        public static final int H_FIELD_NUMBER = 17;
        private int h_;
        /**
         * <pre>
         * Height of the creative in device independent pixels (DIPS).
         * </pre>
         *
         * <code>optional int32 h = 17;</code>
         * @return Whether the h field is set.
         */
        @java.lang.Override
        public boolean hasH() {
          return ((bitField0_ & 0x00020000) != 0);
        }
        /**
         * <pre>
         * Height of the creative in device independent pixels (DIPS).
         * </pre>
         *
         * <code>optional int32 h = 17;</code>
         * @return The h.
         */
        @java.lang.Override
        public int getH() {
          return h_;
        }

        public static final int EXP_FIELD_NUMBER = 21;
        private int exp_;
        /**
         * <pre>
         * Advisory as to the number of seconds the bidder is willing to
         * wait between the auction and the actual impression.
         * </pre>
         *
         * <code>optional int32 exp = 21;</code>
         * @return Whether the exp field is set.
         */
        @java.lang.Override
        public boolean hasExp() {
          return ((bitField0_ & 0x00040000) != 0);
        }
        /**
         * <pre>
         * Advisory as to the number of seconds the bidder is willing to
         * wait between the auction and the actual impression.
         * </pre>
         *
         * <code>optional int32 exp = 21;</code>
         * @return The exp.
         */
        @java.lang.Override
        public int getExp() {
          return exp_;
        }

        public static final int BURL_FIELD_NUMBER = 22;
        private volatile java.lang.Object burl_;
        /**
         * <pre>
         * Billing notice URL called by the exchange when a winning bid
         * becomes billable based on exchange-specific business policy
         * (e.g., typically delivered, viewed, etc.). Substitution macros
         * (Section 4.4) may be included.
         * </pre>
         *
         * <code>optional string burl = 22;</code>
         * @return Whether the burl field is set.
         */
        @java.lang.Override
        public boolean hasBurl() {
          return ((bitField0_ & 0x00080000) != 0);
        }
        /**
         * <pre>
         * Billing notice URL called by the exchange when a winning bid
         * becomes billable based on exchange-specific business policy
         * (e.g., typically delivered, viewed, etc.). Substitution macros
         * (Section 4.4) may be included.
         * </pre>
         *
         * <code>optional string burl = 22;</code>
         * @return The burl.
         */
        @java.lang.Override
        public java.lang.String getBurl() {
          java.lang.Object ref = burl_;
          if (ref instanceof java.lang.String) {
            return (java.lang.String) ref;
          } else {
            com.google.protobuf.ByteString bs = 
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              burl_ = s;
            }
            return s;
          }
        }
        /**
         * <pre>
         * Billing notice URL called by the exchange when a winning bid
         * becomes billable based on exchange-specific business policy
         * (e.g., typically delivered, viewed, etc.). Substitution macros
         * (Section 4.4) may be included.
         * </pre>
         *
         * <code>optional string burl = 22;</code>
         * @return The bytes for burl.
         */
        @java.lang.Override
        public com.google.protobuf.ByteString
            getBurlBytes() {
          java.lang.Object ref = burl_;
          if (ref instanceof java.lang.String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            burl_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }

        public static final int LURL_FIELD_NUMBER = 23;
        private volatile java.lang.Object lurl_;
        /**
         * <pre>
         * Loss notice URL called by the exchange when a bid is known to
         * have been lost. Substitution macros (Section 4.4) may be
         * included. Exchange-specific policy may preclude support for
         * loss notices or the disclosure of winning clearing prices
         * resulting in ${AUCTION_PRICE} macros being removed (i.e.,
         * replaced with a zero-length string).
         * </pre>
         *
         * <code>optional string lurl = 23;</code>
         * @return Whether the lurl field is set.
         */
        @java.lang.Override
        public boolean hasLurl() {
          return ((bitField0_ & 0x00100000) != 0);
        }
        /**
         * <pre>
         * Loss notice URL called by the exchange when a bid is known to
         * have been lost. Substitution macros (Section 4.4) may be
         * included. Exchange-specific policy may preclude support for
         * loss notices or the disclosure of winning clearing prices
         * resulting in ${AUCTION_PRICE} macros being removed (i.e.,
         * replaced with a zero-length string).
         * </pre>
         *
         * <code>optional string lurl = 23;</code>
         * @return The lurl.
         */
        @java.lang.Override
        public java.lang.String getLurl() {
          java.lang.Object ref = lurl_;
          if (ref instanceof java.lang.String) {
            return (java.lang.String) ref;
          } else {
            com.google.protobuf.ByteString bs = 
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              lurl_ = s;
            }
            return s;
          }
        }
        /**
         * <pre>
         * Loss notice URL called by the exchange when a bid is known to
         * have been lost. Substitution macros (Section 4.4) may be
         * included. Exchange-specific policy may preclude support for
         * loss notices or the disclosure of winning clearing prices
         * resulting in ${AUCTION_PRICE} macros being removed (i.e.,
         * replaced with a zero-length string).
         * </pre>
         *
         * <code>optional string lurl = 23;</code>
         * @return The bytes for lurl.
         */
        @java.lang.Override
        public com.google.protobuf.ByteString
            getLurlBytes() {
          java.lang.Object ref = lurl_;
          if (ref instanceof java.lang.String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            lurl_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }

        public static final int TACTIC_FIELD_NUMBER = 24;
        private volatile java.lang.Object tactic_;
        /**
         * <pre>
         * Tactic ID to enable buyers to label bids for reporting to the
         * exchange the tactic through which their bid was submitted.
         * The specific usage and meaning of the tactic ID should be
         * communicated between buyer and exchanges a priori.
         * </pre>
         *
         * <code>optional string tactic = 24;</code>
         * @return Whether the tactic field is set.
         */
        @java.lang.Override
        public boolean hasTactic() {
          return ((bitField0_ & 0x00200000) != 0);
        }
        /**
         * <pre>
         * Tactic ID to enable buyers to label bids for reporting to the
         * exchange the tactic through which their bid was submitted.
         * The specific usage and meaning of the tactic ID should be
         * communicated between buyer and exchanges a priori.
         * </pre>
         *
         * <code>optional string tactic = 24;</code>
         * @return The tactic.
         */
        @java.lang.Override
        public java.lang.String getTactic() {
          java.lang.Object ref = tactic_;
          if (ref instanceof java.lang.String) {
            return (java.lang.String) ref;
          } else {
            com.google.protobuf.ByteString bs = 
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              tactic_ = s;
            }
            return s;
          }
        }
        /**
         * <pre>
         * Tactic ID to enable buyers to label bids for reporting to the
         * exchange the tactic through which their bid was submitted.
         * The specific usage and meaning of the tactic ID should be
         * communicated between buyer and exchanges a priori.
         * </pre>
         *
         * <code>optional string tactic = 24;</code>
         * @return The bytes for tactic.
         */
        @java.lang.Override
        public com.google.protobuf.ByteString
            getTacticBytes() {
          java.lang.Object ref = tactic_;
          if (ref instanceof java.lang.String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            tactic_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }

        public static final int LANGUAGE_FIELD_NUMBER = 25;
        private volatile java.lang.Object language_;
        /**
         * <pre>
         * Language of the creative using ISO-639-1-alpha-2. The nonstandard
         * code "xx" may also be used if the creative has no
         * linguistic content (e.g., a banner with just a company logo).
         * </pre>
         *
         * <code>optional string language = 25;</code>
         * @return Whether the language field is set.
         */
        @java.lang.Override
        public boolean hasLanguage() {
          return ((bitField0_ & 0x00400000) != 0);
        }
        /**
         * <pre>
         * Language of the creative using ISO-639-1-alpha-2. The nonstandard
         * code "xx" may also be used if the creative has no
         * linguistic content (e.g., a banner with just a company logo).
         * </pre>
         *
         * <code>optional string language = 25;</code>
         * @return The language.
         */
        @java.lang.Override
        public java.lang.String getLanguage() {
          java.lang.Object ref = language_;
          if (ref instanceof java.lang.String) {
            return (java.lang.String) ref;
          } else {
            com.google.protobuf.ByteString bs = 
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              language_ = s;
            }
            return s;
          }
        }
        /**
         * <pre>
         * Language of the creative using ISO-639-1-alpha-2. The nonstandard
         * code "xx" may also be used if the creative has no
         * linguistic content (e.g., a banner with just a company logo).
         * </pre>
         *
         * <code>optional string language = 25;</code>
         * @return The bytes for language.
         */
        @java.lang.Override
        public com.google.protobuf.ByteString
            getLanguageBytes() {
          java.lang.Object ref = language_;
          if (ref instanceof java.lang.String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            language_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }

        public static final int LANGB_FIELD_NUMBER = 29;
        private volatile java.lang.Object langb_;
        /**
         * <pre>
         * Language of the creative using IETF BCP 47. Only one of language or
         * langb should be present.
         * </pre>
         *
         * <code>optional string langb = 29;</code>
         * @return Whether the langb field is set.
         */
        @java.lang.Override
        public boolean hasLangb() {
          return ((bitField0_ & 0x00800000) != 0);
        }
        /**
         * <pre>
         * Language of the creative using IETF BCP 47. Only one of language or
         * langb should be present.
         * </pre>
         *
         * <code>optional string langb = 29;</code>
         * @return The langb.
         */
        @java.lang.Override
        public java.lang.String getLangb() {
          java.lang.Object ref = langb_;
          if (ref instanceof java.lang.String) {
            return (java.lang.String) ref;
          } else {
            com.google.protobuf.ByteString bs = 
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              langb_ = s;
            }
            return s;
          }
        }
        /**
         * <pre>
         * Language of the creative using IETF BCP 47. Only one of language or
         * langb should be present.
         * </pre>
         *
         * <code>optional string langb = 29;</code>
         * @return The bytes for langb.
         */
        @java.lang.Override
        public com.google.protobuf.ByteString
            getLangbBytes() {
          java.lang.Object ref = langb_;
          if (ref instanceof java.lang.String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            langb_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }

        public static final int WRATIO_FIELD_NUMBER = 26;
        private int wratio_;
        /**
         * <pre>
         * Relative width of the creative when expressing size as a ratio.
         * Required for Flex Ads.
         * </pre>
         *
         * <code>optional int32 wratio = 26;</code>
         * @return Whether the wratio field is set.
         */
        @java.lang.Override
        public boolean hasWratio() {
          return ((bitField0_ & 0x01000000) != 0);
        }
        /**
         * <pre>
         * Relative width of the creative when expressing size as a ratio.
         * Required for Flex Ads.
         * </pre>
         *
         * <code>optional int32 wratio = 26;</code>
         * @return The wratio.
         */
        @java.lang.Override
        public int getWratio() {
          return wratio_;
        }

        public static final int HRATIO_FIELD_NUMBER = 27;
        private int hratio_;
        /**
         * <pre>
         * Relative height of the creative when expressing size as a ratio.
         * Required for Flex Ads.
         * </pre>
         *
         * <code>optional int32 hratio = 27;</code>
         * @return Whether the hratio field is set.
         */
        @java.lang.Override
        public boolean hasHratio() {
          return ((bitField0_ & 0x02000000) != 0);
        }
        /**
         * <pre>
         * Relative height of the creative when expressing size as a ratio.
         * Required for Flex Ads.
         * </pre>
         *
         * <code>optional int32 hratio = 27;</code>
         * @return The hratio.
         */
        @java.lang.Override
        public int getHratio() {
          return hratio_;
        }

        public static final int DUR_FIELD_NUMBER = 32;
        private int dur_;
        /**
         * <pre>
         * Duration of the video or audio creative in seconds.
         * </pre>
         *
         * <code>optional int32 dur = 32;</code>
         * @return Whether the dur field is set.
         */
        @java.lang.Override
        public boolean hasDur() {
          return ((bitField0_ & 0x04000000) != 0);
        }
        /**
         * <pre>
         * Duration of the video or audio creative in seconds.
         * </pre>
         *
         * <code>optional int32 dur = 32;</code>
         * @return The dur.
         */
        @java.lang.Override
        public int getDur() {
          return dur_;
        }

        public static final int MTYPE_FIELD_NUMBER = 33;
        private int mtype_;
        /**
         * <pre>
         * Type of the creative markup so that it can properly be associated with
         * the right sub-object of the BidRequest.Imp.
         * </pre>
         *
         * <code>optional int32 mtype = 33;</code>
         * @return Whether the mtype field is set.
         */
        @java.lang.Override
        public boolean hasMtype() {
          return ((bitField0_ & 0x08000000) != 0);
        }
        /**
         * <pre>
         * Type of the creative markup so that it can properly be associated with
         * the right sub-object of the BidRequest.Imp.
         * </pre>
         *
         * <code>optional int32 mtype = 33;</code>
         * @return The mtype.
         */
        @java.lang.Override
        public int getMtype() {
          return mtype_;
        }

        public static final int SLOTINPOD_FIELD_NUMBER = 28;
        private int slotinpod_;
        /**
         * <pre>
         * Indicates that the bid response is only eligible for a specific
         * position within a video or audio ad pod (e.g. first position, last
         * position, or any).
         * </pre>
         *
         * <code>optional int32 slotinpod = 28 [default = 0];</code>
         * @return Whether the slotinpod field is set.
         */
        @java.lang.Override
        public boolean hasSlotinpod() {
          return ((bitField0_ & 0x10000000) != 0);
        }
        /**
         * <pre>
         * Indicates that the bid response is only eligible for a specific
         * position within a video or audio ad pod (e.g. first position, last
         * position, or any).
         * </pre>
         *
         * <code>optional int32 slotinpod = 28 [default = 0];</code>
         * @return The slotinpod.
         */
        @java.lang.Override
        public int getSlotinpod() {
          return slotinpod_;
        }

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

          if (!hasId()) {
            memoizedIsInitialized = 0;
            return false;
          }
          if (!hasImpid()) {
            memoizedIsInitialized = 0;
            return false;
          }
          if (!hasPrice()) {
            memoizedIsInitialized = 0;
            return false;
          }
          if (hasAdmNative()) {
            if (!getAdmNative().isInitialized()) {
              memoizedIsInitialized = 0;
              return false;
            }
          }
          if (!extensionsAreInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
          memoizedIsInitialized = 1;
          return true;
        }

        @java.lang.Override
        public void writeTo(com.google.protobuf.CodedOutputStream output)
                            throws java.io.IOException {
          getSerializedSize();
          com.google.protobuf.GeneratedMessageV3
            .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid>.ExtensionWriter
              extensionWriter = newExtensionWriter();
          if (((bitField0_ & 0x00000001) != 0)) {
            com.google.protobuf.GeneratedMessageV3.writeString(output, 1, id_);
          }
          if (((bitField0_ & 0x00000002) != 0)) {
            com.google.protobuf.GeneratedMessageV3.writeString(output, 2, impid_);
          }
          if (((bitField0_ & 0x00000004) != 0)) {
            output.writeDouble(3, price_);
          }
          if (((bitField0_ & 0x00000008) != 0)) {
            com.google.protobuf.GeneratedMessageV3.writeString(output, 4, adid_);
          }
          if (((bitField0_ & 0x00000010) != 0)) {
            com.google.protobuf.GeneratedMessageV3.writeString(output, 5, nurl_);
          }
          if (admOneofCase_ == 6) {
            com.google.protobuf.GeneratedMessageV3.writeString(output, 6, admOneof_);
          }
          for (int i = 0; i < adomain_.size(); i++) {
            com.google.protobuf.GeneratedMessageV3.writeString(output, 7, adomain_.getRaw(i));
          }
          if (((bitField0_ & 0x00000100) != 0)) {
            com.google.protobuf.GeneratedMessageV3.writeString(output, 8, iurl_);
          }
          if (((bitField0_ & 0x00000200) != 0)) {
            com.google.protobuf.GeneratedMessageV3.writeString(output, 9, cid_);
          }
          if (((bitField0_ & 0x00000400) != 0)) {
            com.google.protobuf.GeneratedMessageV3.writeString(output, 10, crid_);
          }
          if (getAttrList().size() > 0) {
            output.writeUInt32NoTag(90);
            output.writeUInt32NoTag(attrMemoizedSerializedSize);
          }
          for (int i = 0; i < attr_.size(); i++) {
            output.writeInt32NoTag(attr_.getInt(i));
          }
          if (((bitField0_ & 0x00008000) != 0)) {
            com.google.protobuf.GeneratedMessageV3.writeString(output, 13, dealid_);
          }
          if (((bitField0_ & 0x00000080) != 0)) {
            com.google.protobuf.GeneratedMessageV3.writeString(output, 14, bundle_);
          }
          for (int i = 0; i < cat_.size(); i++) {
            com.google.protobuf.GeneratedMessageV3.writeString(output, 15, cat_.getRaw(i));
          }
          if (((bitField0_ & 0x00010000) != 0)) {
            output.writeInt32(16, w_);
          }
          if (((bitField0_ & 0x00020000) != 0)) {
            output.writeInt32(17, h_);
          }
          if (((bitField0_ & 0x00001000) != 0)) {
            output.writeInt32(18, api_);
          }
          if (((bitField0_ & 0x00002000) != 0)) {
            output.writeInt32(19, protocol_);
          }
          if (((bitField0_ & 0x00004000) != 0)) {
            output.writeInt32(20, qagmediarating_);
          }
          if (((bitField0_ & 0x00040000) != 0)) {
            output.writeInt32(21, exp_);
          }
          if (((bitField0_ & 0x00080000) != 0)) {
            com.google.protobuf.GeneratedMessageV3.writeString(output, 22, burl_);
          }
          if (((bitField0_ & 0x00100000) != 0)) {
            com.google.protobuf.GeneratedMessageV3.writeString(output, 23, lurl_);
          }
          if (((bitField0_ & 0x00200000) != 0)) {
            com.google.protobuf.GeneratedMessageV3.writeString(output, 24, tactic_);
          }
          if (((bitField0_ & 0x00400000) != 0)) {
            com.google.protobuf.GeneratedMessageV3.writeString(output, 25, language_);
          }
          if (((bitField0_ & 0x01000000) != 0)) {
            output.writeInt32(26, wratio_);
          }
          if (((bitField0_ & 0x02000000) != 0)) {
            output.writeInt32(27, hratio_);
          }
          if (((bitField0_ & 0x10000000) != 0)) {
            output.writeInt32(28, slotinpod_);
          }
          if (((bitField0_ & 0x00800000) != 0)) {
            com.google.protobuf.GeneratedMessageV3.writeString(output, 29, langb_);
          }
          if (((bitField0_ & 0x00000800) != 0)) {
            output.writeInt32(30, cattax_);
          }
          if (getApisList().size() > 0) {
            output.writeUInt32NoTag(250);
            output.writeUInt32NoTag(apisMemoizedSerializedSize);
          }
          for (int i = 0; i < apis_.size(); i++) {
            output.writeInt32NoTag(apis_.getInt(i));
          }
          if (((bitField0_ & 0x04000000) != 0)) {
            output.writeInt32(32, dur_);
          }
          if (((bitField0_ & 0x08000000) != 0)) {
            output.writeInt32(33, mtype_);
          }
          if (admOneofCase_ == 50) {
            output.writeMessage(50, (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse) admOneof_);
          }
          extensionWriter.writeUntil(10000, output);
          unknownFields.writeTo(output);
        }

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

          size = 0;
          if (((bitField0_ & 0x00000001) != 0)) {
            size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, id_);
          }
          if (((bitField0_ & 0x00000002) != 0)) {
            size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, impid_);
          }
          if (((bitField0_ & 0x00000004) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeDoubleSize(3, price_);
          }
          if (((bitField0_ & 0x00000008) != 0)) {
            size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, adid_);
          }
          if (((bitField0_ & 0x00000010) != 0)) {
            size += com.google.protobuf.GeneratedMessageV3.computeStringSize(5, nurl_);
          }
          if (admOneofCase_ == 6) {
            size += com.google.protobuf.GeneratedMessageV3.computeStringSize(6, admOneof_);
          }
          {
            int dataSize = 0;
            for (int i = 0; i < adomain_.size(); i++) {
              dataSize += computeStringSizeNoTag(adomain_.getRaw(i));
            }
            size += dataSize;
            size += 1 * getAdomainList().size();
          }
          if (((bitField0_ & 0x00000100) != 0)) {
            size += com.google.protobuf.GeneratedMessageV3.computeStringSize(8, iurl_);
          }
          if (((bitField0_ & 0x00000200) != 0)) {
            size += com.google.protobuf.GeneratedMessageV3.computeStringSize(9, cid_);
          }
          if (((bitField0_ & 0x00000400) != 0)) {
            size += com.google.protobuf.GeneratedMessageV3.computeStringSize(10, crid_);
          }
          {
            int dataSize = 0;
            for (int i = 0; i < attr_.size(); i++) {
              dataSize += com.google.protobuf.CodedOutputStream
                .computeInt32SizeNoTag(attr_.getInt(i));
            }
            size += dataSize;
            if (!getAttrList().isEmpty()) {
              size += 1;
              size += com.google.protobuf.CodedOutputStream
                  .computeInt32SizeNoTag(dataSize);
            }
            attrMemoizedSerializedSize = dataSize;
          }
          if (((bitField0_ & 0x00008000) != 0)) {
            size += com.google.protobuf.GeneratedMessageV3.computeStringSize(13, dealid_);
          }
          if (((bitField0_ & 0x00000080) != 0)) {
            size += com.google.protobuf.GeneratedMessageV3.computeStringSize(14, bundle_);
          }
          {
            int dataSize = 0;
            for (int i = 0; i < cat_.size(); i++) {
              dataSize += computeStringSizeNoTag(cat_.getRaw(i));
            }
            size += dataSize;
            size += 1 * getCatList().size();
          }
          if (((bitField0_ & 0x00010000) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(16, w_);
          }
          if (((bitField0_ & 0x00020000) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(17, h_);
          }
          if (((bitField0_ & 0x00001000) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(18, api_);
          }
          if (((bitField0_ & 0x00002000) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(19, protocol_);
          }
          if (((bitField0_ & 0x00004000) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(20, qagmediarating_);
          }
          if (((bitField0_ & 0x00040000) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(21, exp_);
          }
          if (((bitField0_ & 0x00080000) != 0)) {
            size += com.google.protobuf.GeneratedMessageV3.computeStringSize(22, burl_);
          }
          if (((bitField0_ & 0x00100000) != 0)) {
            size += com.google.protobuf.GeneratedMessageV3.computeStringSize(23, lurl_);
          }
          if (((bitField0_ & 0x00200000) != 0)) {
            size += com.google.protobuf.GeneratedMessageV3.computeStringSize(24, tactic_);
          }
          if (((bitField0_ & 0x00400000) != 0)) {
            size += com.google.protobuf.GeneratedMessageV3.computeStringSize(25, language_);
          }
          if (((bitField0_ & 0x01000000) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(26, wratio_);
          }
          if (((bitField0_ & 0x02000000) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(27, hratio_);
          }
          if (((bitField0_ & 0x10000000) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(28, slotinpod_);
          }
          if (((bitField0_ & 0x00800000) != 0)) {
            size += com.google.protobuf.GeneratedMessageV3.computeStringSize(29, langb_);
          }
          if (((bitField0_ & 0x00000800) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(30, cattax_);
          }
          {
            int dataSize = 0;
            for (int i = 0; i < apis_.size(); i++) {
              dataSize += com.google.protobuf.CodedOutputStream
                .computeInt32SizeNoTag(apis_.getInt(i));
            }
            size += dataSize;
            if (!getApisList().isEmpty()) {
              size += 2;
              size += com.google.protobuf.CodedOutputStream
                  .computeInt32SizeNoTag(dataSize);
            }
            apisMemoizedSerializedSize = dataSize;
          }
          if (((bitField0_ & 0x04000000) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(32, dur_);
          }
          if (((bitField0_ & 0x08000000) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(33, mtype_);
          }
          if (admOneofCase_ == 50) {
            size += com.google.protobuf.CodedOutputStream
              .computeMessageSize(50, (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse) admOneof_);
          }
          size += extensionsSerializedSize();
          size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid)) {
            return super.equals(obj);
          }
          com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid other = (com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid) obj;

          if (hasId() != other.hasId()) return false;
          if (hasId()) {
            if (!getId()
                .equals(other.getId())) return false;
          }
          if (hasImpid() != other.hasImpid()) return false;
          if (hasImpid()) {
            if (!getImpid()
                .equals(other.getImpid())) return false;
          }
          if (hasPrice() != other.hasPrice()) return false;
          if (hasPrice()) {
            if (java.lang.Double.doubleToLongBits(getPrice())
                != java.lang.Double.doubleToLongBits(
                    other.getPrice())) return false;
          }
          if (hasAdid() != other.hasAdid()) return false;
          if (hasAdid()) {
            if (!getAdid()
                .equals(other.getAdid())) return false;
          }
          if (hasNurl() != other.hasNurl()) return false;
          if (hasNurl()) {
            if (!getNurl()
                .equals(other.getNurl())) return false;
          }
          if (!getAdomainList()
              .equals(other.getAdomainList())) return false;
          if (hasBundle() != other.hasBundle()) return false;
          if (hasBundle()) {
            if (!getBundle()
                .equals(other.getBundle())) return false;
          }
          if (hasIurl() != other.hasIurl()) return false;
          if (hasIurl()) {
            if (!getIurl()
                .equals(other.getIurl())) return false;
          }
          if (hasCid() != other.hasCid()) return false;
          if (hasCid()) {
            if (!getCid()
                .equals(other.getCid())) return false;
          }
          if (hasCrid() != other.hasCrid()) return false;
          if (hasCrid()) {
            if (!getCrid()
                .equals(other.getCrid())) return false;
          }
          if (hasCattax() != other.hasCattax()) return false;
          if (hasCattax()) {
            if (getCattax()
                != other.getCattax()) return false;
          }
          if (!getCatList()
              .equals(other.getCatList())) return false;
          if (!getAttrList()
              .equals(other.getAttrList())) return false;
          if (!getApisList()
              .equals(other.getApisList())) return false;
          if (hasApi() != other.hasApi()) return false;
          if (hasApi()) {
            if (getApi()
                != other.getApi()) return false;
          }
          if (hasProtocol() != other.hasProtocol()) return false;
          if (hasProtocol()) {
            if (getProtocol()
                != other.getProtocol()) return false;
          }
          if (hasQagmediarating() != other.hasQagmediarating()) return false;
          if (hasQagmediarating()) {
            if (getQagmediarating()
                != other.getQagmediarating()) return false;
          }
          if (hasDealid() != other.hasDealid()) return false;
          if (hasDealid()) {
            if (!getDealid()
                .equals(other.getDealid())) return false;
          }
          if (hasW() != other.hasW()) return false;
          if (hasW()) {
            if (getW()
                != other.getW()) return false;
          }
          if (hasH() != other.hasH()) return false;
          if (hasH()) {
            if (getH()
                != other.getH()) return false;
          }
          if (hasExp() != other.hasExp()) return false;
          if (hasExp()) {
            if (getExp()
                != other.getExp()) return false;
          }
          if (hasBurl() != other.hasBurl()) return false;
          if (hasBurl()) {
            if (!getBurl()
                .equals(other.getBurl())) return false;
          }
          if (hasLurl() != other.hasLurl()) return false;
          if (hasLurl()) {
            if (!getLurl()
                .equals(other.getLurl())) return false;
          }
          if (hasTactic() != other.hasTactic()) return false;
          if (hasTactic()) {
            if (!getTactic()
                .equals(other.getTactic())) return false;
          }
          if (hasLanguage() != other.hasLanguage()) return false;
          if (hasLanguage()) {
            if (!getLanguage()
                .equals(other.getLanguage())) return false;
          }
          if (hasLangb() != other.hasLangb()) return false;
          if (hasLangb()) {
            if (!getLangb()
                .equals(other.getLangb())) return false;
          }
          if (hasWratio() != other.hasWratio()) return false;
          if (hasWratio()) {
            if (getWratio()
                != other.getWratio()) return false;
          }
          if (hasHratio() != other.hasHratio()) return false;
          if (hasHratio()) {
            if (getHratio()
                != other.getHratio()) return false;
          }
          if (hasDur() != other.hasDur()) return false;
          if (hasDur()) {
            if (getDur()
                != other.getDur()) return false;
          }
          if (hasMtype() != other.hasMtype()) return false;
          if (hasMtype()) {
            if (getMtype()
                != other.getMtype()) return false;
          }
          if (hasSlotinpod() != other.hasSlotinpod()) return false;
          if (hasSlotinpod()) {
            if (getSlotinpod()
                != other.getSlotinpod()) return false;
          }
          if (!getAdmOneofCase().equals(other.getAdmOneofCase())) return false;
          switch (admOneofCase_) {
            case 6:
              if (!getAdm()
                  .equals(other.getAdm())) return false;
              break;
            case 50:
              if (!getAdmNative()
                  .equals(other.getAdmNative())) return false;
              break;
            case 0:
            default:
          }
          if (!unknownFields.equals(other.unknownFields)) return false;
          if (!getExtensionFields().equals(other.getExtensionFields()))
            return false;
          return true;
        }

        @java.lang.Override
        public int hashCode() {
          if (memoizedHashCode != 0) {
            return memoizedHashCode;
          }
          int hash = 41;
          hash = (19 * hash) + getDescriptor().hashCode();
          if (hasId()) {
            hash = (37 * hash) + ID_FIELD_NUMBER;
            hash = (53 * hash) + getId().hashCode();
          }
          if (hasImpid()) {
            hash = (37 * hash) + IMPID_FIELD_NUMBER;
            hash = (53 * hash) + getImpid().hashCode();
          }
          if (hasPrice()) {
            hash = (37 * hash) + PRICE_FIELD_NUMBER;
            hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
                java.lang.Double.doubleToLongBits(getPrice()));
          }
          if (hasAdid()) {
            hash = (37 * hash) + ADID_FIELD_NUMBER;
            hash = (53 * hash) + getAdid().hashCode();
          }
          if (hasNurl()) {
            hash = (37 * hash) + NURL_FIELD_NUMBER;
            hash = (53 * hash) + getNurl().hashCode();
          }
          if (getAdomainCount() > 0) {
            hash = (37 * hash) + ADOMAIN_FIELD_NUMBER;
            hash = (53 * hash) + getAdomainList().hashCode();
          }
          if (hasBundle()) {
            hash = (37 * hash) + BUNDLE_FIELD_NUMBER;
            hash = (53 * hash) + getBundle().hashCode();
          }
          if (hasIurl()) {
            hash = (37 * hash) + IURL_FIELD_NUMBER;
            hash = (53 * hash) + getIurl().hashCode();
          }
          if (hasCid()) {
            hash = (37 * hash) + CID_FIELD_NUMBER;
            hash = (53 * hash) + getCid().hashCode();
          }
          if (hasCrid()) {
            hash = (37 * hash) + CRID_FIELD_NUMBER;
            hash = (53 * hash) + getCrid().hashCode();
          }
          if (hasCattax()) {
            hash = (37 * hash) + CATTAX_FIELD_NUMBER;
            hash = (53 * hash) + getCattax();
          }
          if (getCatCount() > 0) {
            hash = (37 * hash) + CAT_FIELD_NUMBER;
            hash = (53 * hash) + getCatList().hashCode();
          }
          if (getAttrCount() > 0) {
            hash = (37 * hash) + ATTR_FIELD_NUMBER;
            hash = (53 * hash) + getAttrList().hashCode();
          }
          if (getApisCount() > 0) {
            hash = (37 * hash) + APIS_FIELD_NUMBER;
            hash = (53 * hash) + getApisList().hashCode();
          }
          if (hasApi()) {
            hash = (37 * hash) + API_FIELD_NUMBER;
            hash = (53 * hash) + getApi();
          }
          if (hasProtocol()) {
            hash = (37 * hash) + PROTOCOL_FIELD_NUMBER;
            hash = (53 * hash) + getProtocol();
          }
          if (hasQagmediarating()) {
            hash = (37 * hash) + QAGMEDIARATING_FIELD_NUMBER;
            hash = (53 * hash) + getQagmediarating();
          }
          if (hasDealid()) {
            hash = (37 * hash) + DEALID_FIELD_NUMBER;
            hash = (53 * hash) + getDealid().hashCode();
          }
          if (hasW()) {
            hash = (37 * hash) + W_FIELD_NUMBER;
            hash = (53 * hash) + getW();
          }
          if (hasH()) {
            hash = (37 * hash) + H_FIELD_NUMBER;
            hash = (53 * hash) + getH();
          }
          if (hasExp()) {
            hash = (37 * hash) + EXP_FIELD_NUMBER;
            hash = (53 * hash) + getExp();
          }
          if (hasBurl()) {
            hash = (37 * hash) + BURL_FIELD_NUMBER;
            hash = (53 * hash) + getBurl().hashCode();
          }
          if (hasLurl()) {
            hash = (37 * hash) + LURL_FIELD_NUMBER;
            hash = (53 * hash) + getLurl().hashCode();
          }
          if (hasTactic()) {
            hash = (37 * hash) + TACTIC_FIELD_NUMBER;
            hash = (53 * hash) + getTactic().hashCode();
          }
          if (hasLanguage()) {
            hash = (37 * hash) + LANGUAGE_FIELD_NUMBER;
            hash = (53 * hash) + getLanguage().hashCode();
          }
          if (hasLangb()) {
            hash = (37 * hash) + LANGB_FIELD_NUMBER;
            hash = (53 * hash) + getLangb().hashCode();
          }
          if (hasWratio()) {
            hash = (37 * hash) + WRATIO_FIELD_NUMBER;
            hash = (53 * hash) + getWratio();
          }
          if (hasHratio()) {
            hash = (37 * hash) + HRATIO_FIELD_NUMBER;
            hash = (53 * hash) + getHratio();
          }
          if (hasDur()) {
            hash = (37 * hash) + DUR_FIELD_NUMBER;
            hash = (53 * hash) + getDur();
          }
          if (hasMtype()) {
            hash = (37 * hash) + MTYPE_FIELD_NUMBER;
            hash = (53 * hash) + getMtype();
          }
          if (hasSlotinpod()) {
            hash = (37 * hash) + SLOTINPOD_FIELD_NUMBER;
            hash = (53 * hash) + getSlotinpod();
          }
          switch (admOneofCase_) {
            case 6:
              hash = (37 * hash) + ADM_FIELD_NUMBER;
              hash = (53 * hash) + getAdm().hashCode();
              break;
            case 50:
              hash = (37 * hash) + ADM_NATIVE_FIELD_NUMBER;
              hash = (53 * hash) + getAdmNative().hashCode();
              break;
            case 0:
            default:
          }
          hash = hashFields(hash, getExtensionFields());
          hash = (29 * hash) + unknownFields.hashCode();
          memoizedHashCode = hash;
          return hash;
        }

        public static com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid parseFrom(
            java.nio.ByteBuffer data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid parseFrom(
            java.nio.ByteBuffer data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid parseFrom(
            com.google.protobuf.ByteString data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid parseFrom(
            com.google.protobuf.ByteString data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid parseFrom(byte[] data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid parseFrom(
            byte[] data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid parseFrom(java.io.InputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid 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.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid parseDelimitedFrom(java.io.InputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseDelimitedWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid 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.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid parseFrom(
            com.google.protobuf.CodedInputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid 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.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid 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>
         * OpenRTB 2.0: A SeatBid object contains one or more Bid objects,
         * each of which relates to a specific impression in the bid request
         * via the impid attribute and constitutes an offer to buy that impression
         * for a given price.
         * </pre>
         *
         * Protobuf type {@code com.iabtechlab.openrtb.v2.BidResponse.SeatBid.Bid}
         */
        public static final class Builder extends
            com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
              com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid, Builder> implements
            // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.BidResponse.SeatBid.Bid)
            com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.BidOrBuilder {
          public static final com.google.protobuf.Descriptors.Descriptor
              getDescriptor() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidResponse_SeatBid_Bid_descriptor;
          }

          @java.lang.Override
          protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
              internalGetFieldAccessorTable() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidResponse_SeatBid_Bid_fieldAccessorTable
                .ensureFieldAccessorsInitialized(
                    com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid.class, com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid.Builder.class);
          }

          // Construct using com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid.newBuilder()
          private Builder() {
            maybeForceBuilderInitialization();
          }

          private Builder(
              com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
            super(parent);
            maybeForceBuilderInitialization();
          }
          private void maybeForceBuilderInitialization() {
            if (com.google.protobuf.GeneratedMessageV3
                    .alwaysUseFieldBuilders) {
            }
          }
          @java.lang.Override
          public Builder clear() {
            super.clear();
            id_ = "";
            bitField0_ = (bitField0_ & ~0x00000001);
            impid_ = "";
            bitField0_ = (bitField0_ & ~0x00000002);
            price_ = 0D;
            bitField0_ = (bitField0_ & ~0x00000004);
            adid_ = "";
            bitField0_ = (bitField0_ & ~0x00000008);
            nurl_ = "";
            bitField0_ = (bitField0_ & ~0x00000010);
            adomain_ = com.google.protobuf.LazyStringArrayList.EMPTY;
            bitField0_ = (bitField0_ & ~0x00000080);
            bundle_ = "";
            bitField0_ = (bitField0_ & ~0x00000100);
            iurl_ = "";
            bitField0_ = (bitField0_ & ~0x00000200);
            cid_ = "";
            bitField0_ = (bitField0_ & ~0x00000400);
            crid_ = "";
            bitField0_ = (bitField0_ & ~0x00000800);
            cattax_ = 1;
            bitField0_ = (bitField0_ & ~0x00001000);
            cat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
            bitField0_ = (bitField0_ & ~0x00002000);
            attr_ = emptyIntList();
            bitField0_ = (bitField0_ & ~0x00004000);
            apis_ = emptyIntList();
            bitField0_ = (bitField0_ & ~0x00008000);
            api_ = 0;
            bitField0_ = (bitField0_ & ~0x00010000);
            protocol_ = 0;
            bitField0_ = (bitField0_ & ~0x00020000);
            qagmediarating_ = 0;
            bitField0_ = (bitField0_ & ~0x00040000);
            dealid_ = "";
            bitField0_ = (bitField0_ & ~0x00080000);
            w_ = 0;
            bitField0_ = (bitField0_ & ~0x00100000);
            h_ = 0;
            bitField0_ = (bitField0_ & ~0x00200000);
            exp_ = 0;
            bitField0_ = (bitField0_ & ~0x00400000);
            burl_ = "";
            bitField0_ = (bitField0_ & ~0x00800000);
            lurl_ = "";
            bitField0_ = (bitField0_ & ~0x01000000);
            tactic_ = "";
            bitField0_ = (bitField0_ & ~0x02000000);
            language_ = "";
            bitField0_ = (bitField0_ & ~0x04000000);
            langb_ = "";
            bitField0_ = (bitField0_ & ~0x08000000);
            wratio_ = 0;
            bitField0_ = (bitField0_ & ~0x10000000);
            hratio_ = 0;
            bitField0_ = (bitField0_ & ~0x20000000);
            dur_ = 0;
            bitField0_ = (bitField0_ & ~0x40000000);
            mtype_ = 0;
            bitField0_ = (bitField0_ & ~0x80000000);
            slotinpod_ = 0;
            bitField1_ = (bitField1_ & ~0x00000001);
            admOneofCase_ = 0;
            admOneof_ = null;
            return this;
          }

          @java.lang.Override
          public com.google.protobuf.Descriptors.Descriptor
              getDescriptorForType() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidResponse_SeatBid_Bid_descriptor;
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid getDefaultInstanceForType() {
            return com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid.getDefaultInstance();
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid build() {
            com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid result = buildPartial();
            if (!result.isInitialized()) {
              throw newUninitializedMessageException(result);
            }
            return result;
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid buildPartial() {
            com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid result = new com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid(this);
            int from_bitField0_ = bitField0_;
            int from_bitField1_ = bitField1_;
            int to_bitField0_ = 0;
            if (((from_bitField0_ & 0x00000001) != 0)) {
              to_bitField0_ |= 0x00000001;
            }
            result.id_ = id_;
            if (((from_bitField0_ & 0x00000002) != 0)) {
              to_bitField0_ |= 0x00000002;
            }
            result.impid_ = impid_;
            if (((from_bitField0_ & 0x00000004) != 0)) {
              result.price_ = price_;
              to_bitField0_ |= 0x00000004;
            }
            if (((from_bitField0_ & 0x00000008) != 0)) {
              to_bitField0_ |= 0x00000008;
            }
            result.adid_ = adid_;
            if (((from_bitField0_ & 0x00000010) != 0)) {
              to_bitField0_ |= 0x00000010;
            }
            result.nurl_ = nurl_;
            if (admOneofCase_ == 6) {
              result.admOneof_ = admOneof_;
            }
            if (admOneofCase_ == 50) {
              if (admNativeBuilder_ == null) {
                result.admOneof_ = admOneof_;
              } else {
                result.admOneof_ = admNativeBuilder_.build();
              }
            }
            if (((bitField0_ & 0x00000080) != 0)) {
              adomain_ = adomain_.getUnmodifiableView();
              bitField0_ = (bitField0_ & ~0x00000080);
            }
            result.adomain_ = adomain_;
            if (((from_bitField0_ & 0x00000100) != 0)) {
              to_bitField0_ |= 0x00000080;
            }
            result.bundle_ = bundle_;
            if (((from_bitField0_ & 0x00000200) != 0)) {
              to_bitField0_ |= 0x00000100;
            }
            result.iurl_ = iurl_;
            if (((from_bitField0_ & 0x00000400) != 0)) {
              to_bitField0_ |= 0x00000200;
            }
            result.cid_ = cid_;
            if (((from_bitField0_ & 0x00000800) != 0)) {
              to_bitField0_ |= 0x00000400;
            }
            result.crid_ = crid_;
            if (((from_bitField0_ & 0x00001000) != 0)) {
              to_bitField0_ |= 0x00000800;
            }
            result.cattax_ = cattax_;
            if (((bitField0_ & 0x00002000) != 0)) {
              cat_ = cat_.getUnmodifiableView();
              bitField0_ = (bitField0_ & ~0x00002000);
            }
            result.cat_ = cat_;
            if (((bitField0_ & 0x00004000) != 0)) {
              attr_.makeImmutable();
              bitField0_ = (bitField0_ & ~0x00004000);
            }
            result.attr_ = attr_;
            if (((bitField0_ & 0x00008000) != 0)) {
              apis_.makeImmutable();
              bitField0_ = (bitField0_ & ~0x00008000);
            }
            result.apis_ = apis_;
            if (((from_bitField0_ & 0x00010000) != 0)) {
              result.api_ = api_;
              to_bitField0_ |= 0x00001000;
            }
            if (((from_bitField0_ & 0x00020000) != 0)) {
              result.protocol_ = protocol_;
              to_bitField0_ |= 0x00002000;
            }
            if (((from_bitField0_ & 0x00040000) != 0)) {
              result.qagmediarating_ = qagmediarating_;
              to_bitField0_ |= 0x00004000;
            }
            if (((from_bitField0_ & 0x00080000) != 0)) {
              to_bitField0_ |= 0x00008000;
            }
            result.dealid_ = dealid_;
            if (((from_bitField0_ & 0x00100000) != 0)) {
              result.w_ = w_;
              to_bitField0_ |= 0x00010000;
            }
            if (((from_bitField0_ & 0x00200000) != 0)) {
              result.h_ = h_;
              to_bitField0_ |= 0x00020000;
            }
            if (((from_bitField0_ & 0x00400000) != 0)) {
              result.exp_ = exp_;
              to_bitField0_ |= 0x00040000;
            }
            if (((from_bitField0_ & 0x00800000) != 0)) {
              to_bitField0_ |= 0x00080000;
            }
            result.burl_ = burl_;
            if (((from_bitField0_ & 0x01000000) != 0)) {
              to_bitField0_ |= 0x00100000;
            }
            result.lurl_ = lurl_;
            if (((from_bitField0_ & 0x02000000) != 0)) {
              to_bitField0_ |= 0x00200000;
            }
            result.tactic_ = tactic_;
            if (((from_bitField0_ & 0x04000000) != 0)) {
              to_bitField0_ |= 0x00400000;
            }
            result.language_ = language_;
            if (((from_bitField0_ & 0x08000000) != 0)) {
              to_bitField0_ |= 0x00800000;
            }
            result.langb_ = langb_;
            if (((from_bitField0_ & 0x10000000) != 0)) {
              result.wratio_ = wratio_;
              to_bitField0_ |= 0x01000000;
            }
            if (((from_bitField0_ & 0x20000000) != 0)) {
              result.hratio_ = hratio_;
              to_bitField0_ |= 0x02000000;
            }
            if (((from_bitField0_ & 0x40000000) != 0)) {
              result.dur_ = dur_;
              to_bitField0_ |= 0x04000000;
            }
            if (((from_bitField0_ & 0x80000000) != 0)) {
              result.mtype_ = mtype_;
              to_bitField0_ |= 0x08000000;
            }
            if (((from_bitField1_ & 0x00000001) != 0)) {
              result.slotinpod_ = slotinpod_;
              to_bitField0_ |= 0x10000000;
            }
            result.bitField0_ = to_bitField0_;
            result.admOneofCase_ = admOneofCase_;
            onBuilt();
            return result;
          }

          @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 <Type> Builder setExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid, Type> extension,
              Type value) {
            return super.setExtension(extension, value);
          }
          @java.lang.Override
          public <Type> Builder setExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid, java.util.List<Type>> extension,
              int index, Type value) {
            return super.setExtension(extension, index, value);
          }
          @java.lang.Override
          public <Type> Builder addExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid, java.util.List<Type>> extension,
              Type value) {
            return super.addExtension(extension, value);
          }
          @java.lang.Override
          public <Type> Builder clearExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid, ?> extension) {
            return super.clearExtension(extension);
          }
          @java.lang.Override
          public Builder mergeFrom(com.google.protobuf.Message other) {
            if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid) {
              return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid)other);
            } else {
              super.mergeFrom(other);
              return this;
            }
          }

          public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid other) {
            if (other == com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid.getDefaultInstance()) return this;
            if (other.hasId()) {
              bitField0_ |= 0x00000001;
              id_ = other.id_;
              onChanged();
            }
            if (other.hasImpid()) {
              bitField0_ |= 0x00000002;
              impid_ = other.impid_;
              onChanged();
            }
            if (other.hasPrice()) {
              setPrice(other.getPrice());
            }
            if (other.hasAdid()) {
              bitField0_ |= 0x00000008;
              adid_ = other.adid_;
              onChanged();
            }
            if (other.hasNurl()) {
              bitField0_ |= 0x00000010;
              nurl_ = other.nurl_;
              onChanged();
            }
            if (!other.adomain_.isEmpty()) {
              if (adomain_.isEmpty()) {
                adomain_ = other.adomain_;
                bitField0_ = (bitField0_ & ~0x00000080);
              } else {
                ensureAdomainIsMutable();
                adomain_.addAll(other.adomain_);
              }
              onChanged();
            }
            if (other.hasBundle()) {
              bitField0_ |= 0x00000100;
              bundle_ = other.bundle_;
              onChanged();
            }
            if (other.hasIurl()) {
              bitField0_ |= 0x00000200;
              iurl_ = other.iurl_;
              onChanged();
            }
            if (other.hasCid()) {
              bitField0_ |= 0x00000400;
              cid_ = other.cid_;
              onChanged();
            }
            if (other.hasCrid()) {
              bitField0_ |= 0x00000800;
              crid_ = other.crid_;
              onChanged();
            }
            if (other.hasCattax()) {
              setCattax(other.getCattax());
            }
            if (!other.cat_.isEmpty()) {
              if (cat_.isEmpty()) {
                cat_ = other.cat_;
                bitField0_ = (bitField0_ & ~0x00002000);
              } else {
                ensureCatIsMutable();
                cat_.addAll(other.cat_);
              }
              onChanged();
            }
            if (!other.attr_.isEmpty()) {
              if (attr_.isEmpty()) {
                attr_ = other.attr_;
                bitField0_ = (bitField0_ & ~0x00004000);
              } else {
                ensureAttrIsMutable();
                attr_.addAll(other.attr_);
              }
              onChanged();
            }
            if (!other.apis_.isEmpty()) {
              if (apis_.isEmpty()) {
                apis_ = other.apis_;
                bitField0_ = (bitField0_ & ~0x00008000);
              } else {
                ensureApisIsMutable();
                apis_.addAll(other.apis_);
              }
              onChanged();
            }
            if (other.hasApi()) {
              setApi(other.getApi());
            }
            if (other.hasProtocol()) {
              setProtocol(other.getProtocol());
            }
            if (other.hasQagmediarating()) {
              setQagmediarating(other.getQagmediarating());
            }
            if (other.hasDealid()) {
              bitField0_ |= 0x00080000;
              dealid_ = other.dealid_;
              onChanged();
            }
            if (other.hasW()) {
              setW(other.getW());
            }
            if (other.hasH()) {
              setH(other.getH());
            }
            if (other.hasExp()) {
              setExp(other.getExp());
            }
            if (other.hasBurl()) {
              bitField0_ |= 0x00800000;
              burl_ = other.burl_;
              onChanged();
            }
            if (other.hasLurl()) {
              bitField0_ |= 0x01000000;
              lurl_ = other.lurl_;
              onChanged();
            }
            if (other.hasTactic()) {
              bitField0_ |= 0x02000000;
              tactic_ = other.tactic_;
              onChanged();
            }
            if (other.hasLanguage()) {
              bitField0_ |= 0x04000000;
              language_ = other.language_;
              onChanged();
            }
            if (other.hasLangb()) {
              bitField0_ |= 0x08000000;
              langb_ = other.langb_;
              onChanged();
            }
            if (other.hasWratio()) {
              setWratio(other.getWratio());
            }
            if (other.hasHratio()) {
              setHratio(other.getHratio());
            }
            if (other.hasDur()) {
              setDur(other.getDur());
            }
            if (other.hasMtype()) {
              setMtype(other.getMtype());
            }
            if (other.hasSlotinpod()) {
              setSlotinpod(other.getSlotinpod());
            }
            switch (other.getAdmOneofCase()) {
              case ADM: {
                admOneofCase_ = 6;
                admOneof_ = other.admOneof_;
                onChanged();
                break;
              }
              case ADM_NATIVE: {
                mergeAdmNative(other.getAdmNative());
                break;
              }
              case ADMONEOF_NOT_SET: {
                break;
              }
            }
            this.mergeExtensionFields(other);
            this.mergeUnknownFields(other.unknownFields);
            onChanged();
            return this;
          }

          @java.lang.Override
          public final boolean isInitialized() {
            if (!hasId()) {
              return false;
            }
            if (!hasImpid()) {
              return false;
            }
            if (!hasPrice()) {
              return false;
            }
            if (hasAdmNative()) {
              if (!getAdmNative().isInitialized()) {
                return false;
              }
            }
            if (!extensionsAreInitialized()) {
              return false;
            }
            return true;
          }

          @java.lang.Override
          public Builder mergeFrom(
              com.google.protobuf.CodedInputStream input,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid parsedMessage = null;
            try {
              parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
              parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid) e.getUnfinishedMessage();
              throw e.unwrapIOException();
            } finally {
              if (parsedMessage != null) {
                mergeFrom(parsedMessage);
              }
            }
            return this;
          }
          private int admOneofCase_ = 0;
          private java.lang.Object admOneof_;
          public AdmOneofCase
              getAdmOneofCase() {
            return AdmOneofCase.forNumber(
                admOneofCase_);
          }

          public Builder clearAdmOneof() {
            admOneofCase_ = 0;
            admOneof_ = null;
            onChanged();
            return this;
          }

          private int bitField0_;
          private int bitField1_;

          private java.lang.Object id_ = "";
          /**
           * <pre>
           * Bidder generated bid ID to assist with logging/tracking.
           * REQUIRED by the OpenRTB specification.
           * </pre>
           *
           * <code>required string id = 1;</code>
           * @return Whether the id field is set.
           */
          public boolean hasId() {
            return ((bitField0_ & 0x00000001) != 0);
          }
          /**
           * <pre>
           * Bidder generated bid ID to assist with logging/tracking.
           * REQUIRED by the OpenRTB specification.
           * </pre>
           *
           * <code>required string id = 1;</code>
           * @return The id.
           */
          public java.lang.String getId() {
            java.lang.Object ref = id_;
            if (!(ref instanceof java.lang.String)) {
              com.google.protobuf.ByteString bs =
                  (com.google.protobuf.ByteString) ref;
              java.lang.String s = bs.toStringUtf8();
              if (bs.isValidUtf8()) {
                id_ = s;
              }
              return s;
            } else {
              return (java.lang.String) ref;
            }
          }
          /**
           * <pre>
           * Bidder generated bid ID to assist with logging/tracking.
           * REQUIRED by the OpenRTB specification.
           * </pre>
           *
           * <code>required string id = 1;</code>
           * @return The bytes for id.
           */
          public com.google.protobuf.ByteString
              getIdBytes() {
            java.lang.Object ref = id_;
            if (ref instanceof String) {
              com.google.protobuf.ByteString b = 
                  com.google.protobuf.ByteString.copyFromUtf8(
                      (java.lang.String) ref);
              id_ = b;
              return b;
            } else {
              return (com.google.protobuf.ByteString) ref;
            }
          }
          /**
           * <pre>
           * Bidder generated bid ID to assist with logging/tracking.
           * REQUIRED by the OpenRTB specification.
           * </pre>
           *
           * <code>required string id = 1;</code>
           * @param value The id to set.
           * @return This builder for chaining.
           */
          public Builder setId(
              java.lang.String value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
            id_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Bidder generated bid ID to assist with logging/tracking.
           * REQUIRED by the OpenRTB specification.
           * </pre>
           *
           * <code>required string id = 1;</code>
           * @return This builder for chaining.
           */
          public Builder clearId() {
            bitField0_ = (bitField0_ & ~0x00000001);
            id_ = getDefaultInstance().getId();
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Bidder generated bid ID to assist with logging/tracking.
           * REQUIRED by the OpenRTB specification.
           * </pre>
           *
           * <code>required string id = 1;</code>
           * @param value The bytes for id to set.
           * @return This builder for chaining.
           */
          public Builder setIdBytes(
              com.google.protobuf.ByteString value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
            id_ = value;
            onChanged();
            return this;
          }

          private java.lang.Object impid_ = "";
          /**
           * <pre>
           * ID of the Imp object in the related bid request.
           * REQUIRED by the OpenRTB specification.
           * </pre>
           *
           * <code>required string impid = 2;</code>
           * @return Whether the impid field is set.
           */
          public boolean hasImpid() {
            return ((bitField0_ & 0x00000002) != 0);
          }
          /**
           * <pre>
           * ID of the Imp object in the related bid request.
           * REQUIRED by the OpenRTB specification.
           * </pre>
           *
           * <code>required string impid = 2;</code>
           * @return The impid.
           */
          public java.lang.String getImpid() {
            java.lang.Object ref = impid_;
            if (!(ref instanceof java.lang.String)) {
              com.google.protobuf.ByteString bs =
                  (com.google.protobuf.ByteString) ref;
              java.lang.String s = bs.toStringUtf8();
              if (bs.isValidUtf8()) {
                impid_ = s;
              }
              return s;
            } else {
              return (java.lang.String) ref;
            }
          }
          /**
           * <pre>
           * ID of the Imp object in the related bid request.
           * REQUIRED by the OpenRTB specification.
           * </pre>
           *
           * <code>required string impid = 2;</code>
           * @return The bytes for impid.
           */
          public com.google.protobuf.ByteString
              getImpidBytes() {
            java.lang.Object ref = impid_;
            if (ref instanceof String) {
              com.google.protobuf.ByteString b = 
                  com.google.protobuf.ByteString.copyFromUtf8(
                      (java.lang.String) ref);
              impid_ = b;
              return b;
            } else {
              return (com.google.protobuf.ByteString) ref;
            }
          }
          /**
           * <pre>
           * ID of the Imp object in the related bid request.
           * REQUIRED by the OpenRTB specification.
           * </pre>
           *
           * <code>required string impid = 2;</code>
           * @param value The impid to set.
           * @return This builder for chaining.
           */
          public Builder setImpid(
              java.lang.String value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
            impid_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * ID of the Imp object in the related bid request.
           * REQUIRED by the OpenRTB specification.
           * </pre>
           *
           * <code>required string impid = 2;</code>
           * @return This builder for chaining.
           */
          public Builder clearImpid() {
            bitField0_ = (bitField0_ & ~0x00000002);
            impid_ = getDefaultInstance().getImpid();
            onChanged();
            return this;
          }
          /**
           * <pre>
           * ID of the Imp object in the related bid request.
           * REQUIRED by the OpenRTB specification.
           * </pre>
           *
           * <code>required string impid = 2;</code>
           * @param value The bytes for impid to set.
           * @return This builder for chaining.
           */
          public Builder setImpidBytes(
              com.google.protobuf.ByteString value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
            impid_ = value;
            onChanged();
            return this;
          }

          private double price_ ;
          /**
           * <pre>
           * Bid price expressed as CPM although the actual transaction is for a
           * unit impression only. Note that while the type indicates float, integer
           * math is highly recommended when handling currencies
           * (e.g., BigDecimal in Java).
           * REQUIRED by the OpenRTB specification.
           * </pre>
           *
           * <code>required double price = 3;</code>
           * @return Whether the price field is set.
           */
          @java.lang.Override
          public boolean hasPrice() {
            return ((bitField0_ & 0x00000004) != 0);
          }
          /**
           * <pre>
           * Bid price expressed as CPM although the actual transaction is for a
           * unit impression only. Note that while the type indicates float, integer
           * math is highly recommended when handling currencies
           * (e.g., BigDecimal in Java).
           * REQUIRED by the OpenRTB specification.
           * </pre>
           *
           * <code>required double price = 3;</code>
           * @return The price.
           */
          @java.lang.Override
          public double getPrice() {
            return price_;
          }
          /**
           * <pre>
           * Bid price expressed as CPM although the actual transaction is for a
           * unit impression only. Note that while the type indicates float, integer
           * math is highly recommended when handling currencies
           * (e.g., BigDecimal in Java).
           * REQUIRED by the OpenRTB specification.
           * </pre>
           *
           * <code>required double price = 3;</code>
           * @param value The price to set.
           * @return This builder for chaining.
           */
          public Builder setPrice(double value) {
            bitField0_ |= 0x00000004;
            price_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Bid price expressed as CPM although the actual transaction is for a
           * unit impression only. Note that while the type indicates float, integer
           * math is highly recommended when handling currencies
           * (e.g., BigDecimal in Java).
           * REQUIRED by the OpenRTB specification.
           * </pre>
           *
           * <code>required double price = 3;</code>
           * @return This builder for chaining.
           */
          public Builder clearPrice() {
            bitField0_ = (bitField0_ & ~0x00000004);
            price_ = 0D;
            onChanged();
            return this;
          }

          private java.lang.Object adid_ = "";
          /**
           * <pre>
           * ID of a preloaded ad to be served if the bid wins.
           * </pre>
           *
           * <code>optional string adid = 4;</code>
           * @return Whether the adid field is set.
           */
          public boolean hasAdid() {
            return ((bitField0_ & 0x00000008) != 0);
          }
          /**
           * <pre>
           * ID of a preloaded ad to be served if the bid wins.
           * </pre>
           *
           * <code>optional string adid = 4;</code>
           * @return The adid.
           */
          public java.lang.String getAdid() {
            java.lang.Object ref = adid_;
            if (!(ref instanceof java.lang.String)) {
              com.google.protobuf.ByteString bs =
                  (com.google.protobuf.ByteString) ref;
              java.lang.String s = bs.toStringUtf8();
              if (bs.isValidUtf8()) {
                adid_ = s;
              }
              return s;
            } else {
              return (java.lang.String) ref;
            }
          }
          /**
           * <pre>
           * ID of a preloaded ad to be served if the bid wins.
           * </pre>
           *
           * <code>optional string adid = 4;</code>
           * @return The bytes for adid.
           */
          public com.google.protobuf.ByteString
              getAdidBytes() {
            java.lang.Object ref = adid_;
            if (ref instanceof String) {
              com.google.protobuf.ByteString b = 
                  com.google.protobuf.ByteString.copyFromUtf8(
                      (java.lang.String) ref);
              adid_ = b;
              return b;
            } else {
              return (com.google.protobuf.ByteString) ref;
            }
          }
          /**
           * <pre>
           * ID of a preloaded ad to be served if the bid wins.
           * </pre>
           *
           * <code>optional string adid = 4;</code>
           * @param value The adid to set.
           * @return This builder for chaining.
           */
          public Builder setAdid(
              java.lang.String value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
            adid_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * ID of a preloaded ad to be served if the bid wins.
           * </pre>
           *
           * <code>optional string adid = 4;</code>
           * @return This builder for chaining.
           */
          public Builder clearAdid() {
            bitField0_ = (bitField0_ & ~0x00000008);
            adid_ = getDefaultInstance().getAdid();
            onChanged();
            return this;
          }
          /**
           * <pre>
           * ID of a preloaded ad to be served if the bid wins.
           * </pre>
           *
           * <code>optional string adid = 4;</code>
           * @param value The bytes for adid to set.
           * @return This builder for chaining.
           */
          public Builder setAdidBytes(
              com.google.protobuf.ByteString value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
            adid_ = value;
            onChanged();
            return this;
          }

          private java.lang.Object nurl_ = "";
          /**
           * <pre>
           * Win notice URL called by the exchange if the bid wins; optional means
           * of serving ad markup.
           * </pre>
           *
           * <code>optional string nurl = 5;</code>
           * @return Whether the nurl field is set.
           */
          public boolean hasNurl() {
            return ((bitField0_ & 0x00000010) != 0);
          }
          /**
           * <pre>
           * Win notice URL called by the exchange if the bid wins; optional means
           * of serving ad markup.
           * </pre>
           *
           * <code>optional string nurl = 5;</code>
           * @return The nurl.
           */
          public java.lang.String getNurl() {
            java.lang.Object ref = nurl_;
            if (!(ref instanceof java.lang.String)) {
              com.google.protobuf.ByteString bs =
                  (com.google.protobuf.ByteString) ref;
              java.lang.String s = bs.toStringUtf8();
              if (bs.isValidUtf8()) {
                nurl_ = s;
              }
              return s;
            } else {
              return (java.lang.String) ref;
            }
          }
          /**
           * <pre>
           * Win notice URL called by the exchange if the bid wins; optional means
           * of serving ad markup.
           * </pre>
           *
           * <code>optional string nurl = 5;</code>
           * @return The bytes for nurl.
           */
          public com.google.protobuf.ByteString
              getNurlBytes() {
            java.lang.Object ref = nurl_;
            if (ref instanceof String) {
              com.google.protobuf.ByteString b = 
                  com.google.protobuf.ByteString.copyFromUtf8(
                      (java.lang.String) ref);
              nurl_ = b;
              return b;
            } else {
              return (com.google.protobuf.ByteString) ref;
            }
          }
          /**
           * <pre>
           * Win notice URL called by the exchange if the bid wins; optional means
           * of serving ad markup.
           * </pre>
           *
           * <code>optional string nurl = 5;</code>
           * @param value The nurl to set.
           * @return This builder for chaining.
           */
          public Builder setNurl(
              java.lang.String value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
            nurl_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Win notice URL called by the exchange if the bid wins; optional means
           * of serving ad markup.
           * </pre>
           *
           * <code>optional string nurl = 5;</code>
           * @return This builder for chaining.
           */
          public Builder clearNurl() {
            bitField0_ = (bitField0_ & ~0x00000010);
            nurl_ = getDefaultInstance().getNurl();
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Win notice URL called by the exchange if the bid wins; optional means
           * of serving ad markup.
           * </pre>
           *
           * <code>optional string nurl = 5;</code>
           * @param value The bytes for nurl to set.
           * @return This builder for chaining.
           */
          public Builder setNurlBytes(
              com.google.protobuf.ByteString value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
            nurl_ = value;
            onChanged();
            return this;
          }

          /**
           * <pre>
           * Optional means of conveying ad markup in case the bid wins;
           * supersedes the win notice if markup is included in both.
           * For native ad bids, exactly one of {adm, adm_native} should be used;
           * this is the OpenRTB-compliant field for JSON serialization.
           * </pre>
           *
           * <code>string adm = 6;</code>
           * @return Whether the adm field is set.
           */
          @java.lang.Override
          public boolean hasAdm() {
            return admOneofCase_ == 6;
          }
          /**
           * <pre>
           * Optional means of conveying ad markup in case the bid wins;
           * supersedes the win notice if markup is included in both.
           * For native ad bids, exactly one of {adm, adm_native} should be used;
           * this is the OpenRTB-compliant field for JSON serialization.
           * </pre>
           *
           * <code>string adm = 6;</code>
           * @return The adm.
           */
          @java.lang.Override
          public java.lang.String getAdm() {
            java.lang.Object ref = "";
            if (admOneofCase_ == 6) {
              ref = admOneof_;
            }
            if (!(ref instanceof java.lang.String)) {
              com.google.protobuf.ByteString bs =
                  (com.google.protobuf.ByteString) ref;
              java.lang.String s = bs.toStringUtf8();
              if (admOneofCase_ == 6) {
                if (bs.isValidUtf8()) {
                  admOneof_ = s;
                }
              }
              return s;
            } else {
              return (java.lang.String) ref;
            }
          }
          /**
           * <pre>
           * Optional means of conveying ad markup in case the bid wins;
           * supersedes the win notice if markup is included in both.
           * For native ad bids, exactly one of {adm, adm_native} should be used;
           * this is the OpenRTB-compliant field for JSON serialization.
           * </pre>
           *
           * <code>string adm = 6;</code>
           * @return The bytes for adm.
           */
          @java.lang.Override
          public com.google.protobuf.ByteString
              getAdmBytes() {
            java.lang.Object ref = "";
            if (admOneofCase_ == 6) {
              ref = admOneof_;
            }
            if (ref instanceof String) {
              com.google.protobuf.ByteString b = 
                  com.google.protobuf.ByteString.copyFromUtf8(
                      (java.lang.String) ref);
              if (admOneofCase_ == 6) {
                admOneof_ = b;
              }
              return b;
            } else {
              return (com.google.protobuf.ByteString) ref;
            }
          }
          /**
           * <pre>
           * Optional means of conveying ad markup in case the bid wins;
           * supersedes the win notice if markup is included in both.
           * For native ad bids, exactly one of {adm, adm_native} should be used;
           * this is the OpenRTB-compliant field for JSON serialization.
           * </pre>
           *
           * <code>string adm = 6;</code>
           * @param value The adm to set.
           * @return This builder for chaining.
           */
          public Builder setAdm(
              java.lang.String value) {
            if (value == null) {
    throw new NullPointerException();
  }
  admOneofCase_ = 6;
            admOneof_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Optional means of conveying ad markup in case the bid wins;
           * supersedes the win notice if markup is included in both.
           * For native ad bids, exactly one of {adm, adm_native} should be used;
           * this is the OpenRTB-compliant field for JSON serialization.
           * </pre>
           *
           * <code>string adm = 6;</code>
           * @return This builder for chaining.
           */
          public Builder clearAdm() {
            if (admOneofCase_ == 6) {
              admOneofCase_ = 0;
              admOneof_ = null;
              onChanged();
            }
            return this;
          }
          /**
           * <pre>
           * Optional means of conveying ad markup in case the bid wins;
           * supersedes the win notice if markup is included in both.
           * For native ad bids, exactly one of {adm, adm_native} should be used;
           * this is the OpenRTB-compliant field for JSON serialization.
           * </pre>
           *
           * <code>string adm = 6;</code>
           * @param value The bytes for adm to set.
           * @return This builder for chaining.
           */
          public Builder setAdmBytes(
              com.google.protobuf.ByteString value) {
            if (value == null) {
    throw new NullPointerException();
  }
  admOneofCase_ = 6;
            admOneof_ = value;
            onChanged();
            return this;
          }

          private com.google.protobuf.SingleFieldBuilderV3<
              com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Builder, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponseOrBuilder> admNativeBuilder_;
          /**
           * <pre>
           * Native ad response.
           * For native ad bids, exactly one of {adm, adm_native} should be used;
           * this is the field used for Protobuf serialization.
           * </pre>
           *
           * <code>.com.iabtechlab.openrtb.v2.NativeResponse adm_native = 50;</code>
           * @return Whether the admNative field is set.
           */
          @java.lang.Override
          public boolean hasAdmNative() {
            return admOneofCase_ == 50;
          }
          /**
           * <pre>
           * Native ad response.
           * For native ad bids, exactly one of {adm, adm_native} should be used;
           * this is the field used for Protobuf serialization.
           * </pre>
           *
           * <code>.com.iabtechlab.openrtb.v2.NativeResponse adm_native = 50;</code>
           * @return The admNative.
           */
          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse getAdmNative() {
            if (admNativeBuilder_ == null) {
              if (admOneofCase_ == 50) {
                return (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse) admOneof_;
              }
              return com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.getDefaultInstance();
            } else {
              if (admOneofCase_ == 50) {
                return admNativeBuilder_.getMessage();
              }
              return com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.getDefaultInstance();
            }
          }
          /**
           * <pre>
           * Native ad response.
           * For native ad bids, exactly one of {adm, adm_native} should be used;
           * this is the field used for Protobuf serialization.
           * </pre>
           *
           * <code>.com.iabtechlab.openrtb.v2.NativeResponse adm_native = 50;</code>
           */
          public Builder setAdmNative(com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse value) {
            if (admNativeBuilder_ == null) {
              if (value == null) {
                throw new NullPointerException();
              }
              admOneof_ = value;
              onChanged();
            } else {
              admNativeBuilder_.setMessage(value);
            }
            admOneofCase_ = 50;
            return this;
          }
          /**
           * <pre>
           * Native ad response.
           * For native ad bids, exactly one of {adm, adm_native} should be used;
           * this is the field used for Protobuf serialization.
           * </pre>
           *
           * <code>.com.iabtechlab.openrtb.v2.NativeResponse adm_native = 50;</code>
           */
          public Builder setAdmNative(
              com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Builder builderForValue) {
            if (admNativeBuilder_ == null) {
              admOneof_ = builderForValue.build();
              onChanged();
            } else {
              admNativeBuilder_.setMessage(builderForValue.build());
            }
            admOneofCase_ = 50;
            return this;
          }
          /**
           * <pre>
           * Native ad response.
           * For native ad bids, exactly one of {adm, adm_native} should be used;
           * this is the field used for Protobuf serialization.
           * </pre>
           *
           * <code>.com.iabtechlab.openrtb.v2.NativeResponse adm_native = 50;</code>
           */
          public Builder mergeAdmNative(com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse value) {
            if (admNativeBuilder_ == null) {
              if (admOneofCase_ == 50 &&
                  admOneof_ != com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.getDefaultInstance()) {
                admOneof_ = com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.newBuilder((com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse) admOneof_)
                    .mergeFrom(value).buildPartial();
              } else {
                admOneof_ = value;
              }
              onChanged();
            } else {
              if (admOneofCase_ == 50) {
                admNativeBuilder_.mergeFrom(value);
              }
              admNativeBuilder_.setMessage(value);
            }
            admOneofCase_ = 50;
            return this;
          }
          /**
           * <pre>
           * Native ad response.
           * For native ad bids, exactly one of {adm, adm_native} should be used;
           * this is the field used for Protobuf serialization.
           * </pre>
           *
           * <code>.com.iabtechlab.openrtb.v2.NativeResponse adm_native = 50;</code>
           */
          public Builder clearAdmNative() {
            if (admNativeBuilder_ == null) {
              if (admOneofCase_ == 50) {
                admOneofCase_ = 0;
                admOneof_ = null;
                onChanged();
              }
            } else {
              if (admOneofCase_ == 50) {
                admOneofCase_ = 0;
                admOneof_ = null;
              }
              admNativeBuilder_.clear();
            }
            return this;
          }
          /**
           * <pre>
           * Native ad response.
           * For native ad bids, exactly one of {adm, adm_native} should be used;
           * this is the field used for Protobuf serialization.
           * </pre>
           *
           * <code>.com.iabtechlab.openrtb.v2.NativeResponse adm_native = 50;</code>
           */
          public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Builder getAdmNativeBuilder() {
            return getAdmNativeFieldBuilder().getBuilder();
          }
          /**
           * <pre>
           * Native ad response.
           * For native ad bids, exactly one of {adm, adm_native} should be used;
           * this is the field used for Protobuf serialization.
           * </pre>
           *
           * <code>.com.iabtechlab.openrtb.v2.NativeResponse adm_native = 50;</code>
           */
          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponseOrBuilder getAdmNativeOrBuilder() {
            if ((admOneofCase_ == 50) && (admNativeBuilder_ != null)) {
              return admNativeBuilder_.getMessageOrBuilder();
            } else {
              if (admOneofCase_ == 50) {
                return (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse) admOneof_;
              }
              return com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.getDefaultInstance();
            }
          }
          /**
           * <pre>
           * Native ad response.
           * For native ad bids, exactly one of {adm, adm_native} should be used;
           * this is the field used for Protobuf serialization.
           * </pre>
           *
           * <code>.com.iabtechlab.openrtb.v2.NativeResponse adm_native = 50;</code>
           */
          private com.google.protobuf.SingleFieldBuilderV3<
              com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Builder, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponseOrBuilder> 
              getAdmNativeFieldBuilder() {
            if (admNativeBuilder_ == null) {
              if (!(admOneofCase_ == 50)) {
                admOneof_ = com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.getDefaultInstance();
              }
              admNativeBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
                  com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Builder, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponseOrBuilder>(
                      (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse) admOneof_,
                      getParentForChildren(),
                      isClean());
              admOneof_ = null;
            }
            admOneofCase_ = 50;
            onChanged();;
            return admNativeBuilder_;
          }

          private com.google.protobuf.LazyStringList adomain_ = com.google.protobuf.LazyStringArrayList.EMPTY;
          private void ensureAdomainIsMutable() {
            if (!((bitField0_ & 0x00000080) != 0)) {
              adomain_ = new com.google.protobuf.LazyStringArrayList(adomain_);
              bitField0_ |= 0x00000080;
             }
          }
          /**
           * <pre>
           * Advertiser domain for block list checking (e.g., "ford.com"). This can
           * be an array of for the case of rotating creatives. Exchanges can
           * mandate that only one domain is allowed.
           * </pre>
           *
           * <code>repeated string adomain = 7;</code>
           * @return A list containing the adomain.
           */
          public com.google.protobuf.ProtocolStringList
              getAdomainList() {
            return adomain_.getUnmodifiableView();
          }
          /**
           * <pre>
           * Advertiser domain for block list checking (e.g., "ford.com"). This can
           * be an array of for the case of rotating creatives. Exchanges can
           * mandate that only one domain is allowed.
           * </pre>
           *
           * <code>repeated string adomain = 7;</code>
           * @return The count of adomain.
           */
          public int getAdomainCount() {
            return adomain_.size();
          }
          /**
           * <pre>
           * Advertiser domain for block list checking (e.g., "ford.com"). This can
           * be an array of for the case of rotating creatives. Exchanges can
           * mandate that only one domain is allowed.
           * </pre>
           *
           * <code>repeated string adomain = 7;</code>
           * @param index The index of the element to return.
           * @return The adomain at the given index.
           */
          public java.lang.String getAdomain(int index) {
            return adomain_.get(index);
          }
          /**
           * <pre>
           * Advertiser domain for block list checking (e.g., "ford.com"). This can
           * be an array of for the case of rotating creatives. Exchanges can
           * mandate that only one domain is allowed.
           * </pre>
           *
           * <code>repeated string adomain = 7;</code>
           * @param index The index of the value to return.
           * @return The bytes of the adomain at the given index.
           */
          public com.google.protobuf.ByteString
              getAdomainBytes(int index) {
            return adomain_.getByteString(index);
          }
          /**
           * <pre>
           * Advertiser domain for block list checking (e.g., "ford.com"). This can
           * be an array of for the case of rotating creatives. Exchanges can
           * mandate that only one domain is allowed.
           * </pre>
           *
           * <code>repeated string adomain = 7;</code>
           * @param index The index to set the value at.
           * @param value The adomain to set.
           * @return This builder for chaining.
           */
          public Builder setAdomain(
              int index, java.lang.String value) {
            if (value == null) {
    throw new NullPointerException();
  }
  ensureAdomainIsMutable();
            adomain_.set(index, value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Advertiser domain for block list checking (e.g., "ford.com"). This can
           * be an array of for the case of rotating creatives. Exchanges can
           * mandate that only one domain is allowed.
           * </pre>
           *
           * <code>repeated string adomain = 7;</code>
           * @param value The adomain to add.
           * @return This builder for chaining.
           */
          public Builder addAdomain(
              java.lang.String value) {
            if (value == null) {
    throw new NullPointerException();
  }
  ensureAdomainIsMutable();
            adomain_.add(value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Advertiser domain for block list checking (e.g., "ford.com"). This can
           * be an array of for the case of rotating creatives. Exchanges can
           * mandate that only one domain is allowed.
           * </pre>
           *
           * <code>repeated string adomain = 7;</code>
           * @param values The adomain to add.
           * @return This builder for chaining.
           */
          public Builder addAllAdomain(
              java.lang.Iterable<java.lang.String> values) {
            ensureAdomainIsMutable();
            com.google.protobuf.AbstractMessageLite.Builder.addAll(
                values, adomain_);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Advertiser domain for block list checking (e.g., "ford.com"). This can
           * be an array of for the case of rotating creatives. Exchanges can
           * mandate that only one domain is allowed.
           * </pre>
           *
           * <code>repeated string adomain = 7;</code>
           * @return This builder for chaining.
           */
          public Builder clearAdomain() {
            adomain_ = com.google.protobuf.LazyStringArrayList.EMPTY;
            bitField0_ = (bitField0_ & ~0x00000080);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Advertiser domain for block list checking (e.g., "ford.com"). This can
           * be an array of for the case of rotating creatives. Exchanges can
           * mandate that only one domain is allowed.
           * </pre>
           *
           * <code>repeated string adomain = 7;</code>
           * @param value The bytes of the adomain to add.
           * @return This builder for chaining.
           */
          public Builder addAdomainBytes(
              com.google.protobuf.ByteString value) {
            if (value == null) {
    throw new NullPointerException();
  }
  ensureAdomainIsMutable();
            adomain_.add(value);
            onChanged();
            return this;
          }

          private java.lang.Object bundle_ = "";
          /**
           * <pre>
           * A platform-specific application identifier intended to be
           * unique to the app and independent of the exchange. On Android,
           * this should be a bundle or package name (e.g., com.foo.mygame).
           * On iOS, it is a numeric ID.
           * </pre>
           *
           * <code>optional string bundle = 14;</code>
           * @return Whether the bundle field is set.
           */
          public boolean hasBundle() {
            return ((bitField0_ & 0x00000100) != 0);
          }
          /**
           * <pre>
           * A platform-specific application identifier intended to be
           * unique to the app and independent of the exchange. On Android,
           * this should be a bundle or package name (e.g., com.foo.mygame).
           * On iOS, it is a numeric ID.
           * </pre>
           *
           * <code>optional string bundle = 14;</code>
           * @return The bundle.
           */
          public java.lang.String getBundle() {
            java.lang.Object ref = bundle_;
            if (!(ref instanceof java.lang.String)) {
              com.google.protobuf.ByteString bs =
                  (com.google.protobuf.ByteString) ref;
              java.lang.String s = bs.toStringUtf8();
              if (bs.isValidUtf8()) {
                bundle_ = s;
              }
              return s;
            } else {
              return (java.lang.String) ref;
            }
          }
          /**
           * <pre>
           * A platform-specific application identifier intended to be
           * unique to the app and independent of the exchange. On Android,
           * this should be a bundle or package name (e.g., com.foo.mygame).
           * On iOS, it is a numeric ID.
           * </pre>
           *
           * <code>optional string bundle = 14;</code>
           * @return The bytes for bundle.
           */
          public com.google.protobuf.ByteString
              getBundleBytes() {
            java.lang.Object ref = bundle_;
            if (ref instanceof String) {
              com.google.protobuf.ByteString b = 
                  com.google.protobuf.ByteString.copyFromUtf8(
                      (java.lang.String) ref);
              bundle_ = b;
              return b;
            } else {
              return (com.google.protobuf.ByteString) ref;
            }
          }
          /**
           * <pre>
           * A platform-specific application identifier intended to be
           * unique to the app and independent of the exchange. On Android,
           * this should be a bundle or package name (e.g., com.foo.mygame).
           * On iOS, it is a numeric ID.
           * </pre>
           *
           * <code>optional string bundle = 14;</code>
           * @param value The bundle to set.
           * @return This builder for chaining.
           */
          public Builder setBundle(
              java.lang.String value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000100;
            bundle_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * A platform-specific application identifier intended to be
           * unique to the app and independent of the exchange. On Android,
           * this should be a bundle or package name (e.g., com.foo.mygame).
           * On iOS, it is a numeric ID.
           * </pre>
           *
           * <code>optional string bundle = 14;</code>
           * @return This builder for chaining.
           */
          public Builder clearBundle() {
            bitField0_ = (bitField0_ & ~0x00000100);
            bundle_ = getDefaultInstance().getBundle();
            onChanged();
            return this;
          }
          /**
           * <pre>
           * A platform-specific application identifier intended to be
           * unique to the app and independent of the exchange. On Android,
           * this should be a bundle or package name (e.g., com.foo.mygame).
           * On iOS, it is a numeric ID.
           * </pre>
           *
           * <code>optional string bundle = 14;</code>
           * @param value The bytes for bundle to set.
           * @return This builder for chaining.
           */
          public Builder setBundleBytes(
              com.google.protobuf.ByteString value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000100;
            bundle_ = value;
            onChanged();
            return this;
          }

          private java.lang.Object iurl_ = "";
          /**
           * <pre>
           * URL without cache-busting to an image that is representative of the
           * content of the campaign for ad quality/safety checking.
           * </pre>
           *
           * <code>optional string iurl = 8;</code>
           * @return Whether the iurl field is set.
           */
          public boolean hasIurl() {
            return ((bitField0_ & 0x00000200) != 0);
          }
          /**
           * <pre>
           * URL without cache-busting to an image that is representative of the
           * content of the campaign for ad quality/safety checking.
           * </pre>
           *
           * <code>optional string iurl = 8;</code>
           * @return The iurl.
           */
          public java.lang.String getIurl() {
            java.lang.Object ref = iurl_;
            if (!(ref instanceof java.lang.String)) {
              com.google.protobuf.ByteString bs =
                  (com.google.protobuf.ByteString) ref;
              java.lang.String s = bs.toStringUtf8();
              if (bs.isValidUtf8()) {
                iurl_ = s;
              }
              return s;
            } else {
              return (java.lang.String) ref;
            }
          }
          /**
           * <pre>
           * URL without cache-busting to an image that is representative of the
           * content of the campaign for ad quality/safety checking.
           * </pre>
           *
           * <code>optional string iurl = 8;</code>
           * @return The bytes for iurl.
           */
          public com.google.protobuf.ByteString
              getIurlBytes() {
            java.lang.Object ref = iurl_;
            if (ref instanceof String) {
              com.google.protobuf.ByteString b = 
                  com.google.protobuf.ByteString.copyFromUtf8(
                      (java.lang.String) ref);
              iurl_ = b;
              return b;
            } else {
              return (com.google.protobuf.ByteString) ref;
            }
          }
          /**
           * <pre>
           * URL without cache-busting to an image that is representative of the
           * content of the campaign for ad quality/safety checking.
           * </pre>
           *
           * <code>optional string iurl = 8;</code>
           * @param value The iurl to set.
           * @return This builder for chaining.
           */
          public Builder setIurl(
              java.lang.String value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000200;
            iurl_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * URL without cache-busting to an image that is representative of the
           * content of the campaign for ad quality/safety checking.
           * </pre>
           *
           * <code>optional string iurl = 8;</code>
           * @return This builder for chaining.
           */
          public Builder clearIurl() {
            bitField0_ = (bitField0_ & ~0x00000200);
            iurl_ = getDefaultInstance().getIurl();
            onChanged();
            return this;
          }
          /**
           * <pre>
           * URL without cache-busting to an image that is representative of the
           * content of the campaign for ad quality/safety checking.
           * </pre>
           *
           * <code>optional string iurl = 8;</code>
           * @param value The bytes for iurl to set.
           * @return This builder for chaining.
           */
          public Builder setIurlBytes(
              com.google.protobuf.ByteString value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000200;
            iurl_ = value;
            onChanged();
            return this;
          }

          private java.lang.Object cid_ = "";
          /**
           * <pre>
           * Campaign ID to assist with ad quality checking; the collection of
           * creatives for which iurl should be representative.
           * </pre>
           *
           * <code>optional string cid = 9;</code>
           * @return Whether the cid field is set.
           */
          public boolean hasCid() {
            return ((bitField0_ & 0x00000400) != 0);
          }
          /**
           * <pre>
           * Campaign ID to assist with ad quality checking; the collection of
           * creatives for which iurl should be representative.
           * </pre>
           *
           * <code>optional string cid = 9;</code>
           * @return The cid.
           */
          public java.lang.String getCid() {
            java.lang.Object ref = cid_;
            if (!(ref instanceof java.lang.String)) {
              com.google.protobuf.ByteString bs =
                  (com.google.protobuf.ByteString) ref;
              java.lang.String s = bs.toStringUtf8();
              if (bs.isValidUtf8()) {
                cid_ = s;
              }
              return s;
            } else {
              return (java.lang.String) ref;
            }
          }
          /**
           * <pre>
           * Campaign ID to assist with ad quality checking; the collection of
           * creatives for which iurl should be representative.
           * </pre>
           *
           * <code>optional string cid = 9;</code>
           * @return The bytes for cid.
           */
          public com.google.protobuf.ByteString
              getCidBytes() {
            java.lang.Object ref = cid_;
            if (ref instanceof String) {
              com.google.protobuf.ByteString b = 
                  com.google.protobuf.ByteString.copyFromUtf8(
                      (java.lang.String) ref);
              cid_ = b;
              return b;
            } else {
              return (com.google.protobuf.ByteString) ref;
            }
          }
          /**
           * <pre>
           * Campaign ID to assist with ad quality checking; the collection of
           * creatives for which iurl should be representative.
           * </pre>
           *
           * <code>optional string cid = 9;</code>
           * @param value The cid to set.
           * @return This builder for chaining.
           */
          public Builder setCid(
              java.lang.String value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000400;
            cid_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Campaign ID to assist with ad quality checking; the collection of
           * creatives for which iurl should be representative.
           * </pre>
           *
           * <code>optional string cid = 9;</code>
           * @return This builder for chaining.
           */
          public Builder clearCid() {
            bitField0_ = (bitField0_ & ~0x00000400);
            cid_ = getDefaultInstance().getCid();
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Campaign ID to assist with ad quality checking; the collection of
           * creatives for which iurl should be representative.
           * </pre>
           *
           * <code>optional string cid = 9;</code>
           * @param value The bytes for cid to set.
           * @return This builder for chaining.
           */
          public Builder setCidBytes(
              com.google.protobuf.ByteString value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000400;
            cid_ = value;
            onChanged();
            return this;
          }

          private java.lang.Object crid_ = "";
          /**
           * <pre>
           * Creative ID to assist with ad quality checking.
           * </pre>
           *
           * <code>optional string crid = 10;</code>
           * @return Whether the crid field is set.
           */
          public boolean hasCrid() {
            return ((bitField0_ & 0x00000800) != 0);
          }
          /**
           * <pre>
           * Creative ID to assist with ad quality checking.
           * </pre>
           *
           * <code>optional string crid = 10;</code>
           * @return The crid.
           */
          public java.lang.String getCrid() {
            java.lang.Object ref = crid_;
            if (!(ref instanceof java.lang.String)) {
              com.google.protobuf.ByteString bs =
                  (com.google.protobuf.ByteString) ref;
              java.lang.String s = bs.toStringUtf8();
              if (bs.isValidUtf8()) {
                crid_ = s;
              }
              return s;
            } else {
              return (java.lang.String) ref;
            }
          }
          /**
           * <pre>
           * Creative ID to assist with ad quality checking.
           * </pre>
           *
           * <code>optional string crid = 10;</code>
           * @return The bytes for crid.
           */
          public com.google.protobuf.ByteString
              getCridBytes() {
            java.lang.Object ref = crid_;
            if (ref instanceof String) {
              com.google.protobuf.ByteString b = 
                  com.google.protobuf.ByteString.copyFromUtf8(
                      (java.lang.String) ref);
              crid_ = b;
              return b;
            } else {
              return (com.google.protobuf.ByteString) ref;
            }
          }
          /**
           * <pre>
           * Creative ID to assist with ad quality checking.
           * </pre>
           *
           * <code>optional string crid = 10;</code>
           * @param value The crid to set.
           * @return This builder for chaining.
           */
          public Builder setCrid(
              java.lang.String value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000800;
            crid_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Creative ID to assist with ad quality checking.
           * </pre>
           *
           * <code>optional string crid = 10;</code>
           * @return This builder for chaining.
           */
          public Builder clearCrid() {
            bitField0_ = (bitField0_ & ~0x00000800);
            crid_ = getDefaultInstance().getCrid();
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Creative ID to assist with ad quality checking.
           * </pre>
           *
           * <code>optional string crid = 10;</code>
           * @param value The bytes for crid to set.
           * @return This builder for chaining.
           */
          public Builder setCridBytes(
              com.google.protobuf.ByteString value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000800;
            crid_ = value;
            onChanged();
            return this;
          }

          private int cattax_ = 1;
          /**
           * <pre>
           * The taxonomy in use.
           * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
           * </pre>
           *
           * <code>optional int32 cattax = 30 [default = 1];</code>
           * @return Whether the cattax field is set.
           */
          @java.lang.Override
          public boolean hasCattax() {
            return ((bitField0_ & 0x00001000) != 0);
          }
          /**
           * <pre>
           * The taxonomy in use.
           * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
           * </pre>
           *
           * <code>optional int32 cattax = 30 [default = 1];</code>
           * @return The cattax.
           */
          @java.lang.Override
          public int getCattax() {
            return cattax_;
          }
          /**
           * <pre>
           * The taxonomy in use.
           * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
           * </pre>
           *
           * <code>optional int32 cattax = 30 [default = 1];</code>
           * @param value The cattax to set.
           * @return This builder for chaining.
           */
          public Builder setCattax(int value) {
            bitField0_ |= 0x00001000;
            cattax_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * The taxonomy in use.
           * Refer to the enum com.iabtechlab.adcom.v1.enums.CategoryTaxonomy for values.
           * </pre>
           *
           * <code>optional int32 cattax = 30 [default = 1];</code>
           * @return This builder for chaining.
           */
          public Builder clearCattax() {
            bitField0_ = (bitField0_ & ~0x00001000);
            cattax_ = 1;
            onChanged();
            return this;
          }

          private com.google.protobuf.LazyStringList cat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
          private void ensureCatIsMutable() {
            if (!((bitField0_ & 0x00002000) != 0)) {
              cat_ = new com.google.protobuf.LazyStringArrayList(cat_);
              bitField0_ |= 0x00002000;
             }
          }
          /**
           * <pre>
           * IAB content categories of the creative.
           * </pre>
           *
           * <code>repeated string cat = 15;</code>
           * @return A list containing the cat.
           */
          public com.google.protobuf.ProtocolStringList
              getCatList() {
            return cat_.getUnmodifiableView();
          }
          /**
           * <pre>
           * IAB content categories of the creative.
           * </pre>
           *
           * <code>repeated string cat = 15;</code>
           * @return The count of cat.
           */
          public int getCatCount() {
            return cat_.size();
          }
          /**
           * <pre>
           * IAB content categories of the creative.
           * </pre>
           *
           * <code>repeated string cat = 15;</code>
           * @param index The index of the element to return.
           * @return The cat at the given index.
           */
          public java.lang.String getCat(int index) {
            return cat_.get(index);
          }
          /**
           * <pre>
           * IAB content categories of the creative.
           * </pre>
           *
           * <code>repeated string cat = 15;</code>
           * @param index The index of the value to return.
           * @return The bytes of the cat at the given index.
           */
          public com.google.protobuf.ByteString
              getCatBytes(int index) {
            return cat_.getByteString(index);
          }
          /**
           * <pre>
           * IAB content categories of the creative.
           * </pre>
           *
           * <code>repeated string cat = 15;</code>
           * @param index The index to set the value at.
           * @param value The cat to set.
           * @return This builder for chaining.
           */
          public Builder setCat(
              int index, java.lang.String value) {
            if (value == null) {
    throw new NullPointerException();
  }
  ensureCatIsMutable();
            cat_.set(index, value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * IAB content categories of the creative.
           * </pre>
           *
           * <code>repeated string cat = 15;</code>
           * @param value The cat to add.
           * @return This builder for chaining.
           */
          public Builder addCat(
              java.lang.String value) {
            if (value == null) {
    throw new NullPointerException();
  }
  ensureCatIsMutable();
            cat_.add(value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * IAB content categories of the creative.
           * </pre>
           *
           * <code>repeated string cat = 15;</code>
           * @param values The cat to add.
           * @return This builder for chaining.
           */
          public Builder addAllCat(
              java.lang.Iterable<java.lang.String> values) {
            ensureCatIsMutable();
            com.google.protobuf.AbstractMessageLite.Builder.addAll(
                values, cat_);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * IAB content categories of the creative.
           * </pre>
           *
           * <code>repeated string cat = 15;</code>
           * @return This builder for chaining.
           */
          public Builder clearCat() {
            cat_ = com.google.protobuf.LazyStringArrayList.EMPTY;
            bitField0_ = (bitField0_ & ~0x00002000);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * IAB content categories of the creative.
           * </pre>
           *
           * <code>repeated string cat = 15;</code>
           * @param value The bytes of the cat to add.
           * @return This builder for chaining.
           */
          public Builder addCatBytes(
              com.google.protobuf.ByteString value) {
            if (value == null) {
    throw new NullPointerException();
  }
  ensureCatIsMutable();
            cat_.add(value);
            onChanged();
            return this;
          }

          private com.google.protobuf.Internal.IntList attr_ = emptyIntList();
          private void ensureAttrIsMutable() {
            if (!((bitField0_ & 0x00004000) != 0)) {
              attr_ = mutableCopy(attr_);
              bitField0_ |= 0x00004000;
             }
          }
          /**
           * <pre>
           * Set of attributes describing the creative.
           * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
           * </pre>
           *
           * <code>repeated int32 attr = 11 [packed = true];</code>
           * @return A list containing the attr.
           */
          public java.util.List<java.lang.Integer>
              getAttrList() {
            return ((bitField0_ & 0x00004000) != 0) ?
                     java.util.Collections.unmodifiableList(attr_) : attr_;
          }
          /**
           * <pre>
           * Set of attributes describing the creative.
           * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
           * </pre>
           *
           * <code>repeated int32 attr = 11 [packed = true];</code>
           * @return The count of attr.
           */
          public int getAttrCount() {
            return attr_.size();
          }
          /**
           * <pre>
           * Set of attributes describing the creative.
           * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
           * </pre>
           *
           * <code>repeated int32 attr = 11 [packed = true];</code>
           * @param index The index of the element to return.
           * @return The attr at the given index.
           */
          public int getAttr(int index) {
            return attr_.getInt(index);
          }
          /**
           * <pre>
           * Set of attributes describing the creative.
           * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
           * </pre>
           *
           * <code>repeated int32 attr = 11 [packed = true];</code>
           * @param index The index to set the value at.
           * @param value The attr to set.
           * @return This builder for chaining.
           */
          public Builder setAttr(
              int index, int value) {
            ensureAttrIsMutable();
            attr_.setInt(index, value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Set of attributes describing the creative.
           * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
           * </pre>
           *
           * <code>repeated int32 attr = 11 [packed = true];</code>
           * @param value The attr to add.
           * @return This builder for chaining.
           */
          public Builder addAttr(int value) {
            ensureAttrIsMutable();
            attr_.addInt(value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Set of attributes describing the creative.
           * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
           * </pre>
           *
           * <code>repeated int32 attr = 11 [packed = true];</code>
           * @param values The attr to add.
           * @return This builder for chaining.
           */
          public Builder addAllAttr(
              java.lang.Iterable<? extends java.lang.Integer> values) {
            ensureAttrIsMutable();
            com.google.protobuf.AbstractMessageLite.Builder.addAll(
                values, attr_);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Set of attributes describing the creative.
           * Refer to enum com.iabtechlab.adcom.v1.enums.Creative.Attribute for generic values.
           * </pre>
           *
           * <code>repeated int32 attr = 11 [packed = true];</code>
           * @return This builder for chaining.
           */
          public Builder clearAttr() {
            attr_ = emptyIntList();
            bitField0_ = (bitField0_ & ~0x00004000);
            onChanged();
            return this;
          }

          private com.google.protobuf.Internal.IntList apis_ = emptyIntList();
          private void ensureApisIsMutable() {
            if (!((bitField0_ & 0x00008000) != 0)) {
              apis_ = mutableCopy(apis_);
              bitField0_ |= 0x00008000;
             }
          }
          /**
           * <pre>
           * List of supported APIs for the markup. If an API is not explicitly
           * listed, it is assumed to be unsupported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
           * </pre>
           *
           * <code>repeated int32 apis = 31 [packed = true];</code>
           * @return A list containing the apis.
           */
          public java.util.List<java.lang.Integer>
              getApisList() {
            return ((bitField0_ & 0x00008000) != 0) ?
                     java.util.Collections.unmodifiableList(apis_) : apis_;
          }
          /**
           * <pre>
           * List of supported APIs for the markup. If an API is not explicitly
           * listed, it is assumed to be unsupported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
           * </pre>
           *
           * <code>repeated int32 apis = 31 [packed = true];</code>
           * @return The count of apis.
           */
          public int getApisCount() {
            return apis_.size();
          }
          /**
           * <pre>
           * List of supported APIs for the markup. If an API is not explicitly
           * listed, it is assumed to be unsupported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
           * </pre>
           *
           * <code>repeated int32 apis = 31 [packed = true];</code>
           * @param index The index of the element to return.
           * @return The apis at the given index.
           */
          public int getApis(int index) {
            return apis_.getInt(index);
          }
          /**
           * <pre>
           * List of supported APIs for the markup. If an API is not explicitly
           * listed, it is assumed to be unsupported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
           * </pre>
           *
           * <code>repeated int32 apis = 31 [packed = true];</code>
           * @param index The index to set the value at.
           * @param value The apis to set.
           * @return This builder for chaining.
           */
          public Builder setApis(
              int index, int value) {
            ensureApisIsMutable();
            apis_.setInt(index, value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * List of supported APIs for the markup. If an API is not explicitly
           * listed, it is assumed to be unsupported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
           * </pre>
           *
           * <code>repeated int32 apis = 31 [packed = true];</code>
           * @param value The apis to add.
           * @return This builder for chaining.
           */
          public Builder addApis(int value) {
            ensureApisIsMutable();
            apis_.addInt(value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * List of supported APIs for the markup. If an API is not explicitly
           * listed, it is assumed to be unsupported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
           * </pre>
           *
           * <code>repeated int32 apis = 31 [packed = true];</code>
           * @param values The apis to add.
           * @return This builder for chaining.
           */
          public Builder addAllApis(
              java.lang.Iterable<? extends java.lang.Integer> values) {
            ensureApisIsMutable();
            com.google.protobuf.AbstractMessageLite.Builder.addAll(
                values, apis_);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * List of supported APIs for the markup. If an API is not explicitly
           * listed, it is assumed to be unsupported.
           * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
           * </pre>
           *
           * <code>repeated int32 apis = 31 [packed = true];</code>
           * @return This builder for chaining.
           */
          public Builder clearApis() {
            apis_ = emptyIntList();
            bitField0_ = (bitField0_ & ~0x00008000);
            onChanged();
            return this;
          }

          private int api_ ;
          /**
           * <pre>
           * API required by the markup if applicable.
           * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
           * </pre>
           *
           * <code>optional int32 api = 18 [deprecated = true];</code>
           * @return Whether the api field is set.
           */
          @java.lang.Override
          @java.lang.Deprecated public boolean hasApi() {
            return ((bitField0_ & 0x00010000) != 0);
          }
          /**
           * <pre>
           * API required by the markup if applicable.
           * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
           * </pre>
           *
           * <code>optional int32 api = 18 [deprecated = true];</code>
           * @return The api.
           */
          @java.lang.Override
          @java.lang.Deprecated public int getApi() {
            return api_;
          }
          /**
           * <pre>
           * API required by the markup if applicable.
           * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
           * </pre>
           *
           * <code>optional int32 api = 18 [deprecated = true];</code>
           * @param value The api to set.
           * @return This builder for chaining.
           */
          @java.lang.Deprecated public Builder setApi(int value) {
            bitField0_ |= 0x00010000;
            api_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * API required by the markup if applicable.
           * Refer to enum com.iabtechlab.adcom.v1.enums.APIFramework for generic values.
           * </pre>
           *
           * <code>optional int32 api = 18 [deprecated = true];</code>
           * @return This builder for chaining.
           */
          @java.lang.Deprecated public Builder clearApi() {
            bitField0_ = (bitField0_ & ~0x00010000);
            api_ = 0;
            onChanged();
            return this;
          }

          private int protocol_ ;
          /**
           * <pre>
           * Video response protocol of the markup if applicable.
           * Refer to enum com.iabtechlab.adcom.v1.Creative.AudioVideoType for generic values.
           * </pre>
           *
           * <code>optional int32 protocol = 19;</code>
           * @return Whether the protocol field is set.
           */
          @java.lang.Override
          public boolean hasProtocol() {
            return ((bitField0_ & 0x00020000) != 0);
          }
          /**
           * <pre>
           * Video response protocol of the markup if applicable.
           * Refer to enum com.iabtechlab.adcom.v1.Creative.AudioVideoType for generic values.
           * </pre>
           *
           * <code>optional int32 protocol = 19;</code>
           * @return The protocol.
           */
          @java.lang.Override
          public int getProtocol() {
            return protocol_;
          }
          /**
           * <pre>
           * Video response protocol of the markup if applicable.
           * Refer to enum com.iabtechlab.adcom.v1.Creative.AudioVideoType for generic values.
           * </pre>
           *
           * <code>optional int32 protocol = 19;</code>
           * @param value The protocol to set.
           * @return This builder for chaining.
           */
          public Builder setProtocol(int value) {
            bitField0_ |= 0x00020000;
            protocol_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Video response protocol of the markup if applicable.
           * Refer to enum com.iabtechlab.adcom.v1.Creative.AudioVideoType for generic values.
           * </pre>
           *
           * <code>optional int32 protocol = 19;</code>
           * @return This builder for chaining.
           */
          public Builder clearProtocol() {
            bitField0_ = (bitField0_ & ~0x00020000);
            protocol_ = 0;
            onChanged();
            return this;
          }

          private int qagmediarating_ ;
          /**
           * <pre>
           * Creative media rating per QAG guidelines.
           * Refer to enum com.iabtechlab.adcom.v1.MediaRating for generic values.
           * </pre>
           *
           * <code>optional int32 qagmediarating = 20;</code>
           * @return Whether the qagmediarating field is set.
           */
          @java.lang.Override
          public boolean hasQagmediarating() {
            return ((bitField0_ & 0x00040000) != 0);
          }
          /**
           * <pre>
           * Creative media rating per QAG guidelines.
           * Refer to enum com.iabtechlab.adcom.v1.MediaRating for generic values.
           * </pre>
           *
           * <code>optional int32 qagmediarating = 20;</code>
           * @return The qagmediarating.
           */
          @java.lang.Override
          public int getQagmediarating() {
            return qagmediarating_;
          }
          /**
           * <pre>
           * Creative media rating per QAG guidelines.
           * Refer to enum com.iabtechlab.adcom.v1.MediaRating for generic values.
           * </pre>
           *
           * <code>optional int32 qagmediarating = 20;</code>
           * @param value The qagmediarating to set.
           * @return This builder for chaining.
           */
          public Builder setQagmediarating(int value) {
            bitField0_ |= 0x00040000;
            qagmediarating_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Creative media rating per QAG guidelines.
           * Refer to enum com.iabtechlab.adcom.v1.MediaRating for generic values.
           * </pre>
           *
           * <code>optional int32 qagmediarating = 20;</code>
           * @return This builder for chaining.
           */
          public Builder clearQagmediarating() {
            bitField0_ = (bitField0_ & ~0x00040000);
            qagmediarating_ = 0;
            onChanged();
            return this;
          }

          private java.lang.Object dealid_ = "";
          /**
           * <pre>
           * Reference to the deal.id from the bid request if this bid pertains to a
           * private marketplace direct deal.
           * </pre>
           *
           * <code>optional string dealid = 13;</code>
           * @return Whether the dealid field is set.
           */
          public boolean hasDealid() {
            return ((bitField0_ & 0x00080000) != 0);
          }
          /**
           * <pre>
           * Reference to the deal.id from the bid request if this bid pertains to a
           * private marketplace direct deal.
           * </pre>
           *
           * <code>optional string dealid = 13;</code>
           * @return The dealid.
           */
          public java.lang.String getDealid() {
            java.lang.Object ref = dealid_;
            if (!(ref instanceof java.lang.String)) {
              com.google.protobuf.ByteString bs =
                  (com.google.protobuf.ByteString) ref;
              java.lang.String s = bs.toStringUtf8();
              if (bs.isValidUtf8()) {
                dealid_ = s;
              }
              return s;
            } else {
              return (java.lang.String) ref;
            }
          }
          /**
           * <pre>
           * Reference to the deal.id from the bid request if this bid pertains to a
           * private marketplace direct deal.
           * </pre>
           *
           * <code>optional string dealid = 13;</code>
           * @return The bytes for dealid.
           */
          public com.google.protobuf.ByteString
              getDealidBytes() {
            java.lang.Object ref = dealid_;
            if (ref instanceof String) {
              com.google.protobuf.ByteString b = 
                  com.google.protobuf.ByteString.copyFromUtf8(
                      (java.lang.String) ref);
              dealid_ = b;
              return b;
            } else {
              return (com.google.protobuf.ByteString) ref;
            }
          }
          /**
           * <pre>
           * Reference to the deal.id from the bid request if this bid pertains to a
           * private marketplace direct deal.
           * </pre>
           *
           * <code>optional string dealid = 13;</code>
           * @param value The dealid to set.
           * @return This builder for chaining.
           */
          public Builder setDealid(
              java.lang.String value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00080000;
            dealid_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Reference to the deal.id from the bid request if this bid pertains to a
           * private marketplace direct deal.
           * </pre>
           *
           * <code>optional string dealid = 13;</code>
           * @return This builder for chaining.
           */
          public Builder clearDealid() {
            bitField0_ = (bitField0_ & ~0x00080000);
            dealid_ = getDefaultInstance().getDealid();
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Reference to the deal.id from the bid request if this bid pertains to a
           * private marketplace direct deal.
           * </pre>
           *
           * <code>optional string dealid = 13;</code>
           * @param value The bytes for dealid to set.
           * @return This builder for chaining.
           */
          public Builder setDealidBytes(
              com.google.protobuf.ByteString value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00080000;
            dealid_ = value;
            onChanged();
            return this;
          }

          private int w_ ;
          /**
           * <pre>
           * Width of the creative in device independent pixels (DIPS).
           * </pre>
           *
           * <code>optional int32 w = 16;</code>
           * @return Whether the w field is set.
           */
          @java.lang.Override
          public boolean hasW() {
            return ((bitField0_ & 0x00100000) != 0);
          }
          /**
           * <pre>
           * Width of the creative in device independent pixels (DIPS).
           * </pre>
           *
           * <code>optional int32 w = 16;</code>
           * @return The w.
           */
          @java.lang.Override
          public int getW() {
            return w_;
          }
          /**
           * <pre>
           * Width of the creative in device independent pixels (DIPS).
           * </pre>
           *
           * <code>optional int32 w = 16;</code>
           * @param value The w to set.
           * @return This builder for chaining.
           */
          public Builder setW(int value) {
            bitField0_ |= 0x00100000;
            w_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Width of the creative in device independent pixels (DIPS).
           * </pre>
           *
           * <code>optional int32 w = 16;</code>
           * @return This builder for chaining.
           */
          public Builder clearW() {
            bitField0_ = (bitField0_ & ~0x00100000);
            w_ = 0;
            onChanged();
            return this;
          }

          private int h_ ;
          /**
           * <pre>
           * Height of the creative in device independent pixels (DIPS).
           * </pre>
           *
           * <code>optional int32 h = 17;</code>
           * @return Whether the h field is set.
           */
          @java.lang.Override
          public boolean hasH() {
            return ((bitField0_ & 0x00200000) != 0);
          }
          /**
           * <pre>
           * Height of the creative in device independent pixels (DIPS).
           * </pre>
           *
           * <code>optional int32 h = 17;</code>
           * @return The h.
           */
          @java.lang.Override
          public int getH() {
            return h_;
          }
          /**
           * <pre>
           * Height of the creative in device independent pixels (DIPS).
           * </pre>
           *
           * <code>optional int32 h = 17;</code>
           * @param value The h to set.
           * @return This builder for chaining.
           */
          public Builder setH(int value) {
            bitField0_ |= 0x00200000;
            h_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Height of the creative in device independent pixels (DIPS).
           * </pre>
           *
           * <code>optional int32 h = 17;</code>
           * @return This builder for chaining.
           */
          public Builder clearH() {
            bitField0_ = (bitField0_ & ~0x00200000);
            h_ = 0;
            onChanged();
            return this;
          }

          private int exp_ ;
          /**
           * <pre>
           * Advisory as to the number of seconds the bidder is willing to
           * wait between the auction and the actual impression.
           * </pre>
           *
           * <code>optional int32 exp = 21;</code>
           * @return Whether the exp field is set.
           */
          @java.lang.Override
          public boolean hasExp() {
            return ((bitField0_ & 0x00400000) != 0);
          }
          /**
           * <pre>
           * Advisory as to the number of seconds the bidder is willing to
           * wait between the auction and the actual impression.
           * </pre>
           *
           * <code>optional int32 exp = 21;</code>
           * @return The exp.
           */
          @java.lang.Override
          public int getExp() {
            return exp_;
          }
          /**
           * <pre>
           * Advisory as to the number of seconds the bidder is willing to
           * wait between the auction and the actual impression.
           * </pre>
           *
           * <code>optional int32 exp = 21;</code>
           * @param value The exp to set.
           * @return This builder for chaining.
           */
          public Builder setExp(int value) {
            bitField0_ |= 0x00400000;
            exp_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Advisory as to the number of seconds the bidder is willing to
           * wait between the auction and the actual impression.
           * </pre>
           *
           * <code>optional int32 exp = 21;</code>
           * @return This builder for chaining.
           */
          public Builder clearExp() {
            bitField0_ = (bitField0_ & ~0x00400000);
            exp_ = 0;
            onChanged();
            return this;
          }

          private java.lang.Object burl_ = "";
          /**
           * <pre>
           * Billing notice URL called by the exchange when a winning bid
           * becomes billable based on exchange-specific business policy
           * (e.g., typically delivered, viewed, etc.). Substitution macros
           * (Section 4.4) may be included.
           * </pre>
           *
           * <code>optional string burl = 22;</code>
           * @return Whether the burl field is set.
           */
          public boolean hasBurl() {
            return ((bitField0_ & 0x00800000) != 0);
          }
          /**
           * <pre>
           * Billing notice URL called by the exchange when a winning bid
           * becomes billable based on exchange-specific business policy
           * (e.g., typically delivered, viewed, etc.). Substitution macros
           * (Section 4.4) may be included.
           * </pre>
           *
           * <code>optional string burl = 22;</code>
           * @return The burl.
           */
          public java.lang.String getBurl() {
            java.lang.Object ref = burl_;
            if (!(ref instanceof java.lang.String)) {
              com.google.protobuf.ByteString bs =
                  (com.google.protobuf.ByteString) ref;
              java.lang.String s = bs.toStringUtf8();
              if (bs.isValidUtf8()) {
                burl_ = s;
              }
              return s;
            } else {
              return (java.lang.String) ref;
            }
          }
          /**
           * <pre>
           * Billing notice URL called by the exchange when a winning bid
           * becomes billable based on exchange-specific business policy
           * (e.g., typically delivered, viewed, etc.). Substitution macros
           * (Section 4.4) may be included.
           * </pre>
           *
           * <code>optional string burl = 22;</code>
           * @return The bytes for burl.
           */
          public com.google.protobuf.ByteString
              getBurlBytes() {
            java.lang.Object ref = burl_;
            if (ref instanceof String) {
              com.google.protobuf.ByteString b = 
                  com.google.protobuf.ByteString.copyFromUtf8(
                      (java.lang.String) ref);
              burl_ = b;
              return b;
            } else {
              return (com.google.protobuf.ByteString) ref;
            }
          }
          /**
           * <pre>
           * Billing notice URL called by the exchange when a winning bid
           * becomes billable based on exchange-specific business policy
           * (e.g., typically delivered, viewed, etc.). Substitution macros
           * (Section 4.4) may be included.
           * </pre>
           *
           * <code>optional string burl = 22;</code>
           * @param value The burl to set.
           * @return This builder for chaining.
           */
          public Builder setBurl(
              java.lang.String value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00800000;
            burl_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Billing notice URL called by the exchange when a winning bid
           * becomes billable based on exchange-specific business policy
           * (e.g., typically delivered, viewed, etc.). Substitution macros
           * (Section 4.4) may be included.
           * </pre>
           *
           * <code>optional string burl = 22;</code>
           * @return This builder for chaining.
           */
          public Builder clearBurl() {
            bitField0_ = (bitField0_ & ~0x00800000);
            burl_ = getDefaultInstance().getBurl();
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Billing notice URL called by the exchange when a winning bid
           * becomes billable based on exchange-specific business policy
           * (e.g., typically delivered, viewed, etc.). Substitution macros
           * (Section 4.4) may be included.
           * </pre>
           *
           * <code>optional string burl = 22;</code>
           * @param value The bytes for burl to set.
           * @return This builder for chaining.
           */
          public Builder setBurlBytes(
              com.google.protobuf.ByteString value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00800000;
            burl_ = value;
            onChanged();
            return this;
          }

          private java.lang.Object lurl_ = "";
          /**
           * <pre>
           * Loss notice URL called by the exchange when a bid is known to
           * have been lost. Substitution macros (Section 4.4) may be
           * included. Exchange-specific policy may preclude support for
           * loss notices or the disclosure of winning clearing prices
           * resulting in ${AUCTION_PRICE} macros being removed (i.e.,
           * replaced with a zero-length string).
           * </pre>
           *
           * <code>optional string lurl = 23;</code>
           * @return Whether the lurl field is set.
           */
          public boolean hasLurl() {
            return ((bitField0_ & 0x01000000) != 0);
          }
          /**
           * <pre>
           * Loss notice URL called by the exchange when a bid is known to
           * have been lost. Substitution macros (Section 4.4) may be
           * included. Exchange-specific policy may preclude support for
           * loss notices or the disclosure of winning clearing prices
           * resulting in ${AUCTION_PRICE} macros being removed (i.e.,
           * replaced with a zero-length string).
           * </pre>
           *
           * <code>optional string lurl = 23;</code>
           * @return The lurl.
           */
          public java.lang.String getLurl() {
            java.lang.Object ref = lurl_;
            if (!(ref instanceof java.lang.String)) {
              com.google.protobuf.ByteString bs =
                  (com.google.protobuf.ByteString) ref;
              java.lang.String s = bs.toStringUtf8();
              if (bs.isValidUtf8()) {
                lurl_ = s;
              }
              return s;
            } else {
              return (java.lang.String) ref;
            }
          }
          /**
           * <pre>
           * Loss notice URL called by the exchange when a bid is known to
           * have been lost. Substitution macros (Section 4.4) may be
           * included. Exchange-specific policy may preclude support for
           * loss notices or the disclosure of winning clearing prices
           * resulting in ${AUCTION_PRICE} macros being removed (i.e.,
           * replaced with a zero-length string).
           * </pre>
           *
           * <code>optional string lurl = 23;</code>
           * @return The bytes for lurl.
           */
          public com.google.protobuf.ByteString
              getLurlBytes() {
            java.lang.Object ref = lurl_;
            if (ref instanceof String) {
              com.google.protobuf.ByteString b = 
                  com.google.protobuf.ByteString.copyFromUtf8(
                      (java.lang.String) ref);
              lurl_ = b;
              return b;
            } else {
              return (com.google.protobuf.ByteString) ref;
            }
          }
          /**
           * <pre>
           * Loss notice URL called by the exchange when a bid is known to
           * have been lost. Substitution macros (Section 4.4) may be
           * included. Exchange-specific policy may preclude support for
           * loss notices or the disclosure of winning clearing prices
           * resulting in ${AUCTION_PRICE} macros being removed (i.e.,
           * replaced with a zero-length string).
           * </pre>
           *
           * <code>optional string lurl = 23;</code>
           * @param value The lurl to set.
           * @return This builder for chaining.
           */
          public Builder setLurl(
              java.lang.String value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x01000000;
            lurl_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Loss notice URL called by the exchange when a bid is known to
           * have been lost. Substitution macros (Section 4.4) may be
           * included. Exchange-specific policy may preclude support for
           * loss notices or the disclosure of winning clearing prices
           * resulting in ${AUCTION_PRICE} macros being removed (i.e.,
           * replaced with a zero-length string).
           * </pre>
           *
           * <code>optional string lurl = 23;</code>
           * @return This builder for chaining.
           */
          public Builder clearLurl() {
            bitField0_ = (bitField0_ & ~0x01000000);
            lurl_ = getDefaultInstance().getLurl();
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Loss notice URL called by the exchange when a bid is known to
           * have been lost. Substitution macros (Section 4.4) may be
           * included. Exchange-specific policy may preclude support for
           * loss notices or the disclosure of winning clearing prices
           * resulting in ${AUCTION_PRICE} macros being removed (i.e.,
           * replaced with a zero-length string).
           * </pre>
           *
           * <code>optional string lurl = 23;</code>
           * @param value The bytes for lurl to set.
           * @return This builder for chaining.
           */
          public Builder setLurlBytes(
              com.google.protobuf.ByteString value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x01000000;
            lurl_ = value;
            onChanged();
            return this;
          }

          private java.lang.Object tactic_ = "";
          /**
           * <pre>
           * Tactic ID to enable buyers to label bids for reporting to the
           * exchange the tactic through which their bid was submitted.
           * The specific usage and meaning of the tactic ID should be
           * communicated between buyer and exchanges a priori.
           * </pre>
           *
           * <code>optional string tactic = 24;</code>
           * @return Whether the tactic field is set.
           */
          public boolean hasTactic() {
            return ((bitField0_ & 0x02000000) != 0);
          }
          /**
           * <pre>
           * Tactic ID to enable buyers to label bids for reporting to the
           * exchange the tactic through which their bid was submitted.
           * The specific usage and meaning of the tactic ID should be
           * communicated between buyer and exchanges a priori.
           * </pre>
           *
           * <code>optional string tactic = 24;</code>
           * @return The tactic.
           */
          public java.lang.String getTactic() {
            java.lang.Object ref = tactic_;
            if (!(ref instanceof java.lang.String)) {
              com.google.protobuf.ByteString bs =
                  (com.google.protobuf.ByteString) ref;
              java.lang.String s = bs.toStringUtf8();
              if (bs.isValidUtf8()) {
                tactic_ = s;
              }
              return s;
            } else {
              return (java.lang.String) ref;
            }
          }
          /**
           * <pre>
           * Tactic ID to enable buyers to label bids for reporting to the
           * exchange the tactic through which their bid was submitted.
           * The specific usage and meaning of the tactic ID should be
           * communicated between buyer and exchanges a priori.
           * </pre>
           *
           * <code>optional string tactic = 24;</code>
           * @return The bytes for tactic.
           */
          public com.google.protobuf.ByteString
              getTacticBytes() {
            java.lang.Object ref = tactic_;
            if (ref instanceof String) {
              com.google.protobuf.ByteString b = 
                  com.google.protobuf.ByteString.copyFromUtf8(
                      (java.lang.String) ref);
              tactic_ = b;
              return b;
            } else {
              return (com.google.protobuf.ByteString) ref;
            }
          }
          /**
           * <pre>
           * Tactic ID to enable buyers to label bids for reporting to the
           * exchange the tactic through which their bid was submitted.
           * The specific usage and meaning of the tactic ID should be
           * communicated between buyer and exchanges a priori.
           * </pre>
           *
           * <code>optional string tactic = 24;</code>
           * @param value The tactic to set.
           * @return This builder for chaining.
           */
          public Builder setTactic(
              java.lang.String value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x02000000;
            tactic_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Tactic ID to enable buyers to label bids for reporting to the
           * exchange the tactic through which their bid was submitted.
           * The specific usage and meaning of the tactic ID should be
           * communicated between buyer and exchanges a priori.
           * </pre>
           *
           * <code>optional string tactic = 24;</code>
           * @return This builder for chaining.
           */
          public Builder clearTactic() {
            bitField0_ = (bitField0_ & ~0x02000000);
            tactic_ = getDefaultInstance().getTactic();
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Tactic ID to enable buyers to label bids for reporting to the
           * exchange the tactic through which their bid was submitted.
           * The specific usage and meaning of the tactic ID should be
           * communicated between buyer and exchanges a priori.
           * </pre>
           *
           * <code>optional string tactic = 24;</code>
           * @param value The bytes for tactic to set.
           * @return This builder for chaining.
           */
          public Builder setTacticBytes(
              com.google.protobuf.ByteString value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x02000000;
            tactic_ = value;
            onChanged();
            return this;
          }

          private java.lang.Object language_ = "";
          /**
           * <pre>
           * Language of the creative using ISO-639-1-alpha-2. The nonstandard
           * code "xx" may also be used if the creative has no
           * linguistic content (e.g., a banner with just a company logo).
           * </pre>
           *
           * <code>optional string language = 25;</code>
           * @return Whether the language field is set.
           */
          public boolean hasLanguage() {
            return ((bitField0_ & 0x04000000) != 0);
          }
          /**
           * <pre>
           * Language of the creative using ISO-639-1-alpha-2. The nonstandard
           * code "xx" may also be used if the creative has no
           * linguistic content (e.g., a banner with just a company logo).
           * </pre>
           *
           * <code>optional string language = 25;</code>
           * @return The language.
           */
          public java.lang.String getLanguage() {
            java.lang.Object ref = language_;
            if (!(ref instanceof java.lang.String)) {
              com.google.protobuf.ByteString bs =
                  (com.google.protobuf.ByteString) ref;
              java.lang.String s = bs.toStringUtf8();
              if (bs.isValidUtf8()) {
                language_ = s;
              }
              return s;
            } else {
              return (java.lang.String) ref;
            }
          }
          /**
           * <pre>
           * Language of the creative using ISO-639-1-alpha-2. The nonstandard
           * code "xx" may also be used if the creative has no
           * linguistic content (e.g., a banner with just a company logo).
           * </pre>
           *
           * <code>optional string language = 25;</code>
           * @return The bytes for language.
           */
          public com.google.protobuf.ByteString
              getLanguageBytes() {
            java.lang.Object ref = language_;
            if (ref instanceof String) {
              com.google.protobuf.ByteString b = 
                  com.google.protobuf.ByteString.copyFromUtf8(
                      (java.lang.String) ref);
              language_ = b;
              return b;
            } else {
              return (com.google.protobuf.ByteString) ref;
            }
          }
          /**
           * <pre>
           * Language of the creative using ISO-639-1-alpha-2. The nonstandard
           * code "xx" may also be used if the creative has no
           * linguistic content (e.g., a banner with just a company logo).
           * </pre>
           *
           * <code>optional string language = 25;</code>
           * @param value The language to set.
           * @return This builder for chaining.
           */
          public Builder setLanguage(
              java.lang.String value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x04000000;
            language_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Language of the creative using ISO-639-1-alpha-2. The nonstandard
           * code "xx" may also be used if the creative has no
           * linguistic content (e.g., a banner with just a company logo).
           * </pre>
           *
           * <code>optional string language = 25;</code>
           * @return This builder for chaining.
           */
          public Builder clearLanguage() {
            bitField0_ = (bitField0_ & ~0x04000000);
            language_ = getDefaultInstance().getLanguage();
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Language of the creative using ISO-639-1-alpha-2. The nonstandard
           * code "xx" may also be used if the creative has no
           * linguistic content (e.g., a banner with just a company logo).
           * </pre>
           *
           * <code>optional string language = 25;</code>
           * @param value The bytes for language to set.
           * @return This builder for chaining.
           */
          public Builder setLanguageBytes(
              com.google.protobuf.ByteString value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x04000000;
            language_ = value;
            onChanged();
            return this;
          }

          private java.lang.Object langb_ = "";
          /**
           * <pre>
           * Language of the creative using IETF BCP 47. Only one of language or
           * langb should be present.
           * </pre>
           *
           * <code>optional string langb = 29;</code>
           * @return Whether the langb field is set.
           */
          public boolean hasLangb() {
            return ((bitField0_ & 0x08000000) != 0);
          }
          /**
           * <pre>
           * Language of the creative using IETF BCP 47. Only one of language or
           * langb should be present.
           * </pre>
           *
           * <code>optional string langb = 29;</code>
           * @return The langb.
           */
          public java.lang.String getLangb() {
            java.lang.Object ref = langb_;
            if (!(ref instanceof java.lang.String)) {
              com.google.protobuf.ByteString bs =
                  (com.google.protobuf.ByteString) ref;
              java.lang.String s = bs.toStringUtf8();
              if (bs.isValidUtf8()) {
                langb_ = s;
              }
              return s;
            } else {
              return (java.lang.String) ref;
            }
          }
          /**
           * <pre>
           * Language of the creative using IETF BCP 47. Only one of language or
           * langb should be present.
           * </pre>
           *
           * <code>optional string langb = 29;</code>
           * @return The bytes for langb.
           */
          public com.google.protobuf.ByteString
              getLangbBytes() {
            java.lang.Object ref = langb_;
            if (ref instanceof String) {
              com.google.protobuf.ByteString b = 
                  com.google.protobuf.ByteString.copyFromUtf8(
                      (java.lang.String) ref);
              langb_ = b;
              return b;
            } else {
              return (com.google.protobuf.ByteString) ref;
            }
          }
          /**
           * <pre>
           * Language of the creative using IETF BCP 47. Only one of language or
           * langb should be present.
           * </pre>
           *
           * <code>optional string langb = 29;</code>
           * @param value The langb to set.
           * @return This builder for chaining.
           */
          public Builder setLangb(
              java.lang.String value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x08000000;
            langb_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Language of the creative using IETF BCP 47. Only one of language or
           * langb should be present.
           * </pre>
           *
           * <code>optional string langb = 29;</code>
           * @return This builder for chaining.
           */
          public Builder clearLangb() {
            bitField0_ = (bitField0_ & ~0x08000000);
            langb_ = getDefaultInstance().getLangb();
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Language of the creative using IETF BCP 47. Only one of language or
           * langb should be present.
           * </pre>
           *
           * <code>optional string langb = 29;</code>
           * @param value The bytes for langb to set.
           * @return This builder for chaining.
           */
          public Builder setLangbBytes(
              com.google.protobuf.ByteString value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x08000000;
            langb_ = value;
            onChanged();
            return this;
          }

          private int wratio_ ;
          /**
           * <pre>
           * Relative width of the creative when expressing size as a ratio.
           * Required for Flex Ads.
           * </pre>
           *
           * <code>optional int32 wratio = 26;</code>
           * @return Whether the wratio field is set.
           */
          @java.lang.Override
          public boolean hasWratio() {
            return ((bitField0_ & 0x10000000) != 0);
          }
          /**
           * <pre>
           * Relative width of the creative when expressing size as a ratio.
           * Required for Flex Ads.
           * </pre>
           *
           * <code>optional int32 wratio = 26;</code>
           * @return The wratio.
           */
          @java.lang.Override
          public int getWratio() {
            return wratio_;
          }
          /**
           * <pre>
           * Relative width of the creative when expressing size as a ratio.
           * Required for Flex Ads.
           * </pre>
           *
           * <code>optional int32 wratio = 26;</code>
           * @param value The wratio to set.
           * @return This builder for chaining.
           */
          public Builder setWratio(int value) {
            bitField0_ |= 0x10000000;
            wratio_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Relative width of the creative when expressing size as a ratio.
           * Required for Flex Ads.
           * </pre>
           *
           * <code>optional int32 wratio = 26;</code>
           * @return This builder for chaining.
           */
          public Builder clearWratio() {
            bitField0_ = (bitField0_ & ~0x10000000);
            wratio_ = 0;
            onChanged();
            return this;
          }

          private int hratio_ ;
          /**
           * <pre>
           * Relative height of the creative when expressing size as a ratio.
           * Required for Flex Ads.
           * </pre>
           *
           * <code>optional int32 hratio = 27;</code>
           * @return Whether the hratio field is set.
           */
          @java.lang.Override
          public boolean hasHratio() {
            return ((bitField0_ & 0x20000000) != 0);
          }
          /**
           * <pre>
           * Relative height of the creative when expressing size as a ratio.
           * Required for Flex Ads.
           * </pre>
           *
           * <code>optional int32 hratio = 27;</code>
           * @return The hratio.
           */
          @java.lang.Override
          public int getHratio() {
            return hratio_;
          }
          /**
           * <pre>
           * Relative height of the creative when expressing size as a ratio.
           * Required for Flex Ads.
           * </pre>
           *
           * <code>optional int32 hratio = 27;</code>
           * @param value The hratio to set.
           * @return This builder for chaining.
           */
          public Builder setHratio(int value) {
            bitField0_ |= 0x20000000;
            hratio_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Relative height of the creative when expressing size as a ratio.
           * Required for Flex Ads.
           * </pre>
           *
           * <code>optional int32 hratio = 27;</code>
           * @return This builder for chaining.
           */
          public Builder clearHratio() {
            bitField0_ = (bitField0_ & ~0x20000000);
            hratio_ = 0;
            onChanged();
            return this;
          }

          private int dur_ ;
          /**
           * <pre>
           * Duration of the video or audio creative in seconds.
           * </pre>
           *
           * <code>optional int32 dur = 32;</code>
           * @return Whether the dur field is set.
           */
          @java.lang.Override
          public boolean hasDur() {
            return ((bitField0_ & 0x40000000) != 0);
          }
          /**
           * <pre>
           * Duration of the video or audio creative in seconds.
           * </pre>
           *
           * <code>optional int32 dur = 32;</code>
           * @return The dur.
           */
          @java.lang.Override
          public int getDur() {
            return dur_;
          }
          /**
           * <pre>
           * Duration of the video or audio creative in seconds.
           * </pre>
           *
           * <code>optional int32 dur = 32;</code>
           * @param value The dur to set.
           * @return This builder for chaining.
           */
          public Builder setDur(int value) {
            bitField0_ |= 0x40000000;
            dur_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Duration of the video or audio creative in seconds.
           * </pre>
           *
           * <code>optional int32 dur = 32;</code>
           * @return This builder for chaining.
           */
          public Builder clearDur() {
            bitField0_ = (bitField0_ & ~0x40000000);
            dur_ = 0;
            onChanged();
            return this;
          }

          private int mtype_ ;
          /**
           * <pre>
           * Type of the creative markup so that it can properly be associated with
           * the right sub-object of the BidRequest.Imp.
           * </pre>
           *
           * <code>optional int32 mtype = 33;</code>
           * @return Whether the mtype field is set.
           */
          @java.lang.Override
          public boolean hasMtype() {
            return ((bitField0_ & 0x80000000) != 0);
          }
          /**
           * <pre>
           * Type of the creative markup so that it can properly be associated with
           * the right sub-object of the BidRequest.Imp.
           * </pre>
           *
           * <code>optional int32 mtype = 33;</code>
           * @return The mtype.
           */
          @java.lang.Override
          public int getMtype() {
            return mtype_;
          }
          /**
           * <pre>
           * Type of the creative markup so that it can properly be associated with
           * the right sub-object of the BidRequest.Imp.
           * </pre>
           *
           * <code>optional int32 mtype = 33;</code>
           * @param value The mtype to set.
           * @return This builder for chaining.
           */
          public Builder setMtype(int value) {
            bitField0_ |= 0x80000000;
            mtype_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Type of the creative markup so that it can properly be associated with
           * the right sub-object of the BidRequest.Imp.
           * </pre>
           *
           * <code>optional int32 mtype = 33;</code>
           * @return This builder for chaining.
           */
          public Builder clearMtype() {
            bitField0_ = (bitField0_ & ~0x80000000);
            mtype_ = 0;
            onChanged();
            return this;
          }

          private int slotinpod_ ;
          /**
           * <pre>
           * Indicates that the bid response is only eligible for a specific
           * position within a video or audio ad pod (e.g. first position, last
           * position, or any).
           * </pre>
           *
           * <code>optional int32 slotinpod = 28 [default = 0];</code>
           * @return Whether the slotinpod field is set.
           */
          @java.lang.Override
          public boolean hasSlotinpod() {
            return ((bitField1_ & 0x00000001) != 0);
          }
          /**
           * <pre>
           * Indicates that the bid response is only eligible for a specific
           * position within a video or audio ad pod (e.g. first position, last
           * position, or any).
           * </pre>
           *
           * <code>optional int32 slotinpod = 28 [default = 0];</code>
           * @return The slotinpod.
           */
          @java.lang.Override
          public int getSlotinpod() {
            return slotinpod_;
          }
          /**
           * <pre>
           * Indicates that the bid response is only eligible for a specific
           * position within a video or audio ad pod (e.g. first position, last
           * position, or any).
           * </pre>
           *
           * <code>optional int32 slotinpod = 28 [default = 0];</code>
           * @param value The slotinpod to set.
           * @return This builder for chaining.
           */
          public Builder setSlotinpod(int value) {
            bitField1_ |= 0x00000001;
            slotinpod_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Indicates that the bid response is only eligible for a specific
           * position within a video or audio ad pod (e.g. first position, last
           * position, or any).
           * </pre>
           *
           * <code>optional int32 slotinpod = 28 [default = 0];</code>
           * @return This builder for chaining.
           */
          public Builder clearSlotinpod() {
            bitField1_ = (bitField1_ & ~0x00000001);
            slotinpod_ = 0;
            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:com.iabtechlab.openrtb.v2.BidResponse.SeatBid.Bid)
        }

        // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.BidResponse.SeatBid.Bid)
        private static final com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid DEFAULT_INSTANCE;
        static {
          DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid();
        }

        public static com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid getDefaultInstance() {
          return DEFAULT_INSTANCE;
        }

        @java.lang.Deprecated public static final com.google.protobuf.Parser<Bid>
            PARSER = new com.google.protobuf.AbstractParser<Bid>() {
          @java.lang.Override
          public Bid parsePartialFrom(
              com.google.protobuf.CodedInputStream input,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.protobuf.InvalidProtocolBufferException {
            return new Bid(input, extensionRegistry);
          }
        };

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

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

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid getDefaultInstanceForType() {
          return DEFAULT_INSTANCE;
        }

      }

      private int bitField0_;
      public static final int BID_FIELD_NUMBER = 1;
      private java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid> bid_;
      /**
       * <pre>
       * Array of 1+ Bid objects (Section 4.2.3) each related to an impression.
       * Multiple bids can relate to the same impression.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid.Bid bid = 1;</code>
       */
      @java.lang.Override
      public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid> getBidList() {
        return bid_;
      }
      /**
       * <pre>
       * Array of 1+ Bid objects (Section 4.2.3) each related to an impression.
       * Multiple bids can relate to the same impression.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid.Bid bid = 1;</code>
       */
      @java.lang.Override
      public java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.BidOrBuilder> 
          getBidOrBuilderList() {
        return bid_;
      }
      /**
       * <pre>
       * Array of 1+ Bid objects (Section 4.2.3) each related to an impression.
       * Multiple bids can relate to the same impression.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid.Bid bid = 1;</code>
       */
      @java.lang.Override
      public int getBidCount() {
        return bid_.size();
      }
      /**
       * <pre>
       * Array of 1+ Bid objects (Section 4.2.3) each related to an impression.
       * Multiple bids can relate to the same impression.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid.Bid bid = 1;</code>
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid getBid(int index) {
        return bid_.get(index);
      }
      /**
       * <pre>
       * Array of 1+ Bid objects (Section 4.2.3) each related to an impression.
       * Multiple bids can relate to the same impression.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid.Bid bid = 1;</code>
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.BidOrBuilder getBidOrBuilder(
          int index) {
        return bid_.get(index);
      }

      public static final int SEAT_FIELD_NUMBER = 2;
      private volatile java.lang.Object seat_;
      /**
       * <pre>
       * ID of the buyer seat (e.g., advertiser, agency) on whose behalf
       * this bid is made.
       * This ID will be used to breakdown spend and invalid traffic metrics in
       * IVT transparency reporting, given that it is no longer than 64 bytes.
       * </pre>
       *
       * <code>optional string seat = 2;</code>
       * @return Whether the seat field is set.
       */
      @java.lang.Override
      public boolean hasSeat() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <pre>
       * ID of the buyer seat (e.g., advertiser, agency) on whose behalf
       * this bid is made.
       * This ID will be used to breakdown spend and invalid traffic metrics in
       * IVT transparency reporting, given that it is no longer than 64 bytes.
       * </pre>
       *
       * <code>optional string seat = 2;</code>
       * @return The seat.
       */
      @java.lang.Override
      public java.lang.String getSeat() {
        java.lang.Object ref = seat_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            seat_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * ID of the buyer seat (e.g., advertiser, agency) on whose behalf
       * this bid is made.
       * This ID will be used to breakdown spend and invalid traffic metrics in
       * IVT transparency reporting, given that it is no longer than 64 bytes.
       * </pre>
       *
       * <code>optional string seat = 2;</code>
       * @return The bytes for seat.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getSeatBytes() {
        java.lang.Object ref = seat_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          seat_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int GROUP_FIELD_NUMBER = 3;
      private boolean group_;
      /**
       * <pre>
       * 0 = impressions can be won individually; 1 = impressions must be won or
       * lost as a group.
       * </pre>
       *
       * <code>optional bool group = 3 [default = false];</code>
       * @return Whether the group field is set.
       */
      @java.lang.Override
      public boolean hasGroup() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <pre>
       * 0 = impressions can be won individually; 1 = impressions must be won or
       * lost as a group.
       * </pre>
       *
       * <code>optional bool group = 3 [default = false];</code>
       * @return The group.
       */
      @java.lang.Override
      public boolean getGroup() {
        return group_;
      }

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

        for (int i = 0; i < getBidCount(); i++) {
          if (!getBid(i).isInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
        }
        if (!extensionsAreInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
        memoizedIsInitialized = 1;
        return true;
      }

      @java.lang.Override
      public void writeTo(com.google.protobuf.CodedOutputStream output)
                          throws java.io.IOException {
        com.google.protobuf.GeneratedMessageV3
          .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid>.ExtensionWriter
            extensionWriter = newExtensionWriter();
        for (int i = 0; i < bid_.size(); i++) {
          output.writeMessage(1, bid_.get(i));
        }
        if (((bitField0_ & 0x00000001) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 2, seat_);
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          output.writeBool(3, group_);
        }
        extensionWriter.writeUntil(10000, output);
        unknownFields.writeTo(output);
      }

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

        size = 0;
        for (int i = 0; i < bid_.size(); i++) {
          size += com.google.protobuf.CodedOutputStream
            .computeMessageSize(1, bid_.get(i));
        }
        if (((bitField0_ & 0x00000001) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, seat_);
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeBoolSize(3, group_);
        }
        size += extensionsSerializedSize();
        size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid)) {
          return super.equals(obj);
        }
        com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid other = (com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid) obj;

        if (!getBidList()
            .equals(other.getBidList())) return false;
        if (hasSeat() != other.hasSeat()) return false;
        if (hasSeat()) {
          if (!getSeat()
              .equals(other.getSeat())) return false;
        }
        if (hasGroup() != other.hasGroup()) return false;
        if (hasGroup()) {
          if (getGroup()
              != other.getGroup()) return false;
        }
        if (!unknownFields.equals(other.unknownFields)) return false;
        if (!getExtensionFields().equals(other.getExtensionFields()))
          return false;
        return true;
      }

      @java.lang.Override
      public int hashCode() {
        if (memoizedHashCode != 0) {
          return memoizedHashCode;
        }
        int hash = 41;
        hash = (19 * hash) + getDescriptor().hashCode();
        if (getBidCount() > 0) {
          hash = (37 * hash) + BID_FIELD_NUMBER;
          hash = (53 * hash) + getBidList().hashCode();
        }
        if (hasSeat()) {
          hash = (37 * hash) + SEAT_FIELD_NUMBER;
          hash = (53 * hash) + getSeat().hashCode();
        }
        if (hasGroup()) {
          hash = (37 * hash) + GROUP_FIELD_NUMBER;
          hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
              getGroup());
        }
        hash = hashFields(hash, getExtensionFields());
        hash = (29 * hash) + unknownFields.hashCode();
        memoizedHashCode = hash;
        return hash;
      }

      public static com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid parseFrom(
          java.nio.ByteBuffer data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid parseFrom(
          java.nio.ByteBuffer data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid parseFrom(
          com.google.protobuf.ByteString data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid parseFrom(
          com.google.protobuf.ByteString data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid parseFrom(byte[] data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid parseFrom(
          byte[] data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid parseFrom(java.io.InputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid 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.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid parseDelimitedFrom(java.io.InputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseDelimitedWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid 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.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid parseFrom(
          com.google.protobuf.CodedInputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid 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.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid 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>
       * OpenRTB 2.0: A bid response can contain multiple SeatBid objects, each on
       * behalf of a different bidder seat and each containing one or more
       * individual bids. If multiple impressions are presented in the request, the
       * group attribute can be used to specify if a seat is willing to accept any
       * impressions that it can win (default) or if it is only interested in
       * winning any if it can win them all as a group.
       * </pre>
       *
       * Protobuf type {@code com.iabtechlab.openrtb.v2.BidResponse.SeatBid}
       */
      public static final class Builder extends
          com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
            com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid, Builder> implements
          // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.BidResponse.SeatBid)
          com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBidOrBuilder {
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidResponse_SeatBid_descriptor;
        }

        @java.lang.Override
        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidResponse_SeatBid_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.class, com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Builder.class);
        }

        // Construct using com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.newBuilder()
        private Builder() {
          maybeForceBuilderInitialization();
        }

        private Builder(
            com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
          super(parent);
          maybeForceBuilderInitialization();
        }
        private void maybeForceBuilderInitialization() {
          if (com.google.protobuf.GeneratedMessageV3
                  .alwaysUseFieldBuilders) {
            getBidFieldBuilder();
          }
        }
        @java.lang.Override
        public Builder clear() {
          super.clear();
          if (bidBuilder_ == null) {
            bid_ = java.util.Collections.emptyList();
            bitField0_ = (bitField0_ & ~0x00000001);
          } else {
            bidBuilder_.clear();
          }
          seat_ = "";
          bitField0_ = (bitField0_ & ~0x00000002);
          group_ = false;
          bitField0_ = (bitField0_ & ~0x00000004);
          return this;
        }

        @java.lang.Override
        public com.google.protobuf.Descriptors.Descriptor
            getDescriptorForType() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidResponse_SeatBid_descriptor;
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid getDefaultInstanceForType() {
          return com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.getDefaultInstance();
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid build() {
          com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid result = buildPartial();
          if (!result.isInitialized()) {
            throw newUninitializedMessageException(result);
          }
          return result;
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid buildPartial() {
          com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid result = new com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid(this);
          int from_bitField0_ = bitField0_;
          int to_bitField0_ = 0;
          if (bidBuilder_ == null) {
            if (((bitField0_ & 0x00000001) != 0)) {
              bid_ = java.util.Collections.unmodifiableList(bid_);
              bitField0_ = (bitField0_ & ~0x00000001);
            }
            result.bid_ = bid_;
          } else {
            result.bid_ = bidBuilder_.build();
          }
          if (((from_bitField0_ & 0x00000002) != 0)) {
            to_bitField0_ |= 0x00000001;
          }
          result.seat_ = seat_;
          if (((from_bitField0_ & 0x00000004) != 0)) {
            result.group_ = group_;
            to_bitField0_ |= 0x00000002;
          }
          result.bitField0_ = to_bitField0_;
          onBuilt();
          return result;
        }

        @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 <Type> Builder setExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid, Type> extension,
            Type value) {
          return super.setExtension(extension, value);
        }
        @java.lang.Override
        public <Type> Builder setExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid, java.util.List<Type>> extension,
            int index, Type value) {
          return super.setExtension(extension, index, value);
        }
        @java.lang.Override
        public <Type> Builder addExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid, java.util.List<Type>> extension,
            Type value) {
          return super.addExtension(extension, value);
        }
        @java.lang.Override
        public <Type> Builder clearExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid, ?> extension) {
          return super.clearExtension(extension);
        }
        @java.lang.Override
        public Builder mergeFrom(com.google.protobuf.Message other) {
          if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid) {
            return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid)other);
          } else {
            super.mergeFrom(other);
            return this;
          }
        }

        public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid other) {
          if (other == com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.getDefaultInstance()) return this;
          if (bidBuilder_ == null) {
            if (!other.bid_.isEmpty()) {
              if (bid_.isEmpty()) {
                bid_ = other.bid_;
                bitField0_ = (bitField0_ & ~0x00000001);
              } else {
                ensureBidIsMutable();
                bid_.addAll(other.bid_);
              }
              onChanged();
            }
          } else {
            if (!other.bid_.isEmpty()) {
              if (bidBuilder_.isEmpty()) {
                bidBuilder_.dispose();
                bidBuilder_ = null;
                bid_ = other.bid_;
                bitField0_ = (bitField0_ & ~0x00000001);
                bidBuilder_ = 
                  com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
                     getBidFieldBuilder() : null;
              } else {
                bidBuilder_.addAllMessages(other.bid_);
              }
            }
          }
          if (other.hasSeat()) {
            bitField0_ |= 0x00000002;
            seat_ = other.seat_;
            onChanged();
          }
          if (other.hasGroup()) {
            setGroup(other.getGroup());
          }
          this.mergeExtensionFields(other);
          this.mergeUnknownFields(other.unknownFields);
          onChanged();
          return this;
        }

        @java.lang.Override
        public final boolean isInitialized() {
          for (int i = 0; i < getBidCount(); i++) {
            if (!getBid(i).isInitialized()) {
              return false;
            }
          }
          if (!extensionsAreInitialized()) {
            return false;
          }
          return true;
        }

        @java.lang.Override
        public Builder mergeFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws java.io.IOException {
          com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid parsedMessage = null;
          try {
            parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid) e.getUnfinishedMessage();
            throw e.unwrapIOException();
          } finally {
            if (parsedMessage != null) {
              mergeFrom(parsedMessage);
            }
          }
          return this;
        }
        private int bitField0_;

        private java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid> bid_ =
          java.util.Collections.emptyList();
        private void ensureBidIsMutable() {
          if (!((bitField0_ & 0x00000001) != 0)) {
            bid_ = new java.util.ArrayList<com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid>(bid_);
            bitField0_ |= 0x00000001;
           }
        }

        private com.google.protobuf.RepeatedFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid, com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.BidOrBuilder> bidBuilder_;

        /**
         * <pre>
         * Array of 1+ Bid objects (Section 4.2.3) each related to an impression.
         * Multiple bids can relate to the same impression.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid.Bid bid = 1;</code>
         */
        public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid> getBidList() {
          if (bidBuilder_ == null) {
            return java.util.Collections.unmodifiableList(bid_);
          } else {
            return bidBuilder_.getMessageList();
          }
        }
        /**
         * <pre>
         * Array of 1+ Bid objects (Section 4.2.3) each related to an impression.
         * Multiple bids can relate to the same impression.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid.Bid bid = 1;</code>
         */
        public int getBidCount() {
          if (bidBuilder_ == null) {
            return bid_.size();
          } else {
            return bidBuilder_.getCount();
          }
        }
        /**
         * <pre>
         * Array of 1+ Bid objects (Section 4.2.3) each related to an impression.
         * Multiple bids can relate to the same impression.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid.Bid bid = 1;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid getBid(int index) {
          if (bidBuilder_ == null) {
            return bid_.get(index);
          } else {
            return bidBuilder_.getMessage(index);
          }
        }
        /**
         * <pre>
         * Array of 1+ Bid objects (Section 4.2.3) each related to an impression.
         * Multiple bids can relate to the same impression.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid.Bid bid = 1;</code>
         */
        public Builder setBid(
            int index, com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid value) {
          if (bidBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            ensureBidIsMutable();
            bid_.set(index, value);
            onChanged();
          } else {
            bidBuilder_.setMessage(index, value);
          }
          return this;
        }
        /**
         * <pre>
         * Array of 1+ Bid objects (Section 4.2.3) each related to an impression.
         * Multiple bids can relate to the same impression.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid.Bid bid = 1;</code>
         */
        public Builder setBid(
            int index, com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid.Builder builderForValue) {
          if (bidBuilder_ == null) {
            ensureBidIsMutable();
            bid_.set(index, builderForValue.build());
            onChanged();
          } else {
            bidBuilder_.setMessage(index, builderForValue.build());
          }
          return this;
        }
        /**
         * <pre>
         * Array of 1+ Bid objects (Section 4.2.3) each related to an impression.
         * Multiple bids can relate to the same impression.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid.Bid bid = 1;</code>
         */
        public Builder addBid(com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid value) {
          if (bidBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            ensureBidIsMutable();
            bid_.add(value);
            onChanged();
          } else {
            bidBuilder_.addMessage(value);
          }
          return this;
        }
        /**
         * <pre>
         * Array of 1+ Bid objects (Section 4.2.3) each related to an impression.
         * Multiple bids can relate to the same impression.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid.Bid bid = 1;</code>
         */
        public Builder addBid(
            int index, com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid value) {
          if (bidBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            ensureBidIsMutable();
            bid_.add(index, value);
            onChanged();
          } else {
            bidBuilder_.addMessage(index, value);
          }
          return this;
        }
        /**
         * <pre>
         * Array of 1+ Bid objects (Section 4.2.3) each related to an impression.
         * Multiple bids can relate to the same impression.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid.Bid bid = 1;</code>
         */
        public Builder addBid(
            com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid.Builder builderForValue) {
          if (bidBuilder_ == null) {
            ensureBidIsMutable();
            bid_.add(builderForValue.build());
            onChanged();
          } else {
            bidBuilder_.addMessage(builderForValue.build());
          }
          return this;
        }
        /**
         * <pre>
         * Array of 1+ Bid objects (Section 4.2.3) each related to an impression.
         * Multiple bids can relate to the same impression.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid.Bid bid = 1;</code>
         */
        public Builder addBid(
            int index, com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid.Builder builderForValue) {
          if (bidBuilder_ == null) {
            ensureBidIsMutable();
            bid_.add(index, builderForValue.build());
            onChanged();
          } else {
            bidBuilder_.addMessage(index, builderForValue.build());
          }
          return this;
        }
        /**
         * <pre>
         * Array of 1+ Bid objects (Section 4.2.3) each related to an impression.
         * Multiple bids can relate to the same impression.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid.Bid bid = 1;</code>
         */
        public Builder addAllBid(
            java.lang.Iterable<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid> values) {
          if (bidBuilder_ == null) {
            ensureBidIsMutable();
            com.google.protobuf.AbstractMessageLite.Builder.addAll(
                values, bid_);
            onChanged();
          } else {
            bidBuilder_.addAllMessages(values);
          }
          return this;
        }
        /**
         * <pre>
         * Array of 1+ Bid objects (Section 4.2.3) each related to an impression.
         * Multiple bids can relate to the same impression.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid.Bid bid = 1;</code>
         */
        public Builder clearBid() {
          if (bidBuilder_ == null) {
            bid_ = java.util.Collections.emptyList();
            bitField0_ = (bitField0_ & ~0x00000001);
            onChanged();
          } else {
            bidBuilder_.clear();
          }
          return this;
        }
        /**
         * <pre>
         * Array of 1+ Bid objects (Section 4.2.3) each related to an impression.
         * Multiple bids can relate to the same impression.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid.Bid bid = 1;</code>
         */
        public Builder removeBid(int index) {
          if (bidBuilder_ == null) {
            ensureBidIsMutable();
            bid_.remove(index);
            onChanged();
          } else {
            bidBuilder_.remove(index);
          }
          return this;
        }
        /**
         * <pre>
         * Array of 1+ Bid objects (Section 4.2.3) each related to an impression.
         * Multiple bids can relate to the same impression.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid.Bid bid = 1;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid.Builder getBidBuilder(
            int index) {
          return getBidFieldBuilder().getBuilder(index);
        }
        /**
         * <pre>
         * Array of 1+ Bid objects (Section 4.2.3) each related to an impression.
         * Multiple bids can relate to the same impression.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid.Bid bid = 1;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.BidOrBuilder getBidOrBuilder(
            int index) {
          if (bidBuilder_ == null) {
            return bid_.get(index);  } else {
            return bidBuilder_.getMessageOrBuilder(index);
          }
        }
        /**
         * <pre>
         * Array of 1+ Bid objects (Section 4.2.3) each related to an impression.
         * Multiple bids can relate to the same impression.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid.Bid bid = 1;</code>
         */
        public java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.BidOrBuilder> 
             getBidOrBuilderList() {
          if (bidBuilder_ != null) {
            return bidBuilder_.getMessageOrBuilderList();
          } else {
            return java.util.Collections.unmodifiableList(bid_);
          }
        }
        /**
         * <pre>
         * Array of 1+ Bid objects (Section 4.2.3) each related to an impression.
         * Multiple bids can relate to the same impression.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid.Bid bid = 1;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid.Builder addBidBuilder() {
          return getBidFieldBuilder().addBuilder(
              com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid.getDefaultInstance());
        }
        /**
         * <pre>
         * Array of 1+ Bid objects (Section 4.2.3) each related to an impression.
         * Multiple bids can relate to the same impression.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid.Bid bid = 1;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid.Builder addBidBuilder(
            int index) {
          return getBidFieldBuilder().addBuilder(
              index, com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid.getDefaultInstance());
        }
        /**
         * <pre>
         * Array of 1+ Bid objects (Section 4.2.3) each related to an impression.
         * Multiple bids can relate to the same impression.
         * </pre>
         *
         * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid.Bid bid = 1;</code>
         */
        public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid.Builder> 
             getBidBuilderList() {
          return getBidFieldBuilder().getBuilderList();
        }
        private com.google.protobuf.RepeatedFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid, com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.BidOrBuilder> 
            getBidFieldBuilder() {
          if (bidBuilder_ == null) {
            bidBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
                com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid, com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Bid.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.BidOrBuilder>(
                    bid_,
                    ((bitField0_ & 0x00000001) != 0),
                    getParentForChildren(),
                    isClean());
            bid_ = null;
          }
          return bidBuilder_;
        }

        private java.lang.Object seat_ = "";
        /**
         * <pre>
         * ID of the buyer seat (e.g., advertiser, agency) on whose behalf
         * this bid is made.
         * This ID will be used to breakdown spend and invalid traffic metrics in
         * IVT transparency reporting, given that it is no longer than 64 bytes.
         * </pre>
         *
         * <code>optional string seat = 2;</code>
         * @return Whether the seat field is set.
         */
        public boolean hasSeat() {
          return ((bitField0_ & 0x00000002) != 0);
        }
        /**
         * <pre>
         * ID of the buyer seat (e.g., advertiser, agency) on whose behalf
         * this bid is made.
         * This ID will be used to breakdown spend and invalid traffic metrics in
         * IVT transparency reporting, given that it is no longer than 64 bytes.
         * </pre>
         *
         * <code>optional string seat = 2;</code>
         * @return The seat.
         */
        public java.lang.String getSeat() {
          java.lang.Object ref = seat_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              seat_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * ID of the buyer seat (e.g., advertiser, agency) on whose behalf
         * this bid is made.
         * This ID will be used to breakdown spend and invalid traffic metrics in
         * IVT transparency reporting, given that it is no longer than 64 bytes.
         * </pre>
         *
         * <code>optional string seat = 2;</code>
         * @return The bytes for seat.
         */
        public com.google.protobuf.ByteString
            getSeatBytes() {
          java.lang.Object ref = seat_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            seat_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * ID of the buyer seat (e.g., advertiser, agency) on whose behalf
         * this bid is made.
         * This ID will be used to breakdown spend and invalid traffic metrics in
         * IVT transparency reporting, given that it is no longer than 64 bytes.
         * </pre>
         *
         * <code>optional string seat = 2;</code>
         * @param value The seat to set.
         * @return This builder for chaining.
         */
        public Builder setSeat(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
          seat_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * ID of the buyer seat (e.g., advertiser, agency) on whose behalf
         * this bid is made.
         * This ID will be used to breakdown spend and invalid traffic metrics in
         * IVT transparency reporting, given that it is no longer than 64 bytes.
         * </pre>
         *
         * <code>optional string seat = 2;</code>
         * @return This builder for chaining.
         */
        public Builder clearSeat() {
          bitField0_ = (bitField0_ & ~0x00000002);
          seat_ = getDefaultInstance().getSeat();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * ID of the buyer seat (e.g., advertiser, agency) on whose behalf
         * this bid is made.
         * This ID will be used to breakdown spend and invalid traffic metrics in
         * IVT transparency reporting, given that it is no longer than 64 bytes.
         * </pre>
         *
         * <code>optional string seat = 2;</code>
         * @param value The bytes for seat to set.
         * @return This builder for chaining.
         */
        public Builder setSeatBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
          seat_ = value;
          onChanged();
          return this;
        }

        private boolean group_ ;
        /**
         * <pre>
         * 0 = impressions can be won individually; 1 = impressions must be won or
         * lost as a group.
         * </pre>
         *
         * <code>optional bool group = 3 [default = false];</code>
         * @return Whether the group field is set.
         */
        @java.lang.Override
        public boolean hasGroup() {
          return ((bitField0_ & 0x00000004) != 0);
        }
        /**
         * <pre>
         * 0 = impressions can be won individually; 1 = impressions must be won or
         * lost as a group.
         * </pre>
         *
         * <code>optional bool group = 3 [default = false];</code>
         * @return The group.
         */
        @java.lang.Override
        public boolean getGroup() {
          return group_;
        }
        /**
         * <pre>
         * 0 = impressions can be won individually; 1 = impressions must be won or
         * lost as a group.
         * </pre>
         *
         * <code>optional bool group = 3 [default = false];</code>
         * @param value The group to set.
         * @return This builder for chaining.
         */
        public Builder setGroup(boolean value) {
          bitField0_ |= 0x00000004;
          group_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * 0 = impressions can be won individually; 1 = impressions must be won or
         * lost as a group.
         * </pre>
         *
         * <code>optional bool group = 3 [default = false];</code>
         * @return This builder for chaining.
         */
        public Builder clearGroup() {
          bitField0_ = (bitField0_ & ~0x00000004);
          group_ = 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:com.iabtechlab.openrtb.v2.BidResponse.SeatBid)
      }

      // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.BidResponse.SeatBid)
      private static final com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid DEFAULT_INSTANCE;
      static {
        DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid();
      }

      public static com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid getDefaultInstance() {
        return DEFAULT_INSTANCE;
      }

      @java.lang.Deprecated public static final com.google.protobuf.Parser<SeatBid>
          PARSER = new com.google.protobuf.AbstractParser<SeatBid>() {
        @java.lang.Override
        public SeatBid parsePartialFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return new SeatBid(input, extensionRegistry);
        }
      };

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

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

      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid getDefaultInstanceForType() {
        return DEFAULT_INSTANCE;
      }

    }

    private int bitField0_;
    public static final int ID_FIELD_NUMBER = 1;
    private volatile java.lang.Object id_;
    /**
     * <pre>
     * ID of the bid request to which this is a response.
     * REQUIRED by the OpenRTB specification.
     * </pre>
     *
     * <code>required string id = 1;</code>
     * @return Whether the id field is set.
     */
    @java.lang.Override
    public boolean hasId() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <pre>
     * ID of the bid request to which this is a response.
     * REQUIRED by the OpenRTB specification.
     * </pre>
     *
     * <code>required string id = 1;</code>
     * @return The id.
     */
    @java.lang.Override
    public java.lang.String getId() {
      java.lang.Object ref = id_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          id_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * ID of the bid request to which this is a response.
     * REQUIRED by the OpenRTB specification.
     * </pre>
     *
     * <code>required string id = 1;</code>
     * @return The bytes for id.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getIdBytes() {
      java.lang.Object ref = id_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        id_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int SEATBID_FIELD_NUMBER = 2;
    private java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid> seatbid_;
    /**
     * <pre>
     * Array of seatbid objects; 1+ required if a bid is to be made.
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid seatbid = 2;</code>
     */
    @java.lang.Override
    public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid> getSeatbidList() {
      return seatbid_;
    }
    /**
     * <pre>
     * Array of seatbid objects; 1+ required if a bid is to be made.
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid seatbid = 2;</code>
     */
    @java.lang.Override
    public java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBidOrBuilder> 
        getSeatbidOrBuilderList() {
      return seatbid_;
    }
    /**
     * <pre>
     * Array of seatbid objects; 1+ required if a bid is to be made.
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid seatbid = 2;</code>
     */
    @java.lang.Override
    public int getSeatbidCount() {
      return seatbid_.size();
    }
    /**
     * <pre>
     * Array of seatbid objects; 1+ required if a bid is to be made.
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid seatbid = 2;</code>
     */
    @java.lang.Override
    public com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid getSeatbid(int index) {
      return seatbid_.get(index);
    }
    /**
     * <pre>
     * Array of seatbid objects; 1+ required if a bid is to be made.
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid seatbid = 2;</code>
     */
    @java.lang.Override
    public com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBidOrBuilder getSeatbidOrBuilder(
        int index) {
      return seatbid_.get(index);
    }

    public static final int BIDID_FIELD_NUMBER = 3;
    private volatile java.lang.Object bidid_;
    /**
     * <pre>
     * Bidder generated response ID to assist with logging/tracking.
     * </pre>
     *
     * <code>optional string bidid = 3;</code>
     * @return Whether the bidid field is set.
     */
    @java.lang.Override
    public boolean hasBidid() {
      return ((bitField0_ & 0x00000002) != 0);
    }
    /**
     * <pre>
     * Bidder generated response ID to assist with logging/tracking.
     * </pre>
     *
     * <code>optional string bidid = 3;</code>
     * @return The bidid.
     */
    @java.lang.Override
    public java.lang.String getBidid() {
      java.lang.Object ref = bidid_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          bidid_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * Bidder generated response ID to assist with logging/tracking.
     * </pre>
     *
     * <code>optional string bidid = 3;</code>
     * @return The bytes for bidid.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getBididBytes() {
      java.lang.Object ref = bidid_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        bidid_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int CUR_FIELD_NUMBER = 4;
    private volatile java.lang.Object cur_;
    /**
     * <pre>
     * Bid currency using ISO-4217 alpha codes.
     * </pre>
     *
     * <code>optional string cur = 4;</code>
     * @return Whether the cur field is set.
     */
    @java.lang.Override
    public boolean hasCur() {
      return ((bitField0_ & 0x00000004) != 0);
    }
    /**
     * <pre>
     * Bid currency using ISO-4217 alpha codes.
     * </pre>
     *
     * <code>optional string cur = 4;</code>
     * @return The cur.
     */
    @java.lang.Override
    public java.lang.String getCur() {
      java.lang.Object ref = cur_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          cur_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * Bid currency using ISO-4217 alpha codes.
     * </pre>
     *
     * <code>optional string cur = 4;</code>
     * @return The bytes for cur.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getCurBytes() {
      java.lang.Object ref = cur_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        cur_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int CUSTOMDATA_FIELD_NUMBER = 5;
    private volatile java.lang.Object customdata_;
    /**
     * <pre>
     * Optional feature to allow a bidder to set data in the exchange's cookie.
     * The string must be in base85 cookie safe characters and be in any format.
     * Proper JSON encoding must be used to include "escaped" quotation marks.
     * </pre>
     *
     * <code>optional string customdata = 5;</code>
     * @return Whether the customdata field is set.
     */
    @java.lang.Override
    public boolean hasCustomdata() {
      return ((bitField0_ & 0x00000008) != 0);
    }
    /**
     * <pre>
     * Optional feature to allow a bidder to set data in the exchange's cookie.
     * The string must be in base85 cookie safe characters and be in any format.
     * Proper JSON encoding must be used to include "escaped" quotation marks.
     * </pre>
     *
     * <code>optional string customdata = 5;</code>
     * @return The customdata.
     */
    @java.lang.Override
    public java.lang.String getCustomdata() {
      java.lang.Object ref = customdata_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          customdata_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * Optional feature to allow a bidder to set data in the exchange's cookie.
     * The string must be in base85 cookie safe characters and be in any format.
     * Proper JSON encoding must be used to include "escaped" quotation marks.
     * </pre>
     *
     * <code>optional string customdata = 5;</code>
     * @return The bytes for customdata.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getCustomdataBytes() {
      java.lang.Object ref = customdata_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        customdata_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int NBR_FIELD_NUMBER = 6;
    private int nbr_;
    /**
     * <pre>
     * Reason for not bidding.
     * Refer to enum com.iabtechlab.openrtb.v3.NoBidReason for generic values.
     * </pre>
     *
     * <code>optional int32 nbr = 6;</code>
     * @return Whether the nbr field is set.
     */
    @java.lang.Override
    public boolean hasNbr() {
      return ((bitField0_ & 0x00000010) != 0);
    }
    /**
     * <pre>
     * Reason for not bidding.
     * Refer to enum com.iabtechlab.openrtb.v3.NoBidReason for generic values.
     * </pre>
     *
     * <code>optional int32 nbr = 6;</code>
     * @return The nbr.
     */
    @java.lang.Override
    public int getNbr() {
      return nbr_;
    }

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

      if (!hasId()) {
        memoizedIsInitialized = 0;
        return false;
      }
      for (int i = 0; i < getSeatbidCount(); i++) {
        if (!getSeatbid(i).isInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
      }
      if (!extensionsAreInitialized()) {
        memoizedIsInitialized = 0;
        return false;
      }
      memoizedIsInitialized = 1;
      return true;
    }

    @java.lang.Override
    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      com.google.protobuf.GeneratedMessageV3
        .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.BidResponse>.ExtensionWriter
          extensionWriter = newExtensionWriter();
      if (((bitField0_ & 0x00000001) != 0)) {
        com.google.protobuf.GeneratedMessageV3.writeString(output, 1, id_);
      }
      for (int i = 0; i < seatbid_.size(); i++) {
        output.writeMessage(2, seatbid_.get(i));
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        com.google.protobuf.GeneratedMessageV3.writeString(output, 3, bidid_);
      }
      if (((bitField0_ & 0x00000004) != 0)) {
        com.google.protobuf.GeneratedMessageV3.writeString(output, 4, cur_);
      }
      if (((bitField0_ & 0x00000008) != 0)) {
        com.google.protobuf.GeneratedMessageV3.writeString(output, 5, customdata_);
      }
      if (((bitField0_ & 0x00000010) != 0)) {
        output.writeInt32(6, nbr_);
      }
      extensionWriter.writeUntil(10000, output);
      unknownFields.writeTo(output);
    }

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

      size = 0;
      if (((bitField0_ & 0x00000001) != 0)) {
        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, id_);
      }
      for (int i = 0; i < seatbid_.size(); i++) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(2, seatbid_.get(i));
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, bidid_);
      }
      if (((bitField0_ & 0x00000004) != 0)) {
        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, cur_);
      }
      if (((bitField0_ & 0x00000008) != 0)) {
        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(5, customdata_);
      }
      if (((bitField0_ & 0x00000010) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt32Size(6, nbr_);
      }
      size += extensionsSerializedSize();
      size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.BidResponse)) {
        return super.equals(obj);
      }
      com.iabtechlab.openrtb.v2.OpenRtb.BidResponse other = (com.iabtechlab.openrtb.v2.OpenRtb.BidResponse) obj;

      if (hasId() != other.hasId()) return false;
      if (hasId()) {
        if (!getId()
            .equals(other.getId())) return false;
      }
      if (!getSeatbidList()
          .equals(other.getSeatbidList())) return false;
      if (hasBidid() != other.hasBidid()) return false;
      if (hasBidid()) {
        if (!getBidid()
            .equals(other.getBidid())) return false;
      }
      if (hasCur() != other.hasCur()) return false;
      if (hasCur()) {
        if (!getCur()
            .equals(other.getCur())) return false;
      }
      if (hasCustomdata() != other.hasCustomdata()) return false;
      if (hasCustomdata()) {
        if (!getCustomdata()
            .equals(other.getCustomdata())) return false;
      }
      if (hasNbr() != other.hasNbr()) return false;
      if (hasNbr()) {
        if (getNbr()
            != other.getNbr()) return false;
      }
      if (!unknownFields.equals(other.unknownFields)) return false;
      if (!getExtensionFields().equals(other.getExtensionFields()))
        return false;
      return true;
    }

    @java.lang.Override
    public int hashCode() {
      if (memoizedHashCode != 0) {
        return memoizedHashCode;
      }
      int hash = 41;
      hash = (19 * hash) + getDescriptor().hashCode();
      if (hasId()) {
        hash = (37 * hash) + ID_FIELD_NUMBER;
        hash = (53 * hash) + getId().hashCode();
      }
      if (getSeatbidCount() > 0) {
        hash = (37 * hash) + SEATBID_FIELD_NUMBER;
        hash = (53 * hash) + getSeatbidList().hashCode();
      }
      if (hasBidid()) {
        hash = (37 * hash) + BIDID_FIELD_NUMBER;
        hash = (53 * hash) + getBidid().hashCode();
      }
      if (hasCur()) {
        hash = (37 * hash) + CUR_FIELD_NUMBER;
        hash = (53 * hash) + getCur().hashCode();
      }
      if (hasCustomdata()) {
        hash = (37 * hash) + CUSTOMDATA_FIELD_NUMBER;
        hash = (53 * hash) + getCustomdata().hashCode();
      }
      if (hasNbr()) {
        hash = (37 * hash) + NBR_FIELD_NUMBER;
        hash = (53 * hash) + getNbr();
      }
      hash = hashFields(hash, getExtensionFields());
      hash = (29 * hash) + unknownFields.hashCode();
      memoizedHashCode = hash;
      return hash;
    }

    public static com.iabtechlab.openrtb.v2.OpenRtb.BidResponse parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.iabtechlab.openrtb.v2.OpenRtb.BidResponse parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.iabtechlab.openrtb.v2.OpenRtb.BidResponse parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.iabtechlab.openrtb.v2.OpenRtb.BidResponse parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.iabtechlab.openrtb.v2.OpenRtb.BidResponse parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.iabtechlab.openrtb.v2.OpenRtb.BidResponse parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.iabtechlab.openrtb.v2.OpenRtb.BidResponse parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.iabtechlab.openrtb.v2.OpenRtb.BidResponse 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.iabtechlab.openrtb.v2.OpenRtb.BidResponse parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static com.iabtechlab.openrtb.v2.OpenRtb.BidResponse 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.iabtechlab.openrtb.v2.OpenRtb.BidResponse parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.iabtechlab.openrtb.v2.OpenRtb.BidResponse 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.iabtechlab.openrtb.v2.OpenRtb.BidResponse 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>
     * OpenRTB 2.0: This object is the top-level bid response object (i.e., the
     * unnamed outer JSON object). The id attribute is a reflection of the bid
     * request ID for logging purposes. Similarly, bidid is an optional response
     * tracking ID for bidders. If specified, it can be included in the subsequent
     * win notice call if the bidder wins. At least one seatbid object is required,
     * which contains at least one bid for an impression. Other attributes are
     * optional. To express a "no-bid", the options are to return an empty response
     * with HTTP 204. Alternately if the bidder wishes to convey to the exchange a
     * reason for not bidding, just a BidResponse object is returned with a
     * reason code in the nbr attribute.
     * </pre>
     *
     * Protobuf type {@code com.iabtechlab.openrtb.v2.BidResponse}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
          com.iabtechlab.openrtb.v2.OpenRtb.BidResponse, Builder> implements
        // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.BidResponse)
        com.iabtechlab.openrtb.v2.OpenRtb.BidResponseOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidResponse_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidResponse_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.class, com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.Builder.class);
      }

      // Construct using com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
          getSeatbidFieldBuilder();
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        id_ = "";
        bitField0_ = (bitField0_ & ~0x00000001);
        if (seatbidBuilder_ == null) {
          seatbid_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000002);
        } else {
          seatbidBuilder_.clear();
        }
        bidid_ = "";
        bitField0_ = (bitField0_ & ~0x00000004);
        cur_ = "";
        bitField0_ = (bitField0_ & ~0x00000008);
        customdata_ = "";
        bitField0_ = (bitField0_ & ~0x00000010);
        nbr_ = 0;
        bitField0_ = (bitField0_ & ~0x00000020);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_BidResponse_descriptor;
      }

      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidResponse getDefaultInstanceForType() {
        return com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.getDefaultInstance();
      }

      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidResponse build() {
        com.iabtechlab.openrtb.v2.OpenRtb.BidResponse result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidResponse buildPartial() {
        com.iabtechlab.openrtb.v2.OpenRtb.BidResponse result = new com.iabtechlab.openrtb.v2.OpenRtb.BidResponse(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) != 0)) {
          to_bitField0_ |= 0x00000001;
        }
        result.id_ = id_;
        if (seatbidBuilder_ == null) {
          if (((bitField0_ & 0x00000002) != 0)) {
            seatbid_ = java.util.Collections.unmodifiableList(seatbid_);
            bitField0_ = (bitField0_ & ~0x00000002);
          }
          result.seatbid_ = seatbid_;
        } else {
          result.seatbid_ = seatbidBuilder_.build();
        }
        if (((from_bitField0_ & 0x00000004) != 0)) {
          to_bitField0_ |= 0x00000002;
        }
        result.bidid_ = bidid_;
        if (((from_bitField0_ & 0x00000008) != 0)) {
          to_bitField0_ |= 0x00000004;
        }
        result.cur_ = cur_;
        if (((from_bitField0_ & 0x00000010) != 0)) {
          to_bitField0_ |= 0x00000008;
        }
        result.customdata_ = customdata_;
        if (((from_bitField0_ & 0x00000020) != 0)) {
          result.nbr_ = nbr_;
          to_bitField0_ |= 0x00000010;
        }
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      @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 <Type> Builder setExtension(
          com.google.protobuf.GeneratedMessage.GeneratedExtension<
              com.iabtechlab.openrtb.v2.OpenRtb.BidResponse, Type> extension,
          Type value) {
        return super.setExtension(extension, value);
      }
      @java.lang.Override
      public <Type> Builder setExtension(
          com.google.protobuf.GeneratedMessage.GeneratedExtension<
              com.iabtechlab.openrtb.v2.OpenRtb.BidResponse, java.util.List<Type>> extension,
          int index, Type value) {
        return super.setExtension(extension, index, value);
      }
      @java.lang.Override
      public <Type> Builder addExtension(
          com.google.protobuf.GeneratedMessage.GeneratedExtension<
              com.iabtechlab.openrtb.v2.OpenRtb.BidResponse, java.util.List<Type>> extension,
          Type value) {
        return super.addExtension(extension, value);
      }
      @java.lang.Override
      public <Type> Builder clearExtension(
          com.google.protobuf.GeneratedMessage.GeneratedExtension<
              com.iabtechlab.openrtb.v2.OpenRtb.BidResponse, ?> extension) {
        return super.clearExtension(extension);
      }
      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.BidResponse) {
          return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.BidResponse)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.BidResponse other) {
        if (other == com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.getDefaultInstance()) return this;
        if (other.hasId()) {
          bitField0_ |= 0x00000001;
          id_ = other.id_;
          onChanged();
        }
        if (seatbidBuilder_ == null) {
          if (!other.seatbid_.isEmpty()) {
            if (seatbid_.isEmpty()) {
              seatbid_ = other.seatbid_;
              bitField0_ = (bitField0_ & ~0x00000002);
            } else {
              ensureSeatbidIsMutable();
              seatbid_.addAll(other.seatbid_);
            }
            onChanged();
          }
        } else {
          if (!other.seatbid_.isEmpty()) {
            if (seatbidBuilder_.isEmpty()) {
              seatbidBuilder_.dispose();
              seatbidBuilder_ = null;
              seatbid_ = other.seatbid_;
              bitField0_ = (bitField0_ & ~0x00000002);
              seatbidBuilder_ = 
                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
                   getSeatbidFieldBuilder() : null;
            } else {
              seatbidBuilder_.addAllMessages(other.seatbid_);
            }
          }
        }
        if (other.hasBidid()) {
          bitField0_ |= 0x00000004;
          bidid_ = other.bidid_;
          onChanged();
        }
        if (other.hasCur()) {
          bitField0_ |= 0x00000008;
          cur_ = other.cur_;
          onChanged();
        }
        if (other.hasCustomdata()) {
          bitField0_ |= 0x00000010;
          customdata_ = other.customdata_;
          onChanged();
        }
        if (other.hasNbr()) {
          setNbr(other.getNbr());
        }
        this.mergeExtensionFields(other);
        this.mergeUnknownFields(other.unknownFields);
        onChanged();
        return this;
      }

      @java.lang.Override
      public final boolean isInitialized() {
        if (!hasId()) {
          return false;
        }
        for (int i = 0; i < getSeatbidCount(); i++) {
          if (!getSeatbid(i).isInitialized()) {
            return false;
          }
        }
        if (!extensionsAreInitialized()) {
          return false;
        }
        return true;
      }

      @java.lang.Override
      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.iabtechlab.openrtb.v2.OpenRtb.BidResponse parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.BidResponse) e.getUnfinishedMessage();
          throw e.unwrapIOException();
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      private java.lang.Object id_ = "";
      /**
       * <pre>
       * ID of the bid request to which this is a response.
       * REQUIRED by the OpenRTB specification.
       * </pre>
       *
       * <code>required string id = 1;</code>
       * @return Whether the id field is set.
       */
      public boolean hasId() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <pre>
       * ID of the bid request to which this is a response.
       * REQUIRED by the OpenRTB specification.
       * </pre>
       *
       * <code>required string id = 1;</code>
       * @return The id.
       */
      public java.lang.String getId() {
        java.lang.Object ref = id_;
        if (!(ref instanceof java.lang.String)) {
          com.google.protobuf.ByteString bs =
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            id_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * ID of the bid request to which this is a response.
       * REQUIRED by the OpenRTB specification.
       * </pre>
       *
       * <code>required string id = 1;</code>
       * @return The bytes for id.
       */
      public com.google.protobuf.ByteString
          getIdBytes() {
        java.lang.Object ref = id_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          id_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * ID of the bid request to which this is a response.
       * REQUIRED by the OpenRTB specification.
       * </pre>
       *
       * <code>required string id = 1;</code>
       * @param value The id to set.
       * @return This builder for chaining.
       */
      public Builder setId(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
        id_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * ID of the bid request to which this is a response.
       * REQUIRED by the OpenRTB specification.
       * </pre>
       *
       * <code>required string id = 1;</code>
       * @return This builder for chaining.
       */
      public Builder clearId() {
        bitField0_ = (bitField0_ & ~0x00000001);
        id_ = getDefaultInstance().getId();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * ID of the bid request to which this is a response.
       * REQUIRED by the OpenRTB specification.
       * </pre>
       *
       * <code>required string id = 1;</code>
       * @param value The bytes for id to set.
       * @return This builder for chaining.
       */
      public Builder setIdBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
        id_ = value;
        onChanged();
        return this;
      }

      private java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid> seatbid_ =
        java.util.Collections.emptyList();
      private void ensureSeatbidIsMutable() {
        if (!((bitField0_ & 0x00000002) != 0)) {
          seatbid_ = new java.util.ArrayList<com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid>(seatbid_);
          bitField0_ |= 0x00000002;
         }
      }

      private com.google.protobuf.RepeatedFieldBuilderV3<
          com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid, com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBidOrBuilder> seatbidBuilder_;

      /**
       * <pre>
       * Array of seatbid objects; 1+ required if a bid is to be made.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid seatbid = 2;</code>
       */
      public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid> getSeatbidList() {
        if (seatbidBuilder_ == null) {
          return java.util.Collections.unmodifiableList(seatbid_);
        } else {
          return seatbidBuilder_.getMessageList();
        }
      }
      /**
       * <pre>
       * Array of seatbid objects; 1+ required if a bid is to be made.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid seatbid = 2;</code>
       */
      public int getSeatbidCount() {
        if (seatbidBuilder_ == null) {
          return seatbid_.size();
        } else {
          return seatbidBuilder_.getCount();
        }
      }
      /**
       * <pre>
       * Array of seatbid objects; 1+ required if a bid is to be made.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid seatbid = 2;</code>
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid getSeatbid(int index) {
        if (seatbidBuilder_ == null) {
          return seatbid_.get(index);
        } else {
          return seatbidBuilder_.getMessage(index);
        }
      }
      /**
       * <pre>
       * Array of seatbid objects; 1+ required if a bid is to be made.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid seatbid = 2;</code>
       */
      public Builder setSeatbid(
          int index, com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid value) {
        if (seatbidBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureSeatbidIsMutable();
          seatbid_.set(index, value);
          onChanged();
        } else {
          seatbidBuilder_.setMessage(index, value);
        }
        return this;
      }
      /**
       * <pre>
       * Array of seatbid objects; 1+ required if a bid is to be made.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid seatbid = 2;</code>
       */
      public Builder setSeatbid(
          int index, com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Builder builderForValue) {
        if (seatbidBuilder_ == null) {
          ensureSeatbidIsMutable();
          seatbid_.set(index, builderForValue.build());
          onChanged();
        } else {
          seatbidBuilder_.setMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * <pre>
       * Array of seatbid objects; 1+ required if a bid is to be made.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid seatbid = 2;</code>
       */
      public Builder addSeatbid(com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid value) {
        if (seatbidBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureSeatbidIsMutable();
          seatbid_.add(value);
          onChanged();
        } else {
          seatbidBuilder_.addMessage(value);
        }
        return this;
      }
      /**
       * <pre>
       * Array of seatbid objects; 1+ required if a bid is to be made.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid seatbid = 2;</code>
       */
      public Builder addSeatbid(
          int index, com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid value) {
        if (seatbidBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureSeatbidIsMutable();
          seatbid_.add(index, value);
          onChanged();
        } else {
          seatbidBuilder_.addMessage(index, value);
        }
        return this;
      }
      /**
       * <pre>
       * Array of seatbid objects; 1+ required if a bid is to be made.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid seatbid = 2;</code>
       */
      public Builder addSeatbid(
          com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Builder builderForValue) {
        if (seatbidBuilder_ == null) {
          ensureSeatbidIsMutable();
          seatbid_.add(builderForValue.build());
          onChanged();
        } else {
          seatbidBuilder_.addMessage(builderForValue.build());
        }
        return this;
      }
      /**
       * <pre>
       * Array of seatbid objects; 1+ required if a bid is to be made.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid seatbid = 2;</code>
       */
      public Builder addSeatbid(
          int index, com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Builder builderForValue) {
        if (seatbidBuilder_ == null) {
          ensureSeatbidIsMutable();
          seatbid_.add(index, builderForValue.build());
          onChanged();
        } else {
          seatbidBuilder_.addMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * <pre>
       * Array of seatbid objects; 1+ required if a bid is to be made.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid seatbid = 2;</code>
       */
      public Builder addAllSeatbid(
          java.lang.Iterable<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid> values) {
        if (seatbidBuilder_ == null) {
          ensureSeatbidIsMutable();
          com.google.protobuf.AbstractMessageLite.Builder.addAll(
              values, seatbid_);
          onChanged();
        } else {
          seatbidBuilder_.addAllMessages(values);
        }
        return this;
      }
      /**
       * <pre>
       * Array of seatbid objects; 1+ required if a bid is to be made.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid seatbid = 2;</code>
       */
      public Builder clearSeatbid() {
        if (seatbidBuilder_ == null) {
          seatbid_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000002);
          onChanged();
        } else {
          seatbidBuilder_.clear();
        }
        return this;
      }
      /**
       * <pre>
       * Array of seatbid objects; 1+ required if a bid is to be made.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid seatbid = 2;</code>
       */
      public Builder removeSeatbid(int index) {
        if (seatbidBuilder_ == null) {
          ensureSeatbidIsMutable();
          seatbid_.remove(index);
          onChanged();
        } else {
          seatbidBuilder_.remove(index);
        }
        return this;
      }
      /**
       * <pre>
       * Array of seatbid objects; 1+ required if a bid is to be made.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid seatbid = 2;</code>
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Builder getSeatbidBuilder(
          int index) {
        return getSeatbidFieldBuilder().getBuilder(index);
      }
      /**
       * <pre>
       * Array of seatbid objects; 1+ required if a bid is to be made.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid seatbid = 2;</code>
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBidOrBuilder getSeatbidOrBuilder(
          int index) {
        if (seatbidBuilder_ == null) {
          return seatbid_.get(index);  } else {
          return seatbidBuilder_.getMessageOrBuilder(index);
        }
      }
      /**
       * <pre>
       * Array of seatbid objects; 1+ required if a bid is to be made.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid seatbid = 2;</code>
       */
      public java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBidOrBuilder> 
           getSeatbidOrBuilderList() {
        if (seatbidBuilder_ != null) {
          return seatbidBuilder_.getMessageOrBuilderList();
        } else {
          return java.util.Collections.unmodifiableList(seatbid_);
        }
      }
      /**
       * <pre>
       * Array of seatbid objects; 1+ required if a bid is to be made.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid seatbid = 2;</code>
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Builder addSeatbidBuilder() {
        return getSeatbidFieldBuilder().addBuilder(
            com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.getDefaultInstance());
      }
      /**
       * <pre>
       * Array of seatbid objects; 1+ required if a bid is to be made.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid seatbid = 2;</code>
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Builder addSeatbidBuilder(
          int index) {
        return getSeatbidFieldBuilder().addBuilder(
            index, com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.getDefaultInstance());
      }
      /**
       * <pre>
       * Array of seatbid objects; 1+ required if a bid is to be made.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.BidResponse.SeatBid seatbid = 2;</code>
       */
      public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Builder> 
           getSeatbidBuilderList() {
        return getSeatbidFieldBuilder().getBuilderList();
      }
      private com.google.protobuf.RepeatedFieldBuilderV3<
          com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid, com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBidOrBuilder> 
          getSeatbidFieldBuilder() {
        if (seatbidBuilder_ == null) {
          seatbidBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
              com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid, com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBid.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidResponse.SeatBidOrBuilder>(
                  seatbid_,
                  ((bitField0_ & 0x00000002) != 0),
                  getParentForChildren(),
                  isClean());
          seatbid_ = null;
        }
        return seatbidBuilder_;
      }

      private java.lang.Object bidid_ = "";
      /**
       * <pre>
       * Bidder generated response ID to assist with logging/tracking.
       * </pre>
       *
       * <code>optional string bidid = 3;</code>
       * @return Whether the bidid field is set.
       */
      public boolean hasBidid() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <pre>
       * Bidder generated response ID to assist with logging/tracking.
       * </pre>
       *
       * <code>optional string bidid = 3;</code>
       * @return The bidid.
       */
      public java.lang.String getBidid() {
        java.lang.Object ref = bidid_;
        if (!(ref instanceof java.lang.String)) {
          com.google.protobuf.ByteString bs =
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            bidid_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * Bidder generated response ID to assist with logging/tracking.
       * </pre>
       *
       * <code>optional string bidid = 3;</code>
       * @return The bytes for bidid.
       */
      public com.google.protobuf.ByteString
          getBididBytes() {
        java.lang.Object ref = bidid_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          bidid_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * Bidder generated response ID to assist with logging/tracking.
       * </pre>
       *
       * <code>optional string bidid = 3;</code>
       * @param value The bidid to set.
       * @return This builder for chaining.
       */
      public Builder setBidid(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        bidid_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Bidder generated response ID to assist with logging/tracking.
       * </pre>
       *
       * <code>optional string bidid = 3;</code>
       * @return This builder for chaining.
       */
      public Builder clearBidid() {
        bitField0_ = (bitField0_ & ~0x00000004);
        bidid_ = getDefaultInstance().getBidid();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Bidder generated response ID to assist with logging/tracking.
       * </pre>
       *
       * <code>optional string bidid = 3;</code>
       * @param value The bytes for bidid to set.
       * @return This builder for chaining.
       */
      public Builder setBididBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        bidid_ = value;
        onChanged();
        return this;
      }

      private java.lang.Object cur_ = "";
      /**
       * <pre>
       * Bid currency using ISO-4217 alpha codes.
       * </pre>
       *
       * <code>optional string cur = 4;</code>
       * @return Whether the cur field is set.
       */
      public boolean hasCur() {
        return ((bitField0_ & 0x00000008) != 0);
      }
      /**
       * <pre>
       * Bid currency using ISO-4217 alpha codes.
       * </pre>
       *
       * <code>optional string cur = 4;</code>
       * @return The cur.
       */
      public java.lang.String getCur() {
        java.lang.Object ref = cur_;
        if (!(ref instanceof java.lang.String)) {
          com.google.protobuf.ByteString bs =
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            cur_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * Bid currency using ISO-4217 alpha codes.
       * </pre>
       *
       * <code>optional string cur = 4;</code>
       * @return The bytes for cur.
       */
      public com.google.protobuf.ByteString
          getCurBytes() {
        java.lang.Object ref = cur_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          cur_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * Bid currency using ISO-4217 alpha codes.
       * </pre>
       *
       * <code>optional string cur = 4;</code>
       * @param value The cur to set.
       * @return This builder for chaining.
       */
      public Builder setCur(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
        cur_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Bid currency using ISO-4217 alpha codes.
       * </pre>
       *
       * <code>optional string cur = 4;</code>
       * @return This builder for chaining.
       */
      public Builder clearCur() {
        bitField0_ = (bitField0_ & ~0x00000008);
        cur_ = getDefaultInstance().getCur();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Bid currency using ISO-4217 alpha codes.
       * </pre>
       *
       * <code>optional string cur = 4;</code>
       * @param value The bytes for cur to set.
       * @return This builder for chaining.
       */
      public Builder setCurBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
        cur_ = value;
        onChanged();
        return this;
      }

      private java.lang.Object customdata_ = "";
      /**
       * <pre>
       * Optional feature to allow a bidder to set data in the exchange's cookie.
       * The string must be in base85 cookie safe characters and be in any format.
       * Proper JSON encoding must be used to include "escaped" quotation marks.
       * </pre>
       *
       * <code>optional string customdata = 5;</code>
       * @return Whether the customdata field is set.
       */
      public boolean hasCustomdata() {
        return ((bitField0_ & 0x00000010) != 0);
      }
      /**
       * <pre>
       * Optional feature to allow a bidder to set data in the exchange's cookie.
       * The string must be in base85 cookie safe characters and be in any format.
       * Proper JSON encoding must be used to include "escaped" quotation marks.
       * </pre>
       *
       * <code>optional string customdata = 5;</code>
       * @return The customdata.
       */
      public java.lang.String getCustomdata() {
        java.lang.Object ref = customdata_;
        if (!(ref instanceof java.lang.String)) {
          com.google.protobuf.ByteString bs =
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            customdata_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * Optional feature to allow a bidder to set data in the exchange's cookie.
       * The string must be in base85 cookie safe characters and be in any format.
       * Proper JSON encoding must be used to include "escaped" quotation marks.
       * </pre>
       *
       * <code>optional string customdata = 5;</code>
       * @return The bytes for customdata.
       */
      public com.google.protobuf.ByteString
          getCustomdataBytes() {
        java.lang.Object ref = customdata_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          customdata_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * Optional feature to allow a bidder to set data in the exchange's cookie.
       * The string must be in base85 cookie safe characters and be in any format.
       * Proper JSON encoding must be used to include "escaped" quotation marks.
       * </pre>
       *
       * <code>optional string customdata = 5;</code>
       * @param value The customdata to set.
       * @return This builder for chaining.
       */
      public Builder setCustomdata(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
        customdata_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Optional feature to allow a bidder to set data in the exchange's cookie.
       * The string must be in base85 cookie safe characters and be in any format.
       * Proper JSON encoding must be used to include "escaped" quotation marks.
       * </pre>
       *
       * <code>optional string customdata = 5;</code>
       * @return This builder for chaining.
       */
      public Builder clearCustomdata() {
        bitField0_ = (bitField0_ & ~0x00000010);
        customdata_ = getDefaultInstance().getCustomdata();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Optional feature to allow a bidder to set data in the exchange's cookie.
       * The string must be in base85 cookie safe characters and be in any format.
       * Proper JSON encoding must be used to include "escaped" quotation marks.
       * </pre>
       *
       * <code>optional string customdata = 5;</code>
       * @param value The bytes for customdata to set.
       * @return This builder for chaining.
       */
      public Builder setCustomdataBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000010;
        customdata_ = value;
        onChanged();
        return this;
      }

      private int nbr_ ;
      /**
       * <pre>
       * Reason for not bidding.
       * Refer to enum com.iabtechlab.openrtb.v3.NoBidReason for generic values.
       * </pre>
       *
       * <code>optional int32 nbr = 6;</code>
       * @return Whether the nbr field is set.
       */
      @java.lang.Override
      public boolean hasNbr() {
        return ((bitField0_ & 0x00000020) != 0);
      }
      /**
       * <pre>
       * Reason for not bidding.
       * Refer to enum com.iabtechlab.openrtb.v3.NoBidReason for generic values.
       * </pre>
       *
       * <code>optional int32 nbr = 6;</code>
       * @return The nbr.
       */
      @java.lang.Override
      public int getNbr() {
        return nbr_;
      }
      /**
       * <pre>
       * Reason for not bidding.
       * Refer to enum com.iabtechlab.openrtb.v3.NoBidReason for generic values.
       * </pre>
       *
       * <code>optional int32 nbr = 6;</code>
       * @param value The nbr to set.
       * @return This builder for chaining.
       */
      public Builder setNbr(int value) {
        bitField0_ |= 0x00000020;
        nbr_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Reason for not bidding.
       * Refer to enum com.iabtechlab.openrtb.v3.NoBidReason for generic values.
       * </pre>
       *
       * <code>optional int32 nbr = 6;</code>
       * @return This builder for chaining.
       */
      public Builder clearNbr() {
        bitField0_ = (bitField0_ & ~0x00000020);
        nbr_ = 0;
        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:com.iabtechlab.openrtb.v2.BidResponse)
    }

    // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.BidResponse)
    private static final com.iabtechlab.openrtb.v2.OpenRtb.BidResponse DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.BidResponse();
    }

    public static com.iabtechlab.openrtb.v2.OpenRtb.BidResponse getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    @java.lang.Deprecated public static final com.google.protobuf.Parser<BidResponse>
        PARSER = new com.google.protobuf.AbstractParser<BidResponse>() {
      @java.lang.Override
      public BidResponse parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new BidResponse(input, extensionRegistry);
      }
    };

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

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

    @java.lang.Override
    public com.iabtechlab.openrtb.v2.OpenRtb.BidResponse getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface NativeRequestOrBuilder extends
      // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.NativeRequest)
      com.google.protobuf.GeneratedMessageV3.
          ExtendableMessageOrBuilder<NativeRequest> {

    /**
     * <pre>
     * Version of the Native Markup version in use.
     * </pre>
     *
     * <code>optional string ver = 1;</code>
     * @return Whether the ver field is set.
     */
    boolean hasVer();
    /**
     * <pre>
     * Version of the Native Markup version in use.
     * </pre>
     *
     * <code>optional string ver = 1;</code>
     * @return The ver.
     */
    java.lang.String getVer();
    /**
     * <pre>
     * Version of the Native Markup version in use.
     * </pre>
     *
     * <code>optional string ver = 1;</code>
     * @return The bytes for ver.
     */
    com.google.protobuf.ByteString
        getVerBytes();

    /**
     * <pre>
     * The Layout ID of the native ad unit.
     * Refer to enum LayoutId for generic values.
     * RECOMMENDED by OpenRTB Native 1.0; optional in 1.1, DEPRECATED in 1.2.
     * </pre>
     *
     * <code>optional int32 layout = 2;</code>
     * @return Whether the layout field is set.
     */
    boolean hasLayout();
    /**
     * <pre>
     * The Layout ID of the native ad unit.
     * Refer to enum LayoutId for generic values.
     * RECOMMENDED by OpenRTB Native 1.0; optional in 1.1, DEPRECATED in 1.2.
     * </pre>
     *
     * <code>optional int32 layout = 2;</code>
     * @return The layout.
     */
    int getLayout();

    /**
     * <pre>
     * The Ad unit ID of the native ad unit.
     * This corresponds to one of IAB Core-6 native ad units.
     * Refer to enum AdUnitId for generic values.
     * RECOMMENDED by OpenRTB Native 1.0; optional in 1.1, DEPRECATED in 1.2.
     * </pre>
     *
     * <code>optional int32 adunit = 3;</code>
     * @return Whether the adunit field is set.
     */
    boolean hasAdunit();
    /**
     * <pre>
     * The Ad unit ID of the native ad unit.
     * This corresponds to one of IAB Core-6 native ad units.
     * Refer to enum AdUnitId for generic values.
     * RECOMMENDED by OpenRTB Native 1.0; optional in 1.1, DEPRECATED in 1.2.
     * </pre>
     *
     * <code>optional int32 adunit = 3;</code>
     * @return The adunit.
     */
    int getAdunit();

    /**
     * <pre>
     * The context in which the ad appears.
     * Refer to enum ContextType for generic values.
     * RECOMMENDED in 1.2.
     * </pre>
     *
     * <code>optional int32 context = 7;</code>
     * @return Whether the context field is set.
     */
    boolean hasContext();
    /**
     * <pre>
     * The context in which the ad appears.
     * Refer to enum ContextType for generic values.
     * RECOMMENDED in 1.2.
     * </pre>
     *
     * <code>optional int32 context = 7;</code>
     * @return The context.
     */
    int getContext();

    /**
     * <pre>
     * A more detailed context in which the ad appears.
     * Refer to enum com.iabtechlab.adcom.v1.enums.DisplayContextType for generic values.
     * </pre>
     *
     * <code>optional int32 contextsubtype = 8;</code>
     * @return Whether the contextsubtype field is set.
     */
    boolean hasContextsubtype();
    /**
     * <pre>
     * A more detailed context in which the ad appears.
     * Refer to enum com.iabtechlab.adcom.v1.enums.DisplayContextType for generic values.
     * </pre>
     *
     * <code>optional int32 contextsubtype = 8;</code>
     * @return The contextsubtype.
     */
    int getContextsubtype();

    /**
     * <pre>
     * The design/format/layout of the ad unit being offered.
     * Refer to enum com.iabtechlab.adcom.v1.enums.DisplayPlacementType for generic values.
     * RECOMMENDED by the OpenRTB Native specification.
     * </pre>
     *
     * <code>optional int32 plcmttype = 9;</code>
     * @return Whether the plcmttype field is set.
     */
    boolean hasPlcmttype();
    /**
     * <pre>
     * The design/format/layout of the ad unit being offered.
     * Refer to enum com.iabtechlab.adcom.v1.enums.DisplayPlacementType for generic values.
     * RECOMMENDED by the OpenRTB Native specification.
     * </pre>
     *
     * <code>optional int32 plcmttype = 9;</code>
     * @return The plcmttype.
     */
    int getPlcmttype();

    /**
     * <pre>
     * The number of identical placements in this Layout.
     * </pre>
     *
     * <code>optional int32 plcmtcnt = 4 [default = 1];</code>
     * @return Whether the plcmtcnt field is set.
     */
    boolean hasPlcmtcnt();
    /**
     * <pre>
     * The number of identical placements in this Layout.
     * </pre>
     *
     * <code>optional int32 plcmtcnt = 4 [default = 1];</code>
     * @return The plcmtcnt.
     */
    int getPlcmtcnt();

    /**
     * <pre>
     * 0 for the first ad, 1 for the second ad, and so on. Note this would
     * generally NOT be used in combination with plcmtcnt - either you are
     * auctioning multiple identical placements (in which case
     * plcmtcnt&gt;1, seq=0) or you are holding separate auctions for distinct
     * items in the feed (in which case plcmtcnt=1, seq&gt;=1).
     * </pre>
     *
     * <code>optional int32 seq = 5 [default = 0];</code>
     * @return Whether the seq field is set.
     */
    boolean hasSeq();
    /**
     * <pre>
     * 0 for the first ad, 1 for the second ad, and so on. Note this would
     * generally NOT be used in combination with plcmtcnt - either you are
     * auctioning multiple identical placements (in which case
     * plcmtcnt&gt;1, seq=0) or you are holding separate auctions for distinct
     * items in the feed (in which case plcmtcnt=1, seq&gt;=1).
     * </pre>
     *
     * <code>optional int32 seq = 5 [default = 0];</code>
     * @return The seq.
     */
    int getSeq();

    /**
     * <pre>
     * Any bid must comply with the array of elements expressed by the Exchange.
     * REQUIRED by the OpenRTB Native specification: at least 1 element.
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.Asset assets = 6;</code>
     */
    java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset> 
        getAssetsList();
    /**
     * <pre>
     * Any bid must comply with the array of elements expressed by the Exchange.
     * REQUIRED by the OpenRTB Native specification: at least 1 element.
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.Asset assets = 6;</code>
     */
    com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset getAssets(int index);
    /**
     * <pre>
     * Any bid must comply with the array of elements expressed by the Exchange.
     * REQUIRED by the OpenRTB Native specification: at least 1 element.
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.Asset assets = 6;</code>
     */
    int getAssetsCount();
    /**
     * <pre>
     * Any bid must comply with the array of elements expressed by the Exchange.
     * REQUIRED by the OpenRTB Native specification: at least 1 element.
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.Asset assets = 6;</code>
     */
    java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.AssetOrBuilder> 
        getAssetsOrBuilderList();
    /**
     * <pre>
     * Any bid must comply with the array of elements expressed by the Exchange.
     * REQUIRED by the OpenRTB Native specification: at least 1 element.
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.Asset assets = 6;</code>
     */
    com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.AssetOrBuilder getAssetsOrBuilder(
        int index);

    /**
     * <pre>
     * Whether the supply source / impression supports returning an assetsurl
     * instead of an asset object. 0 or the absence of the field indicates no such
     * support.
     * Implemented in 1.2
     * </pre>
     *
     * <code>optional bool aurlsupport = 11;</code>
     * @return Whether the aurlsupport field is set.
     */
    boolean hasAurlsupport();
    /**
     * <pre>
     * Whether the supply source / impression supports returning an assetsurl
     * instead of an asset object. 0 or the absence of the field indicates no such
     * support.
     * Implemented in 1.2
     * </pre>
     *
     * <code>optional bool aurlsupport = 11;</code>
     * @return The aurlsupport.
     */
    boolean getAurlsupport();

    /**
     * <pre>
     * Whether the supply source / impression supports returning a DCO URL
     * instead of an asset object. 0 or the absence of the field indicates no such
     * support.
     * Implemented in 1.2
     * Beta feature.
     * </pre>
     *
     * <code>optional bool durlsupport = 12;</code>
     * @return Whether the durlsupport field is set.
     */
    boolean hasDurlsupport();
    /**
     * <pre>
     * Whether the supply source / impression supports returning a DCO URL
     * instead of an asset object. 0 or the absence of the field indicates no such
     * support.
     * Implemented in 1.2
     * Beta feature.
     * </pre>
     *
     * <code>optional bool durlsupport = 12;</code>
     * @return The durlsupport.
     */
    boolean getDurlsupport();

    /**
     * <pre>
     * Specifies what type of event tracking is supported.
     * Implemented in 1.2
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.EventTrackers eventtrackers = 13;</code>
     */
    java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers> 
        getEventtrackersList();
    /**
     * <pre>
     * Specifies what type of event tracking is supported.
     * Implemented in 1.2
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.EventTrackers eventtrackers = 13;</code>
     */
    com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers getEventtrackers(int index);
    /**
     * <pre>
     * Specifies what type of event tracking is supported.
     * Implemented in 1.2
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.EventTrackers eventtrackers = 13;</code>
     */
    int getEventtrackersCount();
    /**
     * <pre>
     * Specifies what type of event tracking is supported.
     * Implemented in 1.2
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.EventTrackers eventtrackers = 13;</code>
     */
    java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackersOrBuilder> 
        getEventtrackersOrBuilderList();
    /**
     * <pre>
     * Specifies what type of event tracking is supported.
     * Implemented in 1.2
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.EventTrackers eventtrackers = 13;</code>
     */
    com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackersOrBuilder getEventtrackersOrBuilder(
        int index);

    /**
     * <pre>
     * Set to 1 when the native ad supports buyer-specific privacy notice.
     * Set to 0 (or field absent) when the native ad doesn't support custom
     * privacy links or if support is unknown.
     * RECOMMENDED and implemented in 1.2
     * </pre>
     *
     * <code>optional bool privacy = 14;</code>
     * @return Whether the privacy field is set.
     */
    boolean hasPrivacy();
    /**
     * <pre>
     * Set to 1 when the native ad supports buyer-specific privacy notice.
     * Set to 0 (or field absent) when the native ad doesn't support custom
     * privacy links or if support is unknown.
     * RECOMMENDED and implemented in 1.2
     * </pre>
     *
     * <code>optional bool privacy = 14;</code>
     * @return The privacy.
     */
    boolean getPrivacy();
  }
  /**
   * <pre>
   * OpenRTB Native 1.0: The Native Object defines the native advertising
   * opportunity available for bid via this bid request. It must be included
   * directly in the impression object if the impression offered for auction
   * is a native ad format.
   * Note: Prior to VERSION 1.1, the specification could be interpreted as
   * requiring the native request to have a root node with a single field "native"
   * that would contain the NativeRequest as its value.
   * In 1.2 The NativeRequest Object specified here is now the root object.
   * </pre>
   *
   * Protobuf type {@code com.iabtechlab.openrtb.v2.NativeRequest}
   */
  public static final class NativeRequest extends
      com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
        NativeRequest> implements
      // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.NativeRequest)
      NativeRequestOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use NativeRequest.newBuilder() to construct.
    private NativeRequest(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest, ?> builder) {
      super(builder);
    }
    private NativeRequest() {
      ver_ = "";
      plcmtcnt_ = 1;
      assets_ = java.util.Collections.emptyList();
      eventtrackers_ = java.util.Collections.emptyList();
    }

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

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    private NativeRequest(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      this();
      if (extensionRegistry == null) {
        throw new java.lang.NullPointerException();
      }
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            case 10: {
              com.google.protobuf.ByteString bs = input.readBytes();
              bitField0_ |= 0x00000001;
              ver_ = bs;
              break;
            }
            case 16: {
              bitField0_ |= 0x00000002;
              layout_ = input.readInt32();
              break;
            }
            case 24: {
              bitField0_ |= 0x00000004;
              adunit_ = input.readInt32();
              break;
            }
            case 32: {
              bitField0_ |= 0x00000040;
              plcmtcnt_ = input.readInt32();
              break;
            }
            case 40: {
              bitField0_ |= 0x00000080;
              seq_ = input.readInt32();
              break;
            }
            case 50: {
              if (!((mutable_bitField0_ & 0x00000100) != 0)) {
                assets_ = new java.util.ArrayList<com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset>();
                mutable_bitField0_ |= 0x00000100;
              }
              assets_.add(
                  input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.PARSER, extensionRegistry));
              break;
            }
            case 56: {
              bitField0_ |= 0x00000008;
              context_ = input.readInt32();
              break;
            }
            case 64: {
              bitField0_ |= 0x00000010;
              contextsubtype_ = input.readInt32();
              break;
            }
            case 72: {
              bitField0_ |= 0x00000020;
              plcmttype_ = input.readInt32();
              break;
            }
            case 88: {
              bitField0_ |= 0x00000100;
              aurlsupport_ = input.readBool();
              break;
            }
            case 96: {
              bitField0_ |= 0x00000200;
              durlsupport_ = input.readBool();
              break;
            }
            case 106: {
              if (!((mutable_bitField0_ & 0x00000800) != 0)) {
                eventtrackers_ = new java.util.ArrayList<com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers>();
                mutable_bitField0_ |= 0x00000800;
              }
              eventtrackers_.add(
                  input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers.PARSER, extensionRegistry));
              break;
            }
            case 112: {
              bitField0_ |= 0x00000400;
              privacy_ = input.readBool();
              break;
            }
            default: {
              if (!parseUnknownField(
                  input, unknownFields, extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e).setUnfinishedMessage(this);
      } finally {
        if (((mutable_bitField0_ & 0x00000100) != 0)) {
          assets_ = java.util.Collections.unmodifiableList(assets_);
        }
        if (((mutable_bitField0_ & 0x00000800) != 0)) {
          eventtrackers_ = java.util.Collections.unmodifiableList(eventtrackers_);
        }
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeRequest_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeRequest_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.class, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Builder.class);
    }

    public interface AssetOrBuilder extends
        // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.NativeRequest.Asset)
        com.google.protobuf.GeneratedMessageV3.
            ExtendableMessageOrBuilder<Asset> {

      /**
       * <pre>
       * Unique asset ID, assigned by exchange. Typically a counter for the array.
       * REQUIRED by the OpenRTB Native specification.
       * </pre>
       *
       * <code>required int32 id = 1;</code>
       * @return Whether the id field is set.
       */
      boolean hasId();
      /**
       * <pre>
       * Unique asset ID, assigned by exchange. Typically a counter for the array.
       * REQUIRED by the OpenRTB Native specification.
       * </pre>
       *
       * <code>required int32 id = 1;</code>
       * @return The id.
       */
      int getId();

      /**
       * <pre>
       * Set to true if asset is required
       * (exchange will not accept a bid without it).
       * </pre>
       *
       * <code>optional bool required = 2 [default = false];</code>
       * @return Whether the required field is set.
       */
      boolean hasRequired();
      /**
       * <pre>
       * Set to true if asset is required
       * (exchange will not accept a bid without it).
       * </pre>
       *
       * <code>optional bool required = 2 [default = false];</code>
       * @return The required.
       */
      boolean getRequired();

      /**
       * <pre>
       * Title object for title assets.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.NativeRequest.Asset.Title title = 3;</code>
       * @return Whether the title field is set.
       */
      boolean hasTitle();
      /**
       * <pre>
       * Title object for title assets.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.NativeRequest.Asset.Title title = 3;</code>
       * @return The title.
       */
      com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title getTitle();
      /**
       * <pre>
       * Title object for title assets.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.NativeRequest.Asset.Title title = 3;</code>
       */
      com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.TitleOrBuilder getTitleOrBuilder();

      /**
       * <pre>
       * Image object for image assets.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.NativeRequest.Asset.Image img = 4;</code>
       * @return Whether the img field is set.
       */
      boolean hasImg();
      /**
       * <pre>
       * Image object for image assets.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.NativeRequest.Asset.Image img = 4;</code>
       * @return The img.
       */
      com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image getImg();
      /**
       * <pre>
       * Image object for image assets.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.NativeRequest.Asset.Image img = 4;</code>
       */
      com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.ImageOrBuilder getImgOrBuilder();

      /**
       * <pre>
       * Video object for video assets.
       * Note that in-stream video ads are not part of Native.
       * Native ads may contain a video as the ad creative itself.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.BidRequest.Imp.Video video = 5;</code>
       * @return Whether the video field is set.
       */
      boolean hasVideo();
      /**
       * <pre>
       * Video object for video assets.
       * Note that in-stream video ads are not part of Native.
       * Native ads may contain a video as the ad creative itself.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.BidRequest.Imp.Video video = 5;</code>
       * @return The video.
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video getVideo();
      /**
       * <pre>
       * Video object for video assets.
       * Note that in-stream video ads are not part of Native.
       * Native ads may contain a video as the ad creative itself.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.BidRequest.Imp.Video video = 5;</code>
       */
      com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.VideoOrBuilder getVideoOrBuilder();

      /**
       * <pre>
       * Data object for brand name, description, ratings, prices etc.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.NativeRequest.Asset.Data data = 6;</code>
       * @return Whether the data field is set.
       */
      boolean hasData();
      /**
       * <pre>
       * Data object for brand name, description, ratings, prices etc.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.NativeRequest.Asset.Data data = 6;</code>
       * @return The data.
       */
      com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data getData();
      /**
       * <pre>
       * Data object for brand name, description, ratings, prices etc.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.NativeRequest.Asset.Data data = 6;</code>
       */
      com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.DataOrBuilder getDataOrBuilder();

      public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.AssetOneofCase getAssetOneofCase();
    }
    /**
     * <pre>
     * OpenRTB Native 1.0: The main container object for each asset requested or
     * supported by Exchange on behalf of the rendering client.
     * Any object that is required is to be flagged as such. Only one of the
     * {title,img,video,data} objects should be present in each object.
     * All others should be null/absent. The id is to be unique within the
     * Asset array so that the response can be aligned.
     * </pre>
     *
     * Protobuf type {@code com.iabtechlab.openrtb.v2.NativeRequest.Asset}
     */
    public static final class Asset extends
        com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
          Asset> implements
        // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.NativeRequest.Asset)
        AssetOrBuilder {
    private static final long serialVersionUID = 0L;
      // Use Asset.newBuilder() to construct.
      private Asset(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset, ?> builder) {
        super(builder);
      }
      private Asset() {
      }

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

      @java.lang.Override
      public final com.google.protobuf.UnknownFieldSet
      getUnknownFields() {
        return this.unknownFields;
      }
      private Asset(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        this();
        if (extensionRegistry == null) {
          throw new java.lang.NullPointerException();
        }
        int mutable_bitField0_ = 0;
        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
            com.google.protobuf.UnknownFieldSet.newBuilder();
        try {
          boolean done = false;
          while (!done) {
            int tag = input.readTag();
            switch (tag) {
              case 0:
                done = true;
                break;
              case 8: {
                bitField0_ |= 0x00000001;
                id_ = input.readInt32();
                break;
              }
              case 16: {
                bitField0_ |= 0x00000002;
                required_ = input.readBool();
                break;
              }
              case 26: {
                com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title.Builder subBuilder = null;
                if (assetOneofCase_ == 3) {
                  subBuilder = ((com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title) assetOneof_).toBuilder();
                }
                assetOneof_ =
                    input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title.PARSER, extensionRegistry);
                if (subBuilder != null) {
                  subBuilder.mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title) assetOneof_);
                  assetOneof_ = subBuilder.buildPartial();
                }
                assetOneofCase_ = 3;
                break;
              }
              case 34: {
                com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image.Builder subBuilder = null;
                if (assetOneofCase_ == 4) {
                  subBuilder = ((com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image) assetOneof_).toBuilder();
                }
                assetOneof_ =
                    input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image.PARSER, extensionRegistry);
                if (subBuilder != null) {
                  subBuilder.mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image) assetOneof_);
                  assetOneof_ = subBuilder.buildPartial();
                }
                assetOneofCase_ = 4;
                break;
              }
              case 42: {
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.Builder subBuilder = null;
                if (assetOneofCase_ == 5) {
                  subBuilder = ((com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video) assetOneof_).toBuilder();
                }
                assetOneof_ =
                    input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.PARSER, extensionRegistry);
                if (subBuilder != null) {
                  subBuilder.mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video) assetOneof_);
                  assetOneof_ = subBuilder.buildPartial();
                }
                assetOneofCase_ = 5;
                break;
              }
              case 50: {
                com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data.Builder subBuilder = null;
                if (assetOneofCase_ == 6) {
                  subBuilder = ((com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data) assetOneof_).toBuilder();
                }
                assetOneof_ =
                    input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data.PARSER, extensionRegistry);
                if (subBuilder != null) {
                  subBuilder.mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data) assetOneof_);
                  assetOneof_ = subBuilder.buildPartial();
                }
                assetOneofCase_ = 6;
                break;
              }
              default: {
                if (!parseUnknownField(
                    input, unknownFields, extensionRegistry, tag)) {
                  done = true;
                }
                break;
              }
            }
          }
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          throw e.setUnfinishedMessage(this);
        } catch (java.io.IOException e) {
          throw new com.google.protobuf.InvalidProtocolBufferException(
              e).setUnfinishedMessage(this);
        } finally {
          this.unknownFields = unknownFields.build();
          makeExtensionsImmutable();
        }
      }
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeRequest_Asset_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeRequest_Asset_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.class, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Builder.class);
      }

      public interface TitleOrBuilder extends
          // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.NativeRequest.Asset.Title)
          com.google.protobuf.GeneratedMessageV3.
              ExtendableMessageOrBuilder<Title> {

        /**
         * <pre>
         * Maximum length of the text in the title element.
         * RECOMMENDED that the value be either of: 25, 90, 140.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>required int32 len = 1;</code>
         * @return Whether the len field is set.
         */
        boolean hasLen();
        /**
         * <pre>
         * Maximum length of the text in the title element.
         * RECOMMENDED that the value be either of: 25, 90, 140.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>required int32 len = 1;</code>
         * @return The len.
         */
        int getLen();
      }
      /**
       * <pre>
       * OpenRTB Native 1.0: The Title object is to be used for title element
       * of the Native ad.
       * </pre>
       *
       * Protobuf type {@code com.iabtechlab.openrtb.v2.NativeRequest.Asset.Title}
       */
      public static final class Title extends
          com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
            Title> implements
          // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.NativeRequest.Asset.Title)
          TitleOrBuilder {
      private static final long serialVersionUID = 0L;
        // Use Title.newBuilder() to construct.
        private Title(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title, ?> builder) {
          super(builder);
        }
        private Title() {
        }

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

        @java.lang.Override
        public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
          return this.unknownFields;
        }
        private Title(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          this();
          if (extensionRegistry == null) {
            throw new java.lang.NullPointerException();
          }
          int mutable_bitField0_ = 0;
          com.google.protobuf.UnknownFieldSet.Builder unknownFields =
              com.google.protobuf.UnknownFieldSet.newBuilder();
          try {
            boolean done = false;
            while (!done) {
              int tag = input.readTag();
              switch (tag) {
                case 0:
                  done = true;
                  break;
                case 8: {
                  bitField0_ |= 0x00000001;
                  len_ = input.readInt32();
                  break;
                }
                default: {
                  if (!parseUnknownField(
                      input, unknownFields, extensionRegistry, tag)) {
                    done = true;
                  }
                  break;
                }
              }
            }
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            throw e.setUnfinishedMessage(this);
          } catch (java.io.IOException e) {
            throw new com.google.protobuf.InvalidProtocolBufferException(
                e).setUnfinishedMessage(this);
          } finally {
            this.unknownFields = unknownFields.build();
            makeExtensionsImmutable();
          }
        }
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeRequest_Asset_Title_descriptor;
        }

        @java.lang.Override
        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeRequest_Asset_Title_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title.class, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title.Builder.class);
        }

        private int bitField0_;
        public static final int LEN_FIELD_NUMBER = 1;
        private int len_;
        /**
         * <pre>
         * Maximum length of the text in the title element.
         * RECOMMENDED that the value be either of: 25, 90, 140.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>required int32 len = 1;</code>
         * @return Whether the len field is set.
         */
        @java.lang.Override
        public boolean hasLen() {
          return ((bitField0_ & 0x00000001) != 0);
        }
        /**
         * <pre>
         * Maximum length of the text in the title element.
         * RECOMMENDED that the value be either of: 25, 90, 140.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>required int32 len = 1;</code>
         * @return The len.
         */
        @java.lang.Override
        public int getLen() {
          return len_;
        }

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

          if (!hasLen()) {
            memoizedIsInitialized = 0;
            return false;
          }
          if (!extensionsAreInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
          memoizedIsInitialized = 1;
          return true;
        }

        @java.lang.Override
        public void writeTo(com.google.protobuf.CodedOutputStream output)
                            throws java.io.IOException {
          com.google.protobuf.GeneratedMessageV3
            .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title>.ExtensionWriter
              extensionWriter = newExtensionWriter();
          if (((bitField0_ & 0x00000001) != 0)) {
            output.writeInt32(1, len_);
          }
          extensionWriter.writeUntil(10000, output);
          unknownFields.writeTo(output);
        }

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

          size = 0;
          if (((bitField0_ & 0x00000001) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(1, len_);
          }
          size += extensionsSerializedSize();
          size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title)) {
            return super.equals(obj);
          }
          com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title other = (com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title) obj;

          if (hasLen() != other.hasLen()) return false;
          if (hasLen()) {
            if (getLen()
                != other.getLen()) return false;
          }
          if (!unknownFields.equals(other.unknownFields)) return false;
          if (!getExtensionFields().equals(other.getExtensionFields()))
            return false;
          return true;
        }

        @java.lang.Override
        public int hashCode() {
          if (memoizedHashCode != 0) {
            return memoizedHashCode;
          }
          int hash = 41;
          hash = (19 * hash) + getDescriptor().hashCode();
          if (hasLen()) {
            hash = (37 * hash) + LEN_FIELD_NUMBER;
            hash = (53 * hash) + getLen();
          }
          hash = hashFields(hash, getExtensionFields());
          hash = (29 * hash) + unknownFields.hashCode();
          memoizedHashCode = hash;
          return hash;
        }

        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title parseFrom(
            java.nio.ByteBuffer data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title parseFrom(
            java.nio.ByteBuffer data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title parseFrom(
            com.google.protobuf.ByteString data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title parseFrom(
            com.google.protobuf.ByteString data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title parseFrom(byte[] data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title parseFrom(
            byte[] data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title parseFrom(java.io.InputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title 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.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title parseDelimitedFrom(java.io.InputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseDelimitedWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title 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.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title parseFrom(
            com.google.protobuf.CodedInputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title 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.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title 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>
         * OpenRTB Native 1.0: The Title object is to be used for title element
         * of the Native ad.
         * </pre>
         *
         * Protobuf type {@code com.iabtechlab.openrtb.v2.NativeRequest.Asset.Title}
         */
        public static final class Builder extends
            com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
              com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title, Builder> implements
            // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.NativeRequest.Asset.Title)
            com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.TitleOrBuilder {
          public static final com.google.protobuf.Descriptors.Descriptor
              getDescriptor() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeRequest_Asset_Title_descriptor;
          }

          @java.lang.Override
          protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
              internalGetFieldAccessorTable() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeRequest_Asset_Title_fieldAccessorTable
                .ensureFieldAccessorsInitialized(
                    com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title.class, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title.Builder.class);
          }

          // Construct using com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title.newBuilder()
          private Builder() {
            maybeForceBuilderInitialization();
          }

          private Builder(
              com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
            super(parent);
            maybeForceBuilderInitialization();
          }
          private void maybeForceBuilderInitialization() {
            if (com.google.protobuf.GeneratedMessageV3
                    .alwaysUseFieldBuilders) {
            }
          }
          @java.lang.Override
          public Builder clear() {
            super.clear();
            len_ = 0;
            bitField0_ = (bitField0_ & ~0x00000001);
            return this;
          }

          @java.lang.Override
          public com.google.protobuf.Descriptors.Descriptor
              getDescriptorForType() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeRequest_Asset_Title_descriptor;
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title getDefaultInstanceForType() {
            return com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title.getDefaultInstance();
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title build() {
            com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title result = buildPartial();
            if (!result.isInitialized()) {
              throw newUninitializedMessageException(result);
            }
            return result;
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title buildPartial() {
            com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title result = new com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title(this);
            int from_bitField0_ = bitField0_;
            int to_bitField0_ = 0;
            if (((from_bitField0_ & 0x00000001) != 0)) {
              result.len_ = len_;
              to_bitField0_ |= 0x00000001;
            }
            result.bitField0_ = to_bitField0_;
            onBuilt();
            return result;
          }

          @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 <Type> Builder setExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title, Type> extension,
              Type value) {
            return super.setExtension(extension, value);
          }
          @java.lang.Override
          public <Type> Builder setExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title, java.util.List<Type>> extension,
              int index, Type value) {
            return super.setExtension(extension, index, value);
          }
          @java.lang.Override
          public <Type> Builder addExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title, java.util.List<Type>> extension,
              Type value) {
            return super.addExtension(extension, value);
          }
          @java.lang.Override
          public <Type> Builder clearExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title, ?> extension) {
            return super.clearExtension(extension);
          }
          @java.lang.Override
          public Builder mergeFrom(com.google.protobuf.Message other) {
            if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title) {
              return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title)other);
            } else {
              super.mergeFrom(other);
              return this;
            }
          }

          public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title other) {
            if (other == com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title.getDefaultInstance()) return this;
            if (other.hasLen()) {
              setLen(other.getLen());
            }
            this.mergeExtensionFields(other);
            this.mergeUnknownFields(other.unknownFields);
            onChanged();
            return this;
          }

          @java.lang.Override
          public final boolean isInitialized() {
            if (!hasLen()) {
              return false;
            }
            if (!extensionsAreInitialized()) {
              return false;
            }
            return true;
          }

          @java.lang.Override
          public Builder mergeFrom(
              com.google.protobuf.CodedInputStream input,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title parsedMessage = null;
            try {
              parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
              parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title) e.getUnfinishedMessage();
              throw e.unwrapIOException();
            } finally {
              if (parsedMessage != null) {
                mergeFrom(parsedMessage);
              }
            }
            return this;
          }
          private int bitField0_;

          private int len_ ;
          /**
           * <pre>
           * Maximum length of the text in the title element.
           * RECOMMENDED that the value be either of: 25, 90, 140.
           * REQUIRED by the OpenRTB Native specification.
           * </pre>
           *
           * <code>required int32 len = 1;</code>
           * @return Whether the len field is set.
           */
          @java.lang.Override
          public boolean hasLen() {
            return ((bitField0_ & 0x00000001) != 0);
          }
          /**
           * <pre>
           * Maximum length of the text in the title element.
           * RECOMMENDED that the value be either of: 25, 90, 140.
           * REQUIRED by the OpenRTB Native specification.
           * </pre>
           *
           * <code>required int32 len = 1;</code>
           * @return The len.
           */
          @java.lang.Override
          public int getLen() {
            return len_;
          }
          /**
           * <pre>
           * Maximum length of the text in the title element.
           * RECOMMENDED that the value be either of: 25, 90, 140.
           * REQUIRED by the OpenRTB Native specification.
           * </pre>
           *
           * <code>required int32 len = 1;</code>
           * @param value The len to set.
           * @return This builder for chaining.
           */
          public Builder setLen(int value) {
            bitField0_ |= 0x00000001;
            len_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Maximum length of the text in the title element.
           * RECOMMENDED that the value be either of: 25, 90, 140.
           * REQUIRED by the OpenRTB Native specification.
           * </pre>
           *
           * <code>required int32 len = 1;</code>
           * @return This builder for chaining.
           */
          public Builder clearLen() {
            bitField0_ = (bitField0_ & ~0x00000001);
            len_ = 0;
            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:com.iabtechlab.openrtb.v2.NativeRequest.Asset.Title)
        }

        // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.NativeRequest.Asset.Title)
        private static final com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title DEFAULT_INSTANCE;
        static {
          DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title();
        }

        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title getDefaultInstance() {
          return DEFAULT_INSTANCE;
        }

        @java.lang.Deprecated public static final com.google.protobuf.Parser<Title>
            PARSER = new com.google.protobuf.AbstractParser<Title>() {
          @java.lang.Override
          public Title parsePartialFrom(
              com.google.protobuf.CodedInputStream input,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.protobuf.InvalidProtocolBufferException {
            return new Title(input, extensionRegistry);
          }
        };

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

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

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title getDefaultInstanceForType() {
          return DEFAULT_INSTANCE;
        }

      }

      public interface ImageOrBuilder extends
          // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.NativeRequest.Asset.Image)
          com.google.protobuf.GeneratedMessageV3.
              ExtendableMessageOrBuilder<Image> {

        /**
         * <pre>
         * Type ID of the image element supported by the publisher.
         * The publisher can display this information in an appropriate format.
         * Refer to enum com.iabtechlab.adcom.v1.NativeImageAssetType for generic values.
         * </pre>
         *
         * <code>optional int32 type = 1;</code>
         * @return Whether the type field is set.
         */
        boolean hasType();
        /**
         * <pre>
         * Type ID of the image element supported by the publisher.
         * The publisher can display this information in an appropriate format.
         * Refer to enum com.iabtechlab.adcom.v1.NativeImageAssetType for generic values.
         * </pre>
         *
         * <code>optional int32 type = 1;</code>
         * @return The type.
         */
        int getType();

        /**
         * <pre>
         * Width of the image in pixels.
         * </pre>
         *
         * <code>optional int32 w = 2;</code>
         * @return Whether the w field is set.
         */
        boolean hasW();
        /**
         * <pre>
         * Width of the image in pixels.
         * </pre>
         *
         * <code>optional int32 w = 2;</code>
         * @return The w.
         */
        int getW();

        /**
         * <pre>
         * Height of the image in pixels.
         * </pre>
         *
         * <code>optional int32 h = 3;</code>
         * @return Whether the h field is set.
         */
        boolean hasH();
        /**
         * <pre>
         * Height of the image in pixels.
         * </pre>
         *
         * <code>optional int32 h = 3;</code>
         * @return The h.
         */
        int getH();

        /**
         * <pre>
         * The minimum requested width of the image in pixels. This option should
         * be used for any rescaling of images by the client. Either w or wmin
         * should be transmitted. If only w is included, it should be considered
         * an exact requirement.
         * RECOMMENDED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>optional int32 wmin = 4;</code>
         * @return Whether the wmin field is set.
         */
        boolean hasWmin();
        /**
         * <pre>
         * The minimum requested width of the image in pixels. This option should
         * be used for any rescaling of images by the client. Either w or wmin
         * should be transmitted. If only w is included, it should be considered
         * an exact requirement.
         * RECOMMENDED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>optional int32 wmin = 4;</code>
         * @return The wmin.
         */
        int getWmin();

        /**
         * <pre>
         * The minimum requested height of the image in pixels. This option should
         * be used for any rescaling of images by the client. Either h or hmin
         * should be transmitted. If only h is included, it should be considered
         * an exact requirement.
         * RECOMMENDED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>optional int32 hmin = 5;</code>
         * @return Whether the hmin field is set.
         */
        boolean hasHmin();
        /**
         * <pre>
         * The minimum requested height of the image in pixels. This option should
         * be used for any rescaling of images by the client. Either h or hmin
         * should be transmitted. If only h is included, it should be considered
         * an exact requirement.
         * RECOMMENDED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>optional int32 hmin = 5;</code>
         * @return The hmin.
         */
        int getHmin();

        /**
         * <pre>
         * Whitelist of content MIME types supported. Popular MIME types include,
         * but are not limited to "image/jpg" and "image/gif". Each implementing
         * Exchange should have their own list of supported types in the
         * integration docs. See Wikipedia's MIME page for more information and
         * links to all IETF RFCs. If blank, assume all types are allowed.
         * </pre>
         *
         * <code>repeated string mimes = 6;</code>
         * @return A list containing the mimes.
         */
        java.util.List<java.lang.String>
            getMimesList();
        /**
         * <pre>
         * Whitelist of content MIME types supported. Popular MIME types include,
         * but are not limited to "image/jpg" and "image/gif". Each implementing
         * Exchange should have their own list of supported types in the
         * integration docs. See Wikipedia's MIME page for more information and
         * links to all IETF RFCs. If blank, assume all types are allowed.
         * </pre>
         *
         * <code>repeated string mimes = 6;</code>
         * @return The count of mimes.
         */
        int getMimesCount();
        /**
         * <pre>
         * Whitelist of content MIME types supported. Popular MIME types include,
         * but are not limited to "image/jpg" and "image/gif". Each implementing
         * Exchange should have their own list of supported types in the
         * integration docs. See Wikipedia's MIME page for more information and
         * links to all IETF RFCs. If blank, assume all types are allowed.
         * </pre>
         *
         * <code>repeated string mimes = 6;</code>
         * @param index The index of the element to return.
         * @return The mimes at the given index.
         */
        java.lang.String getMimes(int index);
        /**
         * <pre>
         * Whitelist of content MIME types supported. Popular MIME types include,
         * but are not limited to "image/jpg" and "image/gif". Each implementing
         * Exchange should have their own list of supported types in the
         * integration docs. See Wikipedia's MIME page for more information and
         * links to all IETF RFCs. If blank, assume all types are allowed.
         * </pre>
         *
         * <code>repeated string mimes = 6;</code>
         * @param index The index of the value to return.
         * @return The bytes of the mimes at the given index.
         */
        com.google.protobuf.ByteString
            getMimesBytes(int index);
      }
      /**
       * <pre>
       * OpenRTB Native 1.0: The Image object to be used for all image elements
       * of the Native ad such as Icons, Main Image, etc.
       * RECOMMENDED sizes and aspect ratios are included in com.iabtechlab.adcom.v1.NativeImageAssetType.
       * </pre>
       *
       * Protobuf type {@code com.iabtechlab.openrtb.v2.NativeRequest.Asset.Image}
       */
      public static final class Image extends
          com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
            Image> implements
          // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.NativeRequest.Asset.Image)
          ImageOrBuilder {
      private static final long serialVersionUID = 0L;
        // Use Image.newBuilder() to construct.
        private Image(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image, ?> builder) {
          super(builder);
        }
        private Image() {
          mimes_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        }

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

        @java.lang.Override
        public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
          return this.unknownFields;
        }
        private Image(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          this();
          if (extensionRegistry == null) {
            throw new java.lang.NullPointerException();
          }
          int mutable_bitField0_ = 0;
          com.google.protobuf.UnknownFieldSet.Builder unknownFields =
              com.google.protobuf.UnknownFieldSet.newBuilder();
          try {
            boolean done = false;
            while (!done) {
              int tag = input.readTag();
              switch (tag) {
                case 0:
                  done = true;
                  break;
                case 8: {
                  bitField0_ |= 0x00000001;
                  type_ = input.readInt32();
                  break;
                }
                case 16: {
                  bitField0_ |= 0x00000002;
                  w_ = input.readInt32();
                  break;
                }
                case 24: {
                  bitField0_ |= 0x00000004;
                  h_ = input.readInt32();
                  break;
                }
                case 32: {
                  bitField0_ |= 0x00000008;
                  wmin_ = input.readInt32();
                  break;
                }
                case 40: {
                  bitField0_ |= 0x00000010;
                  hmin_ = input.readInt32();
                  break;
                }
                case 50: {
                  com.google.protobuf.ByteString bs = input.readBytes();
                  if (!((mutable_bitField0_ & 0x00000020) != 0)) {
                    mimes_ = new com.google.protobuf.LazyStringArrayList();
                    mutable_bitField0_ |= 0x00000020;
                  }
                  mimes_.add(bs);
                  break;
                }
                default: {
                  if (!parseUnknownField(
                      input, unknownFields, extensionRegistry, tag)) {
                    done = true;
                  }
                  break;
                }
              }
            }
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            throw e.setUnfinishedMessage(this);
          } catch (java.io.IOException e) {
            throw new com.google.protobuf.InvalidProtocolBufferException(
                e).setUnfinishedMessage(this);
          } finally {
            if (((mutable_bitField0_ & 0x00000020) != 0)) {
              mimes_ = mimes_.getUnmodifiableView();
            }
            this.unknownFields = unknownFields.build();
            makeExtensionsImmutable();
          }
        }
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeRequest_Asset_Image_descriptor;
        }

        @java.lang.Override
        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeRequest_Asset_Image_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image.class, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image.Builder.class);
        }

        private int bitField0_;
        public static final int TYPE_FIELD_NUMBER = 1;
        private int type_;
        /**
         * <pre>
         * Type ID of the image element supported by the publisher.
         * The publisher can display this information in an appropriate format.
         * Refer to enum com.iabtechlab.adcom.v1.NativeImageAssetType for generic values.
         * </pre>
         *
         * <code>optional int32 type = 1;</code>
         * @return Whether the type field is set.
         */
        @java.lang.Override
        public boolean hasType() {
          return ((bitField0_ & 0x00000001) != 0);
        }
        /**
         * <pre>
         * Type ID of the image element supported by the publisher.
         * The publisher can display this information in an appropriate format.
         * Refer to enum com.iabtechlab.adcom.v1.NativeImageAssetType for generic values.
         * </pre>
         *
         * <code>optional int32 type = 1;</code>
         * @return The type.
         */
        @java.lang.Override
        public int getType() {
          return type_;
        }

        public static final int W_FIELD_NUMBER = 2;
        private int w_;
        /**
         * <pre>
         * Width of the image in pixels.
         * </pre>
         *
         * <code>optional int32 w = 2;</code>
         * @return Whether the w field is set.
         */
        @java.lang.Override
        public boolean hasW() {
          return ((bitField0_ & 0x00000002) != 0);
        }
        /**
         * <pre>
         * Width of the image in pixels.
         * </pre>
         *
         * <code>optional int32 w = 2;</code>
         * @return The w.
         */
        @java.lang.Override
        public int getW() {
          return w_;
        }

        public static final int H_FIELD_NUMBER = 3;
        private int h_;
        /**
         * <pre>
         * Height of the image in pixels.
         * </pre>
         *
         * <code>optional int32 h = 3;</code>
         * @return Whether the h field is set.
         */
        @java.lang.Override
        public boolean hasH() {
          return ((bitField0_ & 0x00000004) != 0);
        }
        /**
         * <pre>
         * Height of the image in pixels.
         * </pre>
         *
         * <code>optional int32 h = 3;</code>
         * @return The h.
         */
        @java.lang.Override
        public int getH() {
          return h_;
        }

        public static final int WMIN_FIELD_NUMBER = 4;
        private int wmin_;
        /**
         * <pre>
         * The minimum requested width of the image in pixels. This option should
         * be used for any rescaling of images by the client. Either w or wmin
         * should be transmitted. If only w is included, it should be considered
         * an exact requirement.
         * RECOMMENDED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>optional int32 wmin = 4;</code>
         * @return Whether the wmin field is set.
         */
        @java.lang.Override
        public boolean hasWmin() {
          return ((bitField0_ & 0x00000008) != 0);
        }
        /**
         * <pre>
         * The minimum requested width of the image in pixels. This option should
         * be used for any rescaling of images by the client. Either w or wmin
         * should be transmitted. If only w is included, it should be considered
         * an exact requirement.
         * RECOMMENDED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>optional int32 wmin = 4;</code>
         * @return The wmin.
         */
        @java.lang.Override
        public int getWmin() {
          return wmin_;
        }

        public static final int HMIN_FIELD_NUMBER = 5;
        private int hmin_;
        /**
         * <pre>
         * The minimum requested height of the image in pixels. This option should
         * be used for any rescaling of images by the client. Either h or hmin
         * should be transmitted. If only h is included, it should be considered
         * an exact requirement.
         * RECOMMENDED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>optional int32 hmin = 5;</code>
         * @return Whether the hmin field is set.
         */
        @java.lang.Override
        public boolean hasHmin() {
          return ((bitField0_ & 0x00000010) != 0);
        }
        /**
         * <pre>
         * The minimum requested height of the image in pixels. This option should
         * be used for any rescaling of images by the client. Either h or hmin
         * should be transmitted. If only h is included, it should be considered
         * an exact requirement.
         * RECOMMENDED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>optional int32 hmin = 5;</code>
         * @return The hmin.
         */
        @java.lang.Override
        public int getHmin() {
          return hmin_;
        }

        public static final int MIMES_FIELD_NUMBER = 6;
        private com.google.protobuf.LazyStringList mimes_;
        /**
         * <pre>
         * Whitelist of content MIME types supported. Popular MIME types include,
         * but are not limited to "image/jpg" and "image/gif". Each implementing
         * Exchange should have their own list of supported types in the
         * integration docs. See Wikipedia's MIME page for more information and
         * links to all IETF RFCs. If blank, assume all types are allowed.
         * </pre>
         *
         * <code>repeated string mimes = 6;</code>
         * @return A list containing the mimes.
         */
        public com.google.protobuf.ProtocolStringList
            getMimesList() {
          return mimes_;
        }
        /**
         * <pre>
         * Whitelist of content MIME types supported. Popular MIME types include,
         * but are not limited to "image/jpg" and "image/gif". Each implementing
         * Exchange should have their own list of supported types in the
         * integration docs. See Wikipedia's MIME page for more information and
         * links to all IETF RFCs. If blank, assume all types are allowed.
         * </pre>
         *
         * <code>repeated string mimes = 6;</code>
         * @return The count of mimes.
         */
        public int getMimesCount() {
          return mimes_.size();
        }
        /**
         * <pre>
         * Whitelist of content MIME types supported. Popular MIME types include,
         * but are not limited to "image/jpg" and "image/gif". Each implementing
         * Exchange should have their own list of supported types in the
         * integration docs. See Wikipedia's MIME page for more information and
         * links to all IETF RFCs. If blank, assume all types are allowed.
         * </pre>
         *
         * <code>repeated string mimes = 6;</code>
         * @param index The index of the element to return.
         * @return The mimes at the given index.
         */
        public java.lang.String getMimes(int index) {
          return mimes_.get(index);
        }
        /**
         * <pre>
         * Whitelist of content MIME types supported. Popular MIME types include,
         * but are not limited to "image/jpg" and "image/gif". Each implementing
         * Exchange should have their own list of supported types in the
         * integration docs. See Wikipedia's MIME page for more information and
         * links to all IETF RFCs. If blank, assume all types are allowed.
         * </pre>
         *
         * <code>repeated string mimes = 6;</code>
         * @param index The index of the value to return.
         * @return The bytes of the mimes at the given index.
         */
        public com.google.protobuf.ByteString
            getMimesBytes(int index) {
          return mimes_.getByteString(index);
        }

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

          if (!extensionsAreInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
          memoizedIsInitialized = 1;
          return true;
        }

        @java.lang.Override
        public void writeTo(com.google.protobuf.CodedOutputStream output)
                            throws java.io.IOException {
          com.google.protobuf.GeneratedMessageV3
            .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image>.ExtensionWriter
              extensionWriter = newExtensionWriter();
          if (((bitField0_ & 0x00000001) != 0)) {
            output.writeInt32(1, type_);
          }
          if (((bitField0_ & 0x00000002) != 0)) {
            output.writeInt32(2, w_);
          }
          if (((bitField0_ & 0x00000004) != 0)) {
            output.writeInt32(3, h_);
          }
          if (((bitField0_ & 0x00000008) != 0)) {
            output.writeInt32(4, wmin_);
          }
          if (((bitField0_ & 0x00000010) != 0)) {
            output.writeInt32(5, hmin_);
          }
          for (int i = 0; i < mimes_.size(); i++) {
            com.google.protobuf.GeneratedMessageV3.writeString(output, 6, mimes_.getRaw(i));
          }
          extensionWriter.writeUntil(10000, output);
          unknownFields.writeTo(output);
        }

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

          size = 0;
          if (((bitField0_ & 0x00000001) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(1, type_);
          }
          if (((bitField0_ & 0x00000002) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(2, w_);
          }
          if (((bitField0_ & 0x00000004) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(3, h_);
          }
          if (((bitField0_ & 0x00000008) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(4, wmin_);
          }
          if (((bitField0_ & 0x00000010) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(5, hmin_);
          }
          {
            int dataSize = 0;
            for (int i = 0; i < mimes_.size(); i++) {
              dataSize += computeStringSizeNoTag(mimes_.getRaw(i));
            }
            size += dataSize;
            size += 1 * getMimesList().size();
          }
          size += extensionsSerializedSize();
          size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image)) {
            return super.equals(obj);
          }
          com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image other = (com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image) obj;

          if (hasType() != other.hasType()) return false;
          if (hasType()) {
            if (getType()
                != other.getType()) return false;
          }
          if (hasW() != other.hasW()) return false;
          if (hasW()) {
            if (getW()
                != other.getW()) return false;
          }
          if (hasH() != other.hasH()) return false;
          if (hasH()) {
            if (getH()
                != other.getH()) return false;
          }
          if (hasWmin() != other.hasWmin()) return false;
          if (hasWmin()) {
            if (getWmin()
                != other.getWmin()) return false;
          }
          if (hasHmin() != other.hasHmin()) return false;
          if (hasHmin()) {
            if (getHmin()
                != other.getHmin()) return false;
          }
          if (!getMimesList()
              .equals(other.getMimesList())) return false;
          if (!unknownFields.equals(other.unknownFields)) return false;
          if (!getExtensionFields().equals(other.getExtensionFields()))
            return false;
          return true;
        }

        @java.lang.Override
        public int hashCode() {
          if (memoizedHashCode != 0) {
            return memoizedHashCode;
          }
          int hash = 41;
          hash = (19 * hash) + getDescriptor().hashCode();
          if (hasType()) {
            hash = (37 * hash) + TYPE_FIELD_NUMBER;
            hash = (53 * hash) + getType();
          }
          if (hasW()) {
            hash = (37 * hash) + W_FIELD_NUMBER;
            hash = (53 * hash) + getW();
          }
          if (hasH()) {
            hash = (37 * hash) + H_FIELD_NUMBER;
            hash = (53 * hash) + getH();
          }
          if (hasWmin()) {
            hash = (37 * hash) + WMIN_FIELD_NUMBER;
            hash = (53 * hash) + getWmin();
          }
          if (hasHmin()) {
            hash = (37 * hash) + HMIN_FIELD_NUMBER;
            hash = (53 * hash) + getHmin();
          }
          if (getMimesCount() > 0) {
            hash = (37 * hash) + MIMES_FIELD_NUMBER;
            hash = (53 * hash) + getMimesList().hashCode();
          }
          hash = hashFields(hash, getExtensionFields());
          hash = (29 * hash) + unknownFields.hashCode();
          memoizedHashCode = hash;
          return hash;
        }

        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image parseFrom(
            java.nio.ByteBuffer data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image parseFrom(
            java.nio.ByteBuffer data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image parseFrom(
            com.google.protobuf.ByteString data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image parseFrom(
            com.google.protobuf.ByteString data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image parseFrom(byte[] data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image parseFrom(
            byte[] data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image parseFrom(java.io.InputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image 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.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image parseDelimitedFrom(java.io.InputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseDelimitedWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image 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.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image parseFrom(
            com.google.protobuf.CodedInputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image 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.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image 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>
         * OpenRTB Native 1.0: The Image object to be used for all image elements
         * of the Native ad such as Icons, Main Image, etc.
         * RECOMMENDED sizes and aspect ratios are included in com.iabtechlab.adcom.v1.NativeImageAssetType.
         * </pre>
         *
         * Protobuf type {@code com.iabtechlab.openrtb.v2.NativeRequest.Asset.Image}
         */
        public static final class Builder extends
            com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
              com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image, Builder> implements
            // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.NativeRequest.Asset.Image)
            com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.ImageOrBuilder {
          public static final com.google.protobuf.Descriptors.Descriptor
              getDescriptor() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeRequest_Asset_Image_descriptor;
          }

          @java.lang.Override
          protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
              internalGetFieldAccessorTable() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeRequest_Asset_Image_fieldAccessorTable
                .ensureFieldAccessorsInitialized(
                    com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image.class, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image.Builder.class);
          }

          // Construct using com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image.newBuilder()
          private Builder() {
            maybeForceBuilderInitialization();
          }

          private Builder(
              com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
            super(parent);
            maybeForceBuilderInitialization();
          }
          private void maybeForceBuilderInitialization() {
            if (com.google.protobuf.GeneratedMessageV3
                    .alwaysUseFieldBuilders) {
            }
          }
          @java.lang.Override
          public Builder clear() {
            super.clear();
            type_ = 0;
            bitField0_ = (bitField0_ & ~0x00000001);
            w_ = 0;
            bitField0_ = (bitField0_ & ~0x00000002);
            h_ = 0;
            bitField0_ = (bitField0_ & ~0x00000004);
            wmin_ = 0;
            bitField0_ = (bitField0_ & ~0x00000008);
            hmin_ = 0;
            bitField0_ = (bitField0_ & ~0x00000010);
            mimes_ = com.google.protobuf.LazyStringArrayList.EMPTY;
            bitField0_ = (bitField0_ & ~0x00000020);
            return this;
          }

          @java.lang.Override
          public com.google.protobuf.Descriptors.Descriptor
              getDescriptorForType() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeRequest_Asset_Image_descriptor;
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image getDefaultInstanceForType() {
            return com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image.getDefaultInstance();
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image build() {
            com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image result = buildPartial();
            if (!result.isInitialized()) {
              throw newUninitializedMessageException(result);
            }
            return result;
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image buildPartial() {
            com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image result = new com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image(this);
            int from_bitField0_ = bitField0_;
            int to_bitField0_ = 0;
            if (((from_bitField0_ & 0x00000001) != 0)) {
              result.type_ = type_;
              to_bitField0_ |= 0x00000001;
            }
            if (((from_bitField0_ & 0x00000002) != 0)) {
              result.w_ = w_;
              to_bitField0_ |= 0x00000002;
            }
            if (((from_bitField0_ & 0x00000004) != 0)) {
              result.h_ = h_;
              to_bitField0_ |= 0x00000004;
            }
            if (((from_bitField0_ & 0x00000008) != 0)) {
              result.wmin_ = wmin_;
              to_bitField0_ |= 0x00000008;
            }
            if (((from_bitField0_ & 0x00000010) != 0)) {
              result.hmin_ = hmin_;
              to_bitField0_ |= 0x00000010;
            }
            if (((bitField0_ & 0x00000020) != 0)) {
              mimes_ = mimes_.getUnmodifiableView();
              bitField0_ = (bitField0_ & ~0x00000020);
            }
            result.mimes_ = mimes_;
            result.bitField0_ = to_bitField0_;
            onBuilt();
            return result;
          }

          @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 <Type> Builder setExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image, Type> extension,
              Type value) {
            return super.setExtension(extension, value);
          }
          @java.lang.Override
          public <Type> Builder setExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image, java.util.List<Type>> extension,
              int index, Type value) {
            return super.setExtension(extension, index, value);
          }
          @java.lang.Override
          public <Type> Builder addExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image, java.util.List<Type>> extension,
              Type value) {
            return super.addExtension(extension, value);
          }
          @java.lang.Override
          public <Type> Builder clearExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image, ?> extension) {
            return super.clearExtension(extension);
          }
          @java.lang.Override
          public Builder mergeFrom(com.google.protobuf.Message other) {
            if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image) {
              return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image)other);
            } else {
              super.mergeFrom(other);
              return this;
            }
          }

          public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image other) {
            if (other == com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image.getDefaultInstance()) return this;
            if (other.hasType()) {
              setType(other.getType());
            }
            if (other.hasW()) {
              setW(other.getW());
            }
            if (other.hasH()) {
              setH(other.getH());
            }
            if (other.hasWmin()) {
              setWmin(other.getWmin());
            }
            if (other.hasHmin()) {
              setHmin(other.getHmin());
            }
            if (!other.mimes_.isEmpty()) {
              if (mimes_.isEmpty()) {
                mimes_ = other.mimes_;
                bitField0_ = (bitField0_ & ~0x00000020);
              } else {
                ensureMimesIsMutable();
                mimes_.addAll(other.mimes_);
              }
              onChanged();
            }
            this.mergeExtensionFields(other);
            this.mergeUnknownFields(other.unknownFields);
            onChanged();
            return this;
          }

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

          @java.lang.Override
          public Builder mergeFrom(
              com.google.protobuf.CodedInputStream input,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image parsedMessage = null;
            try {
              parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
              parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image) e.getUnfinishedMessage();
              throw e.unwrapIOException();
            } finally {
              if (parsedMessage != null) {
                mergeFrom(parsedMessage);
              }
            }
            return this;
          }
          private int bitField0_;

          private int type_ ;
          /**
           * <pre>
           * Type ID of the image element supported by the publisher.
           * The publisher can display this information in an appropriate format.
           * Refer to enum com.iabtechlab.adcom.v1.NativeImageAssetType for generic values.
           * </pre>
           *
           * <code>optional int32 type = 1;</code>
           * @return Whether the type field is set.
           */
          @java.lang.Override
          public boolean hasType() {
            return ((bitField0_ & 0x00000001) != 0);
          }
          /**
           * <pre>
           * Type ID of the image element supported by the publisher.
           * The publisher can display this information in an appropriate format.
           * Refer to enum com.iabtechlab.adcom.v1.NativeImageAssetType for generic values.
           * </pre>
           *
           * <code>optional int32 type = 1;</code>
           * @return The type.
           */
          @java.lang.Override
          public int getType() {
            return type_;
          }
          /**
           * <pre>
           * Type ID of the image element supported by the publisher.
           * The publisher can display this information in an appropriate format.
           * Refer to enum com.iabtechlab.adcom.v1.NativeImageAssetType for generic values.
           * </pre>
           *
           * <code>optional int32 type = 1;</code>
           * @param value The type to set.
           * @return This builder for chaining.
           */
          public Builder setType(int value) {
            bitField0_ |= 0x00000001;
            type_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Type ID of the image element supported by the publisher.
           * The publisher can display this information in an appropriate format.
           * Refer to enum com.iabtechlab.adcom.v1.NativeImageAssetType for generic values.
           * </pre>
           *
           * <code>optional int32 type = 1;</code>
           * @return This builder for chaining.
           */
          public Builder clearType() {
            bitField0_ = (bitField0_ & ~0x00000001);
            type_ = 0;
            onChanged();
            return this;
          }

          private int w_ ;
          /**
           * <pre>
           * Width of the image in pixels.
           * </pre>
           *
           * <code>optional int32 w = 2;</code>
           * @return Whether the w field is set.
           */
          @java.lang.Override
          public boolean hasW() {
            return ((bitField0_ & 0x00000002) != 0);
          }
          /**
           * <pre>
           * Width of the image in pixels.
           * </pre>
           *
           * <code>optional int32 w = 2;</code>
           * @return The w.
           */
          @java.lang.Override
          public int getW() {
            return w_;
          }
          /**
           * <pre>
           * Width of the image in pixels.
           * </pre>
           *
           * <code>optional int32 w = 2;</code>
           * @param value The w to set.
           * @return This builder for chaining.
           */
          public Builder setW(int value) {
            bitField0_ |= 0x00000002;
            w_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Width of the image in pixels.
           * </pre>
           *
           * <code>optional int32 w = 2;</code>
           * @return This builder for chaining.
           */
          public Builder clearW() {
            bitField0_ = (bitField0_ & ~0x00000002);
            w_ = 0;
            onChanged();
            return this;
          }

          private int h_ ;
          /**
           * <pre>
           * Height of the image in pixels.
           * </pre>
           *
           * <code>optional int32 h = 3;</code>
           * @return Whether the h field is set.
           */
          @java.lang.Override
          public boolean hasH() {
            return ((bitField0_ & 0x00000004) != 0);
          }
          /**
           * <pre>
           * Height of the image in pixels.
           * </pre>
           *
           * <code>optional int32 h = 3;</code>
           * @return The h.
           */
          @java.lang.Override
          public int getH() {
            return h_;
          }
          /**
           * <pre>
           * Height of the image in pixels.
           * </pre>
           *
           * <code>optional int32 h = 3;</code>
           * @param value The h to set.
           * @return This builder for chaining.
           */
          public Builder setH(int value) {
            bitField0_ |= 0x00000004;
            h_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Height of the image in pixels.
           * </pre>
           *
           * <code>optional int32 h = 3;</code>
           * @return This builder for chaining.
           */
          public Builder clearH() {
            bitField0_ = (bitField0_ & ~0x00000004);
            h_ = 0;
            onChanged();
            return this;
          }

          private int wmin_ ;
          /**
           * <pre>
           * The minimum requested width of the image in pixels. This option should
           * be used for any rescaling of images by the client. Either w or wmin
           * should be transmitted. If only w is included, it should be considered
           * an exact requirement.
           * RECOMMENDED by the OpenRTB Native specification.
           * </pre>
           *
           * <code>optional int32 wmin = 4;</code>
           * @return Whether the wmin field is set.
           */
          @java.lang.Override
          public boolean hasWmin() {
            return ((bitField0_ & 0x00000008) != 0);
          }
          /**
           * <pre>
           * The minimum requested width of the image in pixels. This option should
           * be used for any rescaling of images by the client. Either w or wmin
           * should be transmitted. If only w is included, it should be considered
           * an exact requirement.
           * RECOMMENDED by the OpenRTB Native specification.
           * </pre>
           *
           * <code>optional int32 wmin = 4;</code>
           * @return The wmin.
           */
          @java.lang.Override
          public int getWmin() {
            return wmin_;
          }
          /**
           * <pre>
           * The minimum requested width of the image in pixels. This option should
           * be used for any rescaling of images by the client. Either w or wmin
           * should be transmitted. If only w is included, it should be considered
           * an exact requirement.
           * RECOMMENDED by the OpenRTB Native specification.
           * </pre>
           *
           * <code>optional int32 wmin = 4;</code>
           * @param value The wmin to set.
           * @return This builder for chaining.
           */
          public Builder setWmin(int value) {
            bitField0_ |= 0x00000008;
            wmin_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * The minimum requested width of the image in pixels. This option should
           * be used for any rescaling of images by the client. Either w or wmin
           * should be transmitted. If only w is included, it should be considered
           * an exact requirement.
           * RECOMMENDED by the OpenRTB Native specification.
           * </pre>
           *
           * <code>optional int32 wmin = 4;</code>
           * @return This builder for chaining.
           */
          public Builder clearWmin() {
            bitField0_ = (bitField0_ & ~0x00000008);
            wmin_ = 0;
            onChanged();
            return this;
          }

          private int hmin_ ;
          /**
           * <pre>
           * The minimum requested height of the image in pixels. This option should
           * be used for any rescaling of images by the client. Either h or hmin
           * should be transmitted. If only h is included, it should be considered
           * an exact requirement.
           * RECOMMENDED by the OpenRTB Native specification.
           * </pre>
           *
           * <code>optional int32 hmin = 5;</code>
           * @return Whether the hmin field is set.
           */
          @java.lang.Override
          public boolean hasHmin() {
            return ((bitField0_ & 0x00000010) != 0);
          }
          /**
           * <pre>
           * The minimum requested height of the image in pixels. This option should
           * be used for any rescaling of images by the client. Either h or hmin
           * should be transmitted. If only h is included, it should be considered
           * an exact requirement.
           * RECOMMENDED by the OpenRTB Native specification.
           * </pre>
           *
           * <code>optional int32 hmin = 5;</code>
           * @return The hmin.
           */
          @java.lang.Override
          public int getHmin() {
            return hmin_;
          }
          /**
           * <pre>
           * The minimum requested height of the image in pixels. This option should
           * be used for any rescaling of images by the client. Either h or hmin
           * should be transmitted. If only h is included, it should be considered
           * an exact requirement.
           * RECOMMENDED by the OpenRTB Native specification.
           * </pre>
           *
           * <code>optional int32 hmin = 5;</code>
           * @param value The hmin to set.
           * @return This builder for chaining.
           */
          public Builder setHmin(int value) {
            bitField0_ |= 0x00000010;
            hmin_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * The minimum requested height of the image in pixels. This option should
           * be used for any rescaling of images by the client. Either h or hmin
           * should be transmitted. If only h is included, it should be considered
           * an exact requirement.
           * RECOMMENDED by the OpenRTB Native specification.
           * </pre>
           *
           * <code>optional int32 hmin = 5;</code>
           * @return This builder for chaining.
           */
          public Builder clearHmin() {
            bitField0_ = (bitField0_ & ~0x00000010);
            hmin_ = 0;
            onChanged();
            return this;
          }

          private com.google.protobuf.LazyStringList mimes_ = com.google.protobuf.LazyStringArrayList.EMPTY;
          private void ensureMimesIsMutable() {
            if (!((bitField0_ & 0x00000020) != 0)) {
              mimes_ = new com.google.protobuf.LazyStringArrayList(mimes_);
              bitField0_ |= 0x00000020;
             }
          }
          /**
           * <pre>
           * Whitelist of content MIME types supported. Popular MIME types include,
           * but are not limited to "image/jpg" and "image/gif". Each implementing
           * Exchange should have their own list of supported types in the
           * integration docs. See Wikipedia's MIME page for more information and
           * links to all IETF RFCs. If blank, assume all types are allowed.
           * </pre>
           *
           * <code>repeated string mimes = 6;</code>
           * @return A list containing the mimes.
           */
          public com.google.protobuf.ProtocolStringList
              getMimesList() {
            return mimes_.getUnmodifiableView();
          }
          /**
           * <pre>
           * Whitelist of content MIME types supported. Popular MIME types include,
           * but are not limited to "image/jpg" and "image/gif". Each implementing
           * Exchange should have their own list of supported types in the
           * integration docs. See Wikipedia's MIME page for more information and
           * links to all IETF RFCs. If blank, assume all types are allowed.
           * </pre>
           *
           * <code>repeated string mimes = 6;</code>
           * @return The count of mimes.
           */
          public int getMimesCount() {
            return mimes_.size();
          }
          /**
           * <pre>
           * Whitelist of content MIME types supported. Popular MIME types include,
           * but are not limited to "image/jpg" and "image/gif". Each implementing
           * Exchange should have their own list of supported types in the
           * integration docs. See Wikipedia's MIME page for more information and
           * links to all IETF RFCs. If blank, assume all types are allowed.
           * </pre>
           *
           * <code>repeated string mimes = 6;</code>
           * @param index The index of the element to return.
           * @return The mimes at the given index.
           */
          public java.lang.String getMimes(int index) {
            return mimes_.get(index);
          }
          /**
           * <pre>
           * Whitelist of content MIME types supported. Popular MIME types include,
           * but are not limited to "image/jpg" and "image/gif". Each implementing
           * Exchange should have their own list of supported types in the
           * integration docs. See Wikipedia's MIME page for more information and
           * links to all IETF RFCs. If blank, assume all types are allowed.
           * </pre>
           *
           * <code>repeated string mimes = 6;</code>
           * @param index The index of the value to return.
           * @return The bytes of the mimes at the given index.
           */
          public com.google.protobuf.ByteString
              getMimesBytes(int index) {
            return mimes_.getByteString(index);
          }
          /**
           * <pre>
           * Whitelist of content MIME types supported. Popular MIME types include,
           * but are not limited to "image/jpg" and "image/gif". Each implementing
           * Exchange should have their own list of supported types in the
           * integration docs. See Wikipedia's MIME page for more information and
           * links to all IETF RFCs. If blank, assume all types are allowed.
           * </pre>
           *
           * <code>repeated string mimes = 6;</code>
           * @param index The index to set the value at.
           * @param value The mimes to set.
           * @return This builder for chaining.
           */
          public Builder setMimes(
              int index, java.lang.String value) {
            if (value == null) {
    throw new NullPointerException();
  }
  ensureMimesIsMutable();
            mimes_.set(index, value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Whitelist of content MIME types supported. Popular MIME types include,
           * but are not limited to "image/jpg" and "image/gif". Each implementing
           * Exchange should have their own list of supported types in the
           * integration docs. See Wikipedia's MIME page for more information and
           * links to all IETF RFCs. If blank, assume all types are allowed.
           * </pre>
           *
           * <code>repeated string mimes = 6;</code>
           * @param value The mimes to add.
           * @return This builder for chaining.
           */
          public Builder addMimes(
              java.lang.String value) {
            if (value == null) {
    throw new NullPointerException();
  }
  ensureMimesIsMutable();
            mimes_.add(value);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Whitelist of content MIME types supported. Popular MIME types include,
           * but are not limited to "image/jpg" and "image/gif". Each implementing
           * Exchange should have their own list of supported types in the
           * integration docs. See Wikipedia's MIME page for more information and
           * links to all IETF RFCs. If blank, assume all types are allowed.
           * </pre>
           *
           * <code>repeated string mimes = 6;</code>
           * @param values The mimes to add.
           * @return This builder for chaining.
           */
          public Builder addAllMimes(
              java.lang.Iterable<java.lang.String> values) {
            ensureMimesIsMutable();
            com.google.protobuf.AbstractMessageLite.Builder.addAll(
                values, mimes_);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Whitelist of content MIME types supported. Popular MIME types include,
           * but are not limited to "image/jpg" and "image/gif". Each implementing
           * Exchange should have their own list of supported types in the
           * integration docs. See Wikipedia's MIME page for more information and
           * links to all IETF RFCs. If blank, assume all types are allowed.
           * </pre>
           *
           * <code>repeated string mimes = 6;</code>
           * @return This builder for chaining.
           */
          public Builder clearMimes() {
            mimes_ = com.google.protobuf.LazyStringArrayList.EMPTY;
            bitField0_ = (bitField0_ & ~0x00000020);
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Whitelist of content MIME types supported. Popular MIME types include,
           * but are not limited to "image/jpg" and "image/gif". Each implementing
           * Exchange should have their own list of supported types in the
           * integration docs. See Wikipedia's MIME page for more information and
           * links to all IETF RFCs. If blank, assume all types are allowed.
           * </pre>
           *
           * <code>repeated string mimes = 6;</code>
           * @param value The bytes of the mimes to add.
           * @return This builder for chaining.
           */
          public Builder addMimesBytes(
              com.google.protobuf.ByteString value) {
            if (value == null) {
    throw new NullPointerException();
  }
  ensureMimesIsMutable();
            mimes_.add(value);
            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:com.iabtechlab.openrtb.v2.NativeRequest.Asset.Image)
        }

        // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.NativeRequest.Asset.Image)
        private static final com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image DEFAULT_INSTANCE;
        static {
          DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image();
        }

        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image getDefaultInstance() {
          return DEFAULT_INSTANCE;
        }

        @java.lang.Deprecated public static final com.google.protobuf.Parser<Image>
            PARSER = new com.google.protobuf.AbstractParser<Image>() {
          @java.lang.Override
          public Image parsePartialFrom(
              com.google.protobuf.CodedInputStream input,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.protobuf.InvalidProtocolBufferException {
            return new Image(input, extensionRegistry);
          }
        };

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

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

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image getDefaultInstanceForType() {
          return DEFAULT_INSTANCE;
        }

      }

      public interface DataOrBuilder extends
          // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.NativeRequest.Asset.Data)
          com.google.protobuf.GeneratedMessageV3.
              ExtendableMessageOrBuilder<Data> {

        /**
         * <pre>
         * Type ID of the element supported by the publisher. The publisher can
         * display this information in an appropriate format.
         * Refer to enum com.iabtechlab.adcom.v1.NativeDataAssetType for generic values.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>required int32 type = 1;</code>
         * @return Whether the type field is set.
         */
        boolean hasType();
        /**
         * <pre>
         * Type ID of the element supported by the publisher. The publisher can
         * display this information in an appropriate format.
         * Refer to enum com.iabtechlab.adcom.v1.NativeDataAssetType for generic values.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>required int32 type = 1;</code>
         * @return The type.
         */
        int getType();

        /**
         * <pre>
         * Maximum length of the text in the element's response. Longer strings
         * may be truncated and ellipsized by Ad Exchange or the publisher during
         * rendering.
         * </pre>
         *
         * <code>optional int32 len = 2;</code>
         * @return Whether the len field is set.
         */
        boolean hasLen();
        /**
         * <pre>
         * Maximum length of the text in the element's response. Longer strings
         * may be truncated and ellipsized by Ad Exchange or the publisher during
         * rendering.
         * </pre>
         *
         * <code>optional int32 len = 2;</code>
         * @return The len.
         */
        int getLen();
      }
      /**
       * <pre>
       * OpenRTB Native 1.0: The Data Object is to be used for all non-core
       * elements of the native unit such as Ratings, Review Count, Stars,
       * Download count, descriptions etc. It is also generic for future of Native
       * elements not contemplated at the time of the writing of this document.
       * </pre>
       *
       * Protobuf type {@code com.iabtechlab.openrtb.v2.NativeRequest.Asset.Data}
       */
      public static final class Data extends
          com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
            Data> implements
          // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.NativeRequest.Asset.Data)
          DataOrBuilder {
      private static final long serialVersionUID = 0L;
        // Use Data.newBuilder() to construct.
        private Data(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data, ?> builder) {
          super(builder);
        }
        private Data() {
        }

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

        @java.lang.Override
        public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
          return this.unknownFields;
        }
        private Data(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          this();
          if (extensionRegistry == null) {
            throw new java.lang.NullPointerException();
          }
          int mutable_bitField0_ = 0;
          com.google.protobuf.UnknownFieldSet.Builder unknownFields =
              com.google.protobuf.UnknownFieldSet.newBuilder();
          try {
            boolean done = false;
            while (!done) {
              int tag = input.readTag();
              switch (tag) {
                case 0:
                  done = true;
                  break;
                case 8: {
                  bitField0_ |= 0x00000001;
                  type_ = input.readInt32();
                  break;
                }
                case 16: {
                  bitField0_ |= 0x00000002;
                  len_ = input.readInt32();
                  break;
                }
                default: {
                  if (!parseUnknownField(
                      input, unknownFields, extensionRegistry, tag)) {
                    done = true;
                  }
                  break;
                }
              }
            }
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            throw e.setUnfinishedMessage(this);
          } catch (java.io.IOException e) {
            throw new com.google.protobuf.InvalidProtocolBufferException(
                e).setUnfinishedMessage(this);
          } finally {
            this.unknownFields = unknownFields.build();
            makeExtensionsImmutable();
          }
        }
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeRequest_Asset_Data_descriptor;
        }

        @java.lang.Override
        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeRequest_Asset_Data_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data.class, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data.Builder.class);
        }

        private int bitField0_;
        public static final int TYPE_FIELD_NUMBER = 1;
        private int type_;
        /**
         * <pre>
         * Type ID of the element supported by the publisher. The publisher can
         * display this information in an appropriate format.
         * Refer to enum com.iabtechlab.adcom.v1.NativeDataAssetType for generic values.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>required int32 type = 1;</code>
         * @return Whether the type field is set.
         */
        @java.lang.Override
        public boolean hasType() {
          return ((bitField0_ & 0x00000001) != 0);
        }
        /**
         * <pre>
         * Type ID of the element supported by the publisher. The publisher can
         * display this information in an appropriate format.
         * Refer to enum com.iabtechlab.adcom.v1.NativeDataAssetType for generic values.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>required int32 type = 1;</code>
         * @return The type.
         */
        @java.lang.Override
        public int getType() {
          return type_;
        }

        public static final int LEN_FIELD_NUMBER = 2;
        private int len_;
        /**
         * <pre>
         * Maximum length of the text in the element's response. Longer strings
         * may be truncated and ellipsized by Ad Exchange or the publisher during
         * rendering.
         * </pre>
         *
         * <code>optional int32 len = 2;</code>
         * @return Whether the len field is set.
         */
        @java.lang.Override
        public boolean hasLen() {
          return ((bitField0_ & 0x00000002) != 0);
        }
        /**
         * <pre>
         * Maximum length of the text in the element's response. Longer strings
         * may be truncated and ellipsized by Ad Exchange or the publisher during
         * rendering.
         * </pre>
         *
         * <code>optional int32 len = 2;</code>
         * @return The len.
         */
        @java.lang.Override
        public int getLen() {
          return len_;
        }

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

          if (!hasType()) {
            memoizedIsInitialized = 0;
            return false;
          }
          if (!extensionsAreInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
          memoizedIsInitialized = 1;
          return true;
        }

        @java.lang.Override
        public void writeTo(com.google.protobuf.CodedOutputStream output)
                            throws java.io.IOException {
          com.google.protobuf.GeneratedMessageV3
            .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data>.ExtensionWriter
              extensionWriter = newExtensionWriter();
          if (((bitField0_ & 0x00000001) != 0)) {
            output.writeInt32(1, type_);
          }
          if (((bitField0_ & 0x00000002) != 0)) {
            output.writeInt32(2, len_);
          }
          extensionWriter.writeUntil(10000, output);
          unknownFields.writeTo(output);
        }

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

          size = 0;
          if (((bitField0_ & 0x00000001) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(1, type_);
          }
          if (((bitField0_ & 0x00000002) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(2, len_);
          }
          size += extensionsSerializedSize();
          size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data)) {
            return super.equals(obj);
          }
          com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data other = (com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data) obj;

          if (hasType() != other.hasType()) return false;
          if (hasType()) {
            if (getType()
                != other.getType()) return false;
          }
          if (hasLen() != other.hasLen()) return false;
          if (hasLen()) {
            if (getLen()
                != other.getLen()) return false;
          }
          if (!unknownFields.equals(other.unknownFields)) return false;
          if (!getExtensionFields().equals(other.getExtensionFields()))
            return false;
          return true;
        }

        @java.lang.Override
        public int hashCode() {
          if (memoizedHashCode != 0) {
            return memoizedHashCode;
          }
          int hash = 41;
          hash = (19 * hash) + getDescriptor().hashCode();
          if (hasType()) {
            hash = (37 * hash) + TYPE_FIELD_NUMBER;
            hash = (53 * hash) + getType();
          }
          if (hasLen()) {
            hash = (37 * hash) + LEN_FIELD_NUMBER;
            hash = (53 * hash) + getLen();
          }
          hash = hashFields(hash, getExtensionFields());
          hash = (29 * hash) + unknownFields.hashCode();
          memoizedHashCode = hash;
          return hash;
        }

        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data parseFrom(
            java.nio.ByteBuffer data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data parseFrom(
            java.nio.ByteBuffer data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data parseFrom(
            com.google.protobuf.ByteString data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data parseFrom(
            com.google.protobuf.ByteString data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data parseFrom(byte[] data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data parseFrom(
            byte[] data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data parseFrom(java.io.InputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data 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.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data parseDelimitedFrom(java.io.InputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseDelimitedWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data 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.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data parseFrom(
            com.google.protobuf.CodedInputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data 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.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data 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>
         * OpenRTB Native 1.0: The Data Object is to be used for all non-core
         * elements of the native unit such as Ratings, Review Count, Stars,
         * Download count, descriptions etc. It is also generic for future of Native
         * elements not contemplated at the time of the writing of this document.
         * </pre>
         *
         * Protobuf type {@code com.iabtechlab.openrtb.v2.NativeRequest.Asset.Data}
         */
        public static final class Builder extends
            com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
              com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data, Builder> implements
            // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.NativeRequest.Asset.Data)
            com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.DataOrBuilder {
          public static final com.google.protobuf.Descriptors.Descriptor
              getDescriptor() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeRequest_Asset_Data_descriptor;
          }

          @java.lang.Override
          protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
              internalGetFieldAccessorTable() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeRequest_Asset_Data_fieldAccessorTable
                .ensureFieldAccessorsInitialized(
                    com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data.class, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data.Builder.class);
          }

          // Construct using com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data.newBuilder()
          private Builder() {
            maybeForceBuilderInitialization();
          }

          private Builder(
              com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
            super(parent);
            maybeForceBuilderInitialization();
          }
          private void maybeForceBuilderInitialization() {
            if (com.google.protobuf.GeneratedMessageV3
                    .alwaysUseFieldBuilders) {
            }
          }
          @java.lang.Override
          public Builder clear() {
            super.clear();
            type_ = 0;
            bitField0_ = (bitField0_ & ~0x00000001);
            len_ = 0;
            bitField0_ = (bitField0_ & ~0x00000002);
            return this;
          }

          @java.lang.Override
          public com.google.protobuf.Descriptors.Descriptor
              getDescriptorForType() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeRequest_Asset_Data_descriptor;
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data getDefaultInstanceForType() {
            return com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data.getDefaultInstance();
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data build() {
            com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data result = buildPartial();
            if (!result.isInitialized()) {
              throw newUninitializedMessageException(result);
            }
            return result;
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data buildPartial() {
            com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data result = new com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data(this);
            int from_bitField0_ = bitField0_;
            int to_bitField0_ = 0;
            if (((from_bitField0_ & 0x00000001) != 0)) {
              result.type_ = type_;
              to_bitField0_ |= 0x00000001;
            }
            if (((from_bitField0_ & 0x00000002) != 0)) {
              result.len_ = len_;
              to_bitField0_ |= 0x00000002;
            }
            result.bitField0_ = to_bitField0_;
            onBuilt();
            return result;
          }

          @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 <Type> Builder setExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data, Type> extension,
              Type value) {
            return super.setExtension(extension, value);
          }
          @java.lang.Override
          public <Type> Builder setExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data, java.util.List<Type>> extension,
              int index, Type value) {
            return super.setExtension(extension, index, value);
          }
          @java.lang.Override
          public <Type> Builder addExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data, java.util.List<Type>> extension,
              Type value) {
            return super.addExtension(extension, value);
          }
          @java.lang.Override
          public <Type> Builder clearExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data, ?> extension) {
            return super.clearExtension(extension);
          }
          @java.lang.Override
          public Builder mergeFrom(com.google.protobuf.Message other) {
            if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data) {
              return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data)other);
            } else {
              super.mergeFrom(other);
              return this;
            }
          }

          public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data other) {
            if (other == com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data.getDefaultInstance()) return this;
            if (other.hasType()) {
              setType(other.getType());
            }
            if (other.hasLen()) {
              setLen(other.getLen());
            }
            this.mergeExtensionFields(other);
            this.mergeUnknownFields(other.unknownFields);
            onChanged();
            return this;
          }

          @java.lang.Override
          public final boolean isInitialized() {
            if (!hasType()) {
              return false;
            }
            if (!extensionsAreInitialized()) {
              return false;
            }
            return true;
          }

          @java.lang.Override
          public Builder mergeFrom(
              com.google.protobuf.CodedInputStream input,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data parsedMessage = null;
            try {
              parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
              parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data) e.getUnfinishedMessage();
              throw e.unwrapIOException();
            } finally {
              if (parsedMessage != null) {
                mergeFrom(parsedMessage);
              }
            }
            return this;
          }
          private int bitField0_;

          private int type_ ;
          /**
           * <pre>
           * Type ID of the element supported by the publisher. The publisher can
           * display this information in an appropriate format.
           * Refer to enum com.iabtechlab.adcom.v1.NativeDataAssetType for generic values.
           * REQUIRED by the OpenRTB Native specification.
           * </pre>
           *
           * <code>required int32 type = 1;</code>
           * @return Whether the type field is set.
           */
          @java.lang.Override
          public boolean hasType() {
            return ((bitField0_ & 0x00000001) != 0);
          }
          /**
           * <pre>
           * Type ID of the element supported by the publisher. The publisher can
           * display this information in an appropriate format.
           * Refer to enum com.iabtechlab.adcom.v1.NativeDataAssetType for generic values.
           * REQUIRED by the OpenRTB Native specification.
           * </pre>
           *
           * <code>required int32 type = 1;</code>
           * @return The type.
           */
          @java.lang.Override
          public int getType() {
            return type_;
          }
          /**
           * <pre>
           * Type ID of the element supported by the publisher. The publisher can
           * display this information in an appropriate format.
           * Refer to enum com.iabtechlab.adcom.v1.NativeDataAssetType for generic values.
           * REQUIRED by the OpenRTB Native specification.
           * </pre>
           *
           * <code>required int32 type = 1;</code>
           * @param value The type to set.
           * @return This builder for chaining.
           */
          public Builder setType(int value) {
            bitField0_ |= 0x00000001;
            type_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Type ID of the element supported by the publisher. The publisher can
           * display this information in an appropriate format.
           * Refer to enum com.iabtechlab.adcom.v1.NativeDataAssetType for generic values.
           * REQUIRED by the OpenRTB Native specification.
           * </pre>
           *
           * <code>required int32 type = 1;</code>
           * @return This builder for chaining.
           */
          public Builder clearType() {
            bitField0_ = (bitField0_ & ~0x00000001);
            type_ = 0;
            onChanged();
            return this;
          }

          private int len_ ;
          /**
           * <pre>
           * Maximum length of the text in the element's response. Longer strings
           * may be truncated and ellipsized by Ad Exchange or the publisher during
           * rendering.
           * </pre>
           *
           * <code>optional int32 len = 2;</code>
           * @return Whether the len field is set.
           */
          @java.lang.Override
          public boolean hasLen() {
            return ((bitField0_ & 0x00000002) != 0);
          }
          /**
           * <pre>
           * Maximum length of the text in the element's response. Longer strings
           * may be truncated and ellipsized by Ad Exchange or the publisher during
           * rendering.
           * </pre>
           *
           * <code>optional int32 len = 2;</code>
           * @return The len.
           */
          @java.lang.Override
          public int getLen() {
            return len_;
          }
          /**
           * <pre>
           * Maximum length of the text in the element's response. Longer strings
           * may be truncated and ellipsized by Ad Exchange or the publisher during
           * rendering.
           * </pre>
           *
           * <code>optional int32 len = 2;</code>
           * @param value The len to set.
           * @return This builder for chaining.
           */
          public Builder setLen(int value) {
            bitField0_ |= 0x00000002;
            len_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Maximum length of the text in the element's response. Longer strings
           * may be truncated and ellipsized by Ad Exchange or the publisher during
           * rendering.
           * </pre>
           *
           * <code>optional int32 len = 2;</code>
           * @return This builder for chaining.
           */
          public Builder clearLen() {
            bitField0_ = (bitField0_ & ~0x00000002);
            len_ = 0;
            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:com.iabtechlab.openrtb.v2.NativeRequest.Asset.Data)
        }

        // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.NativeRequest.Asset.Data)
        private static final com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data DEFAULT_INSTANCE;
        static {
          DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data();
        }

        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data getDefaultInstance() {
          return DEFAULT_INSTANCE;
        }

        @java.lang.Deprecated public static final com.google.protobuf.Parser<Data>
            PARSER = new com.google.protobuf.AbstractParser<Data>() {
          @java.lang.Override
          public Data parsePartialFrom(
              com.google.protobuf.CodedInputStream input,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.protobuf.InvalidProtocolBufferException {
            return new Data(input, extensionRegistry);
          }
        };

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

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

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data getDefaultInstanceForType() {
          return DEFAULT_INSTANCE;
        }

      }

      private int bitField0_;
      private int assetOneofCase_ = 0;
      private java.lang.Object assetOneof_;
      public enum AssetOneofCase
          implements com.google.protobuf.Internal.EnumLite,
              com.google.protobuf.AbstractMessage.InternalOneOfEnum {
        TITLE(3),
        IMG(4),
        VIDEO(5),
        DATA(6),
        ASSETONEOF_NOT_SET(0);
        private final int value;
        private AssetOneofCase(int value) {
          this.value = value;
        }
        /**
         * @param value The number of the enum to look for.
         * @return The enum associated with the given number.
         * @deprecated Use {@link #forNumber(int)} instead.
         */
        @java.lang.Deprecated
        public static AssetOneofCase valueOf(int value) {
          return forNumber(value);
        }

        public static AssetOneofCase forNumber(int value) {
          switch (value) {
            case 3: return TITLE;
            case 4: return IMG;
            case 5: return VIDEO;
            case 6: return DATA;
            case 0: return ASSETONEOF_NOT_SET;
            default: return null;
          }
        }
        public int getNumber() {
          return this.value;
        }
      };

      public AssetOneofCase
      getAssetOneofCase() {
        return AssetOneofCase.forNumber(
            assetOneofCase_);
      }

      public static final int ID_FIELD_NUMBER = 1;
      private int id_;
      /**
       * <pre>
       * Unique asset ID, assigned by exchange. Typically a counter for the array.
       * REQUIRED by the OpenRTB Native specification.
       * </pre>
       *
       * <code>required int32 id = 1;</code>
       * @return Whether the id field is set.
       */
      @java.lang.Override
      public boolean hasId() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <pre>
       * Unique asset ID, assigned by exchange. Typically a counter for the array.
       * REQUIRED by the OpenRTB Native specification.
       * </pre>
       *
       * <code>required int32 id = 1;</code>
       * @return The id.
       */
      @java.lang.Override
      public int getId() {
        return id_;
      }

      public static final int REQUIRED_FIELD_NUMBER = 2;
      private boolean required_;
      /**
       * <pre>
       * Set to true if asset is required
       * (exchange will not accept a bid without it).
       * </pre>
       *
       * <code>optional bool required = 2 [default = false];</code>
       * @return Whether the required field is set.
       */
      @java.lang.Override
      public boolean hasRequired() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <pre>
       * Set to true if asset is required
       * (exchange will not accept a bid without it).
       * </pre>
       *
       * <code>optional bool required = 2 [default = false];</code>
       * @return The required.
       */
      @java.lang.Override
      public boolean getRequired() {
        return required_;
      }

      public static final int TITLE_FIELD_NUMBER = 3;
      /**
       * <pre>
       * Title object for title assets.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.NativeRequest.Asset.Title title = 3;</code>
       * @return Whether the title field is set.
       */
      @java.lang.Override
      public boolean hasTitle() {
        return assetOneofCase_ == 3;
      }
      /**
       * <pre>
       * Title object for title assets.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.NativeRequest.Asset.Title title = 3;</code>
       * @return The title.
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title getTitle() {
        if (assetOneofCase_ == 3) {
           return (com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title) assetOneof_;
        }
        return com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title.getDefaultInstance();
      }
      /**
       * <pre>
       * Title object for title assets.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.NativeRequest.Asset.Title title = 3;</code>
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.TitleOrBuilder getTitleOrBuilder() {
        if (assetOneofCase_ == 3) {
           return (com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title) assetOneof_;
        }
        return com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title.getDefaultInstance();
      }

      public static final int IMG_FIELD_NUMBER = 4;
      /**
       * <pre>
       * Image object for image assets.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.NativeRequest.Asset.Image img = 4;</code>
       * @return Whether the img field is set.
       */
      @java.lang.Override
      public boolean hasImg() {
        return assetOneofCase_ == 4;
      }
      /**
       * <pre>
       * Image object for image assets.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.NativeRequest.Asset.Image img = 4;</code>
       * @return The img.
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image getImg() {
        if (assetOneofCase_ == 4) {
           return (com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image) assetOneof_;
        }
        return com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image.getDefaultInstance();
      }
      /**
       * <pre>
       * Image object for image assets.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.NativeRequest.Asset.Image img = 4;</code>
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.ImageOrBuilder getImgOrBuilder() {
        if (assetOneofCase_ == 4) {
           return (com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image) assetOneof_;
        }
        return com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image.getDefaultInstance();
      }

      public static final int VIDEO_FIELD_NUMBER = 5;
      /**
       * <pre>
       * Video object for video assets.
       * Note that in-stream video ads are not part of Native.
       * Native ads may contain a video as the ad creative itself.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.BidRequest.Imp.Video video = 5;</code>
       * @return Whether the video field is set.
       */
      @java.lang.Override
      public boolean hasVideo() {
        return assetOneofCase_ == 5;
      }
      /**
       * <pre>
       * Video object for video assets.
       * Note that in-stream video ads are not part of Native.
       * Native ads may contain a video as the ad creative itself.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.BidRequest.Imp.Video video = 5;</code>
       * @return The video.
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video getVideo() {
        if (assetOneofCase_ == 5) {
           return (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video) assetOneof_;
        }
        return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.getDefaultInstance();
      }
      /**
       * <pre>
       * Video object for video assets.
       * Note that in-stream video ads are not part of Native.
       * Native ads may contain a video as the ad creative itself.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.BidRequest.Imp.Video video = 5;</code>
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.VideoOrBuilder getVideoOrBuilder() {
        if (assetOneofCase_ == 5) {
           return (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video) assetOneof_;
        }
        return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.getDefaultInstance();
      }

      public static final int DATA_FIELD_NUMBER = 6;
      /**
       * <pre>
       * Data object for brand name, description, ratings, prices etc.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.NativeRequest.Asset.Data data = 6;</code>
       * @return Whether the data field is set.
       */
      @java.lang.Override
      public boolean hasData() {
        return assetOneofCase_ == 6;
      }
      /**
       * <pre>
       * Data object for brand name, description, ratings, prices etc.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.NativeRequest.Asset.Data data = 6;</code>
       * @return The data.
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data getData() {
        if (assetOneofCase_ == 6) {
           return (com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data) assetOneof_;
        }
        return com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data.getDefaultInstance();
      }
      /**
       * <pre>
       * Data object for brand name, description, ratings, prices etc.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.NativeRequest.Asset.Data data = 6;</code>
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.DataOrBuilder getDataOrBuilder() {
        if (assetOneofCase_ == 6) {
           return (com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data) assetOneof_;
        }
        return com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data.getDefaultInstance();
      }

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

        if (!hasId()) {
          memoizedIsInitialized = 0;
          return false;
        }
        if (hasTitle()) {
          if (!getTitle().isInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
        }
        if (hasImg()) {
          if (!getImg().isInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
        }
        if (hasVideo()) {
          if (!getVideo().isInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
        }
        if (hasData()) {
          if (!getData().isInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
        }
        if (!extensionsAreInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
        memoizedIsInitialized = 1;
        return true;
      }

      @java.lang.Override
      public void writeTo(com.google.protobuf.CodedOutputStream output)
                          throws java.io.IOException {
        com.google.protobuf.GeneratedMessageV3
          .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset>.ExtensionWriter
            extensionWriter = newExtensionWriter();
        if (((bitField0_ & 0x00000001) != 0)) {
          output.writeInt32(1, id_);
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          output.writeBool(2, required_);
        }
        if (assetOneofCase_ == 3) {
          output.writeMessage(3, (com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title) assetOneof_);
        }
        if (assetOneofCase_ == 4) {
          output.writeMessage(4, (com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image) assetOneof_);
        }
        if (assetOneofCase_ == 5) {
          output.writeMessage(5, (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video) assetOneof_);
        }
        if (assetOneofCase_ == 6) {
          output.writeMessage(6, (com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data) assetOneof_);
        }
        extensionWriter.writeUntil(10000, output);
        unknownFields.writeTo(output);
      }

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

        size = 0;
        if (((bitField0_ & 0x00000001) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeInt32Size(1, id_);
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeBoolSize(2, required_);
        }
        if (assetOneofCase_ == 3) {
          size += com.google.protobuf.CodedOutputStream
            .computeMessageSize(3, (com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title) assetOneof_);
        }
        if (assetOneofCase_ == 4) {
          size += com.google.protobuf.CodedOutputStream
            .computeMessageSize(4, (com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image) assetOneof_);
        }
        if (assetOneofCase_ == 5) {
          size += com.google.protobuf.CodedOutputStream
            .computeMessageSize(5, (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video) assetOneof_);
        }
        if (assetOneofCase_ == 6) {
          size += com.google.protobuf.CodedOutputStream
            .computeMessageSize(6, (com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data) assetOneof_);
        }
        size += extensionsSerializedSize();
        size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset)) {
          return super.equals(obj);
        }
        com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset other = (com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset) obj;

        if (hasId() != other.hasId()) return false;
        if (hasId()) {
          if (getId()
              != other.getId()) return false;
        }
        if (hasRequired() != other.hasRequired()) return false;
        if (hasRequired()) {
          if (getRequired()
              != other.getRequired()) return false;
        }
        if (!getAssetOneofCase().equals(other.getAssetOneofCase())) return false;
        switch (assetOneofCase_) {
          case 3:
            if (!getTitle()
                .equals(other.getTitle())) return false;
            break;
          case 4:
            if (!getImg()
                .equals(other.getImg())) return false;
            break;
          case 5:
            if (!getVideo()
                .equals(other.getVideo())) return false;
            break;
          case 6:
            if (!getData()
                .equals(other.getData())) return false;
            break;
          case 0:
          default:
        }
        if (!unknownFields.equals(other.unknownFields)) return false;
        if (!getExtensionFields().equals(other.getExtensionFields()))
          return false;
        return true;
      }

      @java.lang.Override
      public int hashCode() {
        if (memoizedHashCode != 0) {
          return memoizedHashCode;
        }
        int hash = 41;
        hash = (19 * hash) + getDescriptor().hashCode();
        if (hasId()) {
          hash = (37 * hash) + ID_FIELD_NUMBER;
          hash = (53 * hash) + getId();
        }
        if (hasRequired()) {
          hash = (37 * hash) + REQUIRED_FIELD_NUMBER;
          hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
              getRequired());
        }
        switch (assetOneofCase_) {
          case 3:
            hash = (37 * hash) + TITLE_FIELD_NUMBER;
            hash = (53 * hash) + getTitle().hashCode();
            break;
          case 4:
            hash = (37 * hash) + IMG_FIELD_NUMBER;
            hash = (53 * hash) + getImg().hashCode();
            break;
          case 5:
            hash = (37 * hash) + VIDEO_FIELD_NUMBER;
            hash = (53 * hash) + getVideo().hashCode();
            break;
          case 6:
            hash = (37 * hash) + DATA_FIELD_NUMBER;
            hash = (53 * hash) + getData().hashCode();
            break;
          case 0:
          default:
        }
        hash = hashFields(hash, getExtensionFields());
        hash = (29 * hash) + unknownFields.hashCode();
        memoizedHashCode = hash;
        return hash;
      }

      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset parseFrom(
          java.nio.ByteBuffer data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset parseFrom(
          java.nio.ByteBuffer data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset parseFrom(
          com.google.protobuf.ByteString data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset parseFrom(
          com.google.protobuf.ByteString data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset parseFrom(byte[] data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset parseFrom(
          byte[] data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset parseFrom(java.io.InputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset 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.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset parseDelimitedFrom(java.io.InputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseDelimitedWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset 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.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset parseFrom(
          com.google.protobuf.CodedInputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset 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.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset 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>
       * OpenRTB Native 1.0: The main container object for each asset requested or
       * supported by Exchange on behalf of the rendering client.
       * Any object that is required is to be flagged as such. Only one of the
       * {title,img,video,data} objects should be present in each object.
       * All others should be null/absent. The id is to be unique within the
       * Asset array so that the response can be aligned.
       * </pre>
       *
       * Protobuf type {@code com.iabtechlab.openrtb.v2.NativeRequest.Asset}
       */
      public static final class Builder extends
          com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
            com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset, Builder> implements
          // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.NativeRequest.Asset)
          com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.AssetOrBuilder {
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeRequest_Asset_descriptor;
        }

        @java.lang.Override
        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeRequest_Asset_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.class, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Builder.class);
        }

        // Construct using com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.newBuilder()
        private Builder() {
          maybeForceBuilderInitialization();
        }

        private Builder(
            com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
          super(parent);
          maybeForceBuilderInitialization();
        }
        private void maybeForceBuilderInitialization() {
          if (com.google.protobuf.GeneratedMessageV3
                  .alwaysUseFieldBuilders) {
          }
        }
        @java.lang.Override
        public Builder clear() {
          super.clear();
          id_ = 0;
          bitField0_ = (bitField0_ & ~0x00000001);
          required_ = false;
          bitField0_ = (bitField0_ & ~0x00000002);
          assetOneofCase_ = 0;
          assetOneof_ = null;
          return this;
        }

        @java.lang.Override
        public com.google.protobuf.Descriptors.Descriptor
            getDescriptorForType() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeRequest_Asset_descriptor;
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset getDefaultInstanceForType() {
          return com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.getDefaultInstance();
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset build() {
          com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset result = buildPartial();
          if (!result.isInitialized()) {
            throw newUninitializedMessageException(result);
          }
          return result;
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset buildPartial() {
          com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset result = new com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset(this);
          int from_bitField0_ = bitField0_;
          int to_bitField0_ = 0;
          if (((from_bitField0_ & 0x00000001) != 0)) {
            result.id_ = id_;
            to_bitField0_ |= 0x00000001;
          }
          if (((from_bitField0_ & 0x00000002) != 0)) {
            result.required_ = required_;
            to_bitField0_ |= 0x00000002;
          }
          if (assetOneofCase_ == 3) {
            if (titleBuilder_ == null) {
              result.assetOneof_ = assetOneof_;
            } else {
              result.assetOneof_ = titleBuilder_.build();
            }
          }
          if (assetOneofCase_ == 4) {
            if (imgBuilder_ == null) {
              result.assetOneof_ = assetOneof_;
            } else {
              result.assetOneof_ = imgBuilder_.build();
            }
          }
          if (assetOneofCase_ == 5) {
            if (videoBuilder_ == null) {
              result.assetOneof_ = assetOneof_;
            } else {
              result.assetOneof_ = videoBuilder_.build();
            }
          }
          if (assetOneofCase_ == 6) {
            if (dataBuilder_ == null) {
              result.assetOneof_ = assetOneof_;
            } else {
              result.assetOneof_ = dataBuilder_.build();
            }
          }
          result.bitField0_ = to_bitField0_;
          result.assetOneofCase_ = assetOneofCase_;
          onBuilt();
          return result;
        }

        @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 <Type> Builder setExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset, Type> extension,
            Type value) {
          return super.setExtension(extension, value);
        }
        @java.lang.Override
        public <Type> Builder setExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset, java.util.List<Type>> extension,
            int index, Type value) {
          return super.setExtension(extension, index, value);
        }
        @java.lang.Override
        public <Type> Builder addExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset, java.util.List<Type>> extension,
            Type value) {
          return super.addExtension(extension, value);
        }
        @java.lang.Override
        public <Type> Builder clearExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset, ?> extension) {
          return super.clearExtension(extension);
        }
        @java.lang.Override
        public Builder mergeFrom(com.google.protobuf.Message other) {
          if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset) {
            return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset)other);
          } else {
            super.mergeFrom(other);
            return this;
          }
        }

        public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset other) {
          if (other == com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.getDefaultInstance()) return this;
          if (other.hasId()) {
            setId(other.getId());
          }
          if (other.hasRequired()) {
            setRequired(other.getRequired());
          }
          switch (other.getAssetOneofCase()) {
            case TITLE: {
              mergeTitle(other.getTitle());
              break;
            }
            case IMG: {
              mergeImg(other.getImg());
              break;
            }
            case VIDEO: {
              mergeVideo(other.getVideo());
              break;
            }
            case DATA: {
              mergeData(other.getData());
              break;
            }
            case ASSETONEOF_NOT_SET: {
              break;
            }
          }
          this.mergeExtensionFields(other);
          this.mergeUnknownFields(other.unknownFields);
          onChanged();
          return this;
        }

        @java.lang.Override
        public final boolean isInitialized() {
          if (!hasId()) {
            return false;
          }
          if (hasTitle()) {
            if (!getTitle().isInitialized()) {
              return false;
            }
          }
          if (hasImg()) {
            if (!getImg().isInitialized()) {
              return false;
            }
          }
          if (hasVideo()) {
            if (!getVideo().isInitialized()) {
              return false;
            }
          }
          if (hasData()) {
            if (!getData().isInitialized()) {
              return false;
            }
          }
          if (!extensionsAreInitialized()) {
            return false;
          }
          return true;
        }

        @java.lang.Override
        public Builder mergeFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws java.io.IOException {
          com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset parsedMessage = null;
          try {
            parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset) e.getUnfinishedMessage();
            throw e.unwrapIOException();
          } finally {
            if (parsedMessage != null) {
              mergeFrom(parsedMessage);
            }
          }
          return this;
        }
        private int assetOneofCase_ = 0;
        private java.lang.Object assetOneof_;
        public AssetOneofCase
            getAssetOneofCase() {
          return AssetOneofCase.forNumber(
              assetOneofCase_);
        }

        public Builder clearAssetOneof() {
          assetOneofCase_ = 0;
          assetOneof_ = null;
          onChanged();
          return this;
        }

        private int bitField0_;

        private int id_ ;
        /**
         * <pre>
         * Unique asset ID, assigned by exchange. Typically a counter for the array.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>required int32 id = 1;</code>
         * @return Whether the id field is set.
         */
        @java.lang.Override
        public boolean hasId() {
          return ((bitField0_ & 0x00000001) != 0);
        }
        /**
         * <pre>
         * Unique asset ID, assigned by exchange. Typically a counter for the array.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>required int32 id = 1;</code>
         * @return The id.
         */
        @java.lang.Override
        public int getId() {
          return id_;
        }
        /**
         * <pre>
         * Unique asset ID, assigned by exchange. Typically a counter for the array.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>required int32 id = 1;</code>
         * @param value The id to set.
         * @return This builder for chaining.
         */
        public Builder setId(int value) {
          bitField0_ |= 0x00000001;
          id_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Unique asset ID, assigned by exchange. Typically a counter for the array.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>required int32 id = 1;</code>
         * @return This builder for chaining.
         */
        public Builder clearId() {
          bitField0_ = (bitField0_ & ~0x00000001);
          id_ = 0;
          onChanged();
          return this;
        }

        private boolean required_ ;
        /**
         * <pre>
         * Set to true if asset is required
         * (exchange will not accept a bid without it).
         * </pre>
         *
         * <code>optional bool required = 2 [default = false];</code>
         * @return Whether the required field is set.
         */
        @java.lang.Override
        public boolean hasRequired() {
          return ((bitField0_ & 0x00000002) != 0);
        }
        /**
         * <pre>
         * Set to true if asset is required
         * (exchange will not accept a bid without it).
         * </pre>
         *
         * <code>optional bool required = 2 [default = false];</code>
         * @return The required.
         */
        @java.lang.Override
        public boolean getRequired() {
          return required_;
        }
        /**
         * <pre>
         * Set to true if asset is required
         * (exchange will not accept a bid without it).
         * </pre>
         *
         * <code>optional bool required = 2 [default = false];</code>
         * @param value The required to set.
         * @return This builder for chaining.
         */
        public Builder setRequired(boolean value) {
          bitField0_ |= 0x00000002;
          required_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Set to true if asset is required
         * (exchange will not accept a bid without it).
         * </pre>
         *
         * <code>optional bool required = 2 [default = false];</code>
         * @return This builder for chaining.
         */
        public Builder clearRequired() {
          bitField0_ = (bitField0_ & ~0x00000002);
          required_ = false;
          onChanged();
          return this;
        }

        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title.Builder, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.TitleOrBuilder> titleBuilder_;
        /**
         * <pre>
         * Title object for title assets.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeRequest.Asset.Title title = 3;</code>
         * @return Whether the title field is set.
         */
        @java.lang.Override
        public boolean hasTitle() {
          return assetOneofCase_ == 3;
        }
        /**
         * <pre>
         * Title object for title assets.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeRequest.Asset.Title title = 3;</code>
         * @return The title.
         */
        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title getTitle() {
          if (titleBuilder_ == null) {
            if (assetOneofCase_ == 3) {
              return (com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title) assetOneof_;
            }
            return com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title.getDefaultInstance();
          } else {
            if (assetOneofCase_ == 3) {
              return titleBuilder_.getMessage();
            }
            return com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title.getDefaultInstance();
          }
        }
        /**
         * <pre>
         * Title object for title assets.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeRequest.Asset.Title title = 3;</code>
         */
        public Builder setTitle(com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title value) {
          if (titleBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            assetOneof_ = value;
            onChanged();
          } else {
            titleBuilder_.setMessage(value);
          }
          assetOneofCase_ = 3;
          return this;
        }
        /**
         * <pre>
         * Title object for title assets.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeRequest.Asset.Title title = 3;</code>
         */
        public Builder setTitle(
            com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title.Builder builderForValue) {
          if (titleBuilder_ == null) {
            assetOneof_ = builderForValue.build();
            onChanged();
          } else {
            titleBuilder_.setMessage(builderForValue.build());
          }
          assetOneofCase_ = 3;
          return this;
        }
        /**
         * <pre>
         * Title object for title assets.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeRequest.Asset.Title title = 3;</code>
         */
        public Builder mergeTitle(com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title value) {
          if (titleBuilder_ == null) {
            if (assetOneofCase_ == 3 &&
                assetOneof_ != com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title.getDefaultInstance()) {
              assetOneof_ = com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title.newBuilder((com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title) assetOneof_)
                  .mergeFrom(value).buildPartial();
            } else {
              assetOneof_ = value;
            }
            onChanged();
          } else {
            if (assetOneofCase_ == 3) {
              titleBuilder_.mergeFrom(value);
            }
            titleBuilder_.setMessage(value);
          }
          assetOneofCase_ = 3;
          return this;
        }
        /**
         * <pre>
         * Title object for title assets.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeRequest.Asset.Title title = 3;</code>
         */
        public Builder clearTitle() {
          if (titleBuilder_ == null) {
            if (assetOneofCase_ == 3) {
              assetOneofCase_ = 0;
              assetOneof_ = null;
              onChanged();
            }
          } else {
            if (assetOneofCase_ == 3) {
              assetOneofCase_ = 0;
              assetOneof_ = null;
            }
            titleBuilder_.clear();
          }
          return this;
        }
        /**
         * <pre>
         * Title object for title assets.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeRequest.Asset.Title title = 3;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title.Builder getTitleBuilder() {
          return getTitleFieldBuilder().getBuilder();
        }
        /**
         * <pre>
         * Title object for title assets.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeRequest.Asset.Title title = 3;</code>
         */
        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.TitleOrBuilder getTitleOrBuilder() {
          if ((assetOneofCase_ == 3) && (titleBuilder_ != null)) {
            return titleBuilder_.getMessageOrBuilder();
          } else {
            if (assetOneofCase_ == 3) {
              return (com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title) assetOneof_;
            }
            return com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title.getDefaultInstance();
          }
        }
        /**
         * <pre>
         * Title object for title assets.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeRequest.Asset.Title title = 3;</code>
         */
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title.Builder, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.TitleOrBuilder> 
            getTitleFieldBuilder() {
          if (titleBuilder_ == null) {
            if (!(assetOneofCase_ == 3)) {
              assetOneof_ = com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title.getDefaultInstance();
            }
            titleBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
                com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title.Builder, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.TitleOrBuilder>(
                    (com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Title) assetOneof_,
                    getParentForChildren(),
                    isClean());
            assetOneof_ = null;
          }
          assetOneofCase_ = 3;
          onChanged();;
          return titleBuilder_;
        }

        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image.Builder, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.ImageOrBuilder> imgBuilder_;
        /**
         * <pre>
         * Image object for image assets.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeRequest.Asset.Image img = 4;</code>
         * @return Whether the img field is set.
         */
        @java.lang.Override
        public boolean hasImg() {
          return assetOneofCase_ == 4;
        }
        /**
         * <pre>
         * Image object for image assets.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeRequest.Asset.Image img = 4;</code>
         * @return The img.
         */
        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image getImg() {
          if (imgBuilder_ == null) {
            if (assetOneofCase_ == 4) {
              return (com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image) assetOneof_;
            }
            return com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image.getDefaultInstance();
          } else {
            if (assetOneofCase_ == 4) {
              return imgBuilder_.getMessage();
            }
            return com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image.getDefaultInstance();
          }
        }
        /**
         * <pre>
         * Image object for image assets.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeRequest.Asset.Image img = 4;</code>
         */
        public Builder setImg(com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image value) {
          if (imgBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            assetOneof_ = value;
            onChanged();
          } else {
            imgBuilder_.setMessage(value);
          }
          assetOneofCase_ = 4;
          return this;
        }
        /**
         * <pre>
         * Image object for image assets.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeRequest.Asset.Image img = 4;</code>
         */
        public Builder setImg(
            com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image.Builder builderForValue) {
          if (imgBuilder_ == null) {
            assetOneof_ = builderForValue.build();
            onChanged();
          } else {
            imgBuilder_.setMessage(builderForValue.build());
          }
          assetOneofCase_ = 4;
          return this;
        }
        /**
         * <pre>
         * Image object for image assets.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeRequest.Asset.Image img = 4;</code>
         */
        public Builder mergeImg(com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image value) {
          if (imgBuilder_ == null) {
            if (assetOneofCase_ == 4 &&
                assetOneof_ != com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image.getDefaultInstance()) {
              assetOneof_ = com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image.newBuilder((com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image) assetOneof_)
                  .mergeFrom(value).buildPartial();
            } else {
              assetOneof_ = value;
            }
            onChanged();
          } else {
            if (assetOneofCase_ == 4) {
              imgBuilder_.mergeFrom(value);
            }
            imgBuilder_.setMessage(value);
          }
          assetOneofCase_ = 4;
          return this;
        }
        /**
         * <pre>
         * Image object for image assets.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeRequest.Asset.Image img = 4;</code>
         */
        public Builder clearImg() {
          if (imgBuilder_ == null) {
            if (assetOneofCase_ == 4) {
              assetOneofCase_ = 0;
              assetOneof_ = null;
              onChanged();
            }
          } else {
            if (assetOneofCase_ == 4) {
              assetOneofCase_ = 0;
              assetOneof_ = null;
            }
            imgBuilder_.clear();
          }
          return this;
        }
        /**
         * <pre>
         * Image object for image assets.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeRequest.Asset.Image img = 4;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image.Builder getImgBuilder() {
          return getImgFieldBuilder().getBuilder();
        }
        /**
         * <pre>
         * Image object for image assets.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeRequest.Asset.Image img = 4;</code>
         */
        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.ImageOrBuilder getImgOrBuilder() {
          if ((assetOneofCase_ == 4) && (imgBuilder_ != null)) {
            return imgBuilder_.getMessageOrBuilder();
          } else {
            if (assetOneofCase_ == 4) {
              return (com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image) assetOneof_;
            }
            return com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image.getDefaultInstance();
          }
        }
        /**
         * <pre>
         * Image object for image assets.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeRequest.Asset.Image img = 4;</code>
         */
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image.Builder, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.ImageOrBuilder> 
            getImgFieldBuilder() {
          if (imgBuilder_ == null) {
            if (!(assetOneofCase_ == 4)) {
              assetOneof_ = com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image.getDefaultInstance();
            }
            imgBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
                com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image.Builder, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.ImageOrBuilder>(
                    (com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Image) assetOneof_,
                    getParentForChildren(),
                    isClean());
            assetOneof_ = null;
          }
          assetOneofCase_ = 4;
          onChanged();;
          return imgBuilder_;
        }

        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.VideoOrBuilder> videoBuilder_;
        /**
         * <pre>
         * Video object for video assets.
         * Note that in-stream video ads are not part of Native.
         * Native ads may contain a video as the ad creative itself.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.BidRequest.Imp.Video video = 5;</code>
         * @return Whether the video field is set.
         */
        @java.lang.Override
        public boolean hasVideo() {
          return assetOneofCase_ == 5;
        }
        /**
         * <pre>
         * Video object for video assets.
         * Note that in-stream video ads are not part of Native.
         * Native ads may contain a video as the ad creative itself.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.BidRequest.Imp.Video video = 5;</code>
         * @return The video.
         */
        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video getVideo() {
          if (videoBuilder_ == null) {
            if (assetOneofCase_ == 5) {
              return (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video) assetOneof_;
            }
            return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.getDefaultInstance();
          } else {
            if (assetOneofCase_ == 5) {
              return videoBuilder_.getMessage();
            }
            return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.getDefaultInstance();
          }
        }
        /**
         * <pre>
         * Video object for video assets.
         * Note that in-stream video ads are not part of Native.
         * Native ads may contain a video as the ad creative itself.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.BidRequest.Imp.Video video = 5;</code>
         */
        public Builder setVideo(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video value) {
          if (videoBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            assetOneof_ = value;
            onChanged();
          } else {
            videoBuilder_.setMessage(value);
          }
          assetOneofCase_ = 5;
          return this;
        }
        /**
         * <pre>
         * Video object for video assets.
         * Note that in-stream video ads are not part of Native.
         * Native ads may contain a video as the ad creative itself.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.BidRequest.Imp.Video video = 5;</code>
         */
        public Builder setVideo(
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.Builder builderForValue) {
          if (videoBuilder_ == null) {
            assetOneof_ = builderForValue.build();
            onChanged();
          } else {
            videoBuilder_.setMessage(builderForValue.build());
          }
          assetOneofCase_ = 5;
          return this;
        }
        /**
         * <pre>
         * Video object for video assets.
         * Note that in-stream video ads are not part of Native.
         * Native ads may contain a video as the ad creative itself.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.BidRequest.Imp.Video video = 5;</code>
         */
        public Builder mergeVideo(com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video value) {
          if (videoBuilder_ == null) {
            if (assetOneofCase_ == 5 &&
                assetOneof_ != com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.getDefaultInstance()) {
              assetOneof_ = com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.newBuilder((com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video) assetOneof_)
                  .mergeFrom(value).buildPartial();
            } else {
              assetOneof_ = value;
            }
            onChanged();
          } else {
            if (assetOneofCase_ == 5) {
              videoBuilder_.mergeFrom(value);
            }
            videoBuilder_.setMessage(value);
          }
          assetOneofCase_ = 5;
          return this;
        }
        /**
         * <pre>
         * Video object for video assets.
         * Note that in-stream video ads are not part of Native.
         * Native ads may contain a video as the ad creative itself.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.BidRequest.Imp.Video video = 5;</code>
         */
        public Builder clearVideo() {
          if (videoBuilder_ == null) {
            if (assetOneofCase_ == 5) {
              assetOneofCase_ = 0;
              assetOneof_ = null;
              onChanged();
            }
          } else {
            if (assetOneofCase_ == 5) {
              assetOneofCase_ = 0;
              assetOneof_ = null;
            }
            videoBuilder_.clear();
          }
          return this;
        }
        /**
         * <pre>
         * Video object for video assets.
         * Note that in-stream video ads are not part of Native.
         * Native ads may contain a video as the ad creative itself.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.BidRequest.Imp.Video video = 5;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.Builder getVideoBuilder() {
          return getVideoFieldBuilder().getBuilder();
        }
        /**
         * <pre>
         * Video object for video assets.
         * Note that in-stream video ads are not part of Native.
         * Native ads may contain a video as the ad creative itself.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.BidRequest.Imp.Video video = 5;</code>
         */
        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.VideoOrBuilder getVideoOrBuilder() {
          if ((assetOneofCase_ == 5) && (videoBuilder_ != null)) {
            return videoBuilder_.getMessageOrBuilder();
          } else {
            if (assetOneofCase_ == 5) {
              return (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video) assetOneof_;
            }
            return com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.getDefaultInstance();
          }
        }
        /**
         * <pre>
         * Video object for video assets.
         * Note that in-stream video ads are not part of Native.
         * Native ads may contain a video as the ad creative itself.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.BidRequest.Imp.Video video = 5;</code>
         */
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.VideoOrBuilder> 
            getVideoFieldBuilder() {
          if (videoBuilder_ == null) {
            if (!(assetOneofCase_ == 5)) {
              assetOneof_ = com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.getDefaultInstance();
            }
            videoBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
                com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video.Builder, com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.VideoOrBuilder>(
                    (com.iabtechlab.openrtb.v2.OpenRtb.BidRequest.Imp.Video) assetOneof_,
                    getParentForChildren(),
                    isClean());
            assetOneof_ = null;
          }
          assetOneofCase_ = 5;
          onChanged();;
          return videoBuilder_;
        }

        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data.Builder, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.DataOrBuilder> dataBuilder_;
        /**
         * <pre>
         * Data object for brand name, description, ratings, prices etc.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeRequest.Asset.Data data = 6;</code>
         * @return Whether the data field is set.
         */
        @java.lang.Override
        public boolean hasData() {
          return assetOneofCase_ == 6;
        }
        /**
         * <pre>
         * Data object for brand name, description, ratings, prices etc.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeRequest.Asset.Data data = 6;</code>
         * @return The data.
         */
        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data getData() {
          if (dataBuilder_ == null) {
            if (assetOneofCase_ == 6) {
              return (com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data) assetOneof_;
            }
            return com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data.getDefaultInstance();
          } else {
            if (assetOneofCase_ == 6) {
              return dataBuilder_.getMessage();
            }
            return com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data.getDefaultInstance();
          }
        }
        /**
         * <pre>
         * Data object for brand name, description, ratings, prices etc.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeRequest.Asset.Data data = 6;</code>
         */
        public Builder setData(com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data value) {
          if (dataBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            assetOneof_ = value;
            onChanged();
          } else {
            dataBuilder_.setMessage(value);
          }
          assetOneofCase_ = 6;
          return this;
        }
        /**
         * <pre>
         * Data object for brand name, description, ratings, prices etc.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeRequest.Asset.Data data = 6;</code>
         */
        public Builder setData(
            com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data.Builder builderForValue) {
          if (dataBuilder_ == null) {
            assetOneof_ = builderForValue.build();
            onChanged();
          } else {
            dataBuilder_.setMessage(builderForValue.build());
          }
          assetOneofCase_ = 6;
          return this;
        }
        /**
         * <pre>
         * Data object for brand name, description, ratings, prices etc.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeRequest.Asset.Data data = 6;</code>
         */
        public Builder mergeData(com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data value) {
          if (dataBuilder_ == null) {
            if (assetOneofCase_ == 6 &&
                assetOneof_ != com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data.getDefaultInstance()) {
              assetOneof_ = com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data.newBuilder((com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data) assetOneof_)
                  .mergeFrom(value).buildPartial();
            } else {
              assetOneof_ = value;
            }
            onChanged();
          } else {
            if (assetOneofCase_ == 6) {
              dataBuilder_.mergeFrom(value);
            }
            dataBuilder_.setMessage(value);
          }
          assetOneofCase_ = 6;
          return this;
        }
        /**
         * <pre>
         * Data object for brand name, description, ratings, prices etc.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeRequest.Asset.Data data = 6;</code>
         */
        public Builder clearData() {
          if (dataBuilder_ == null) {
            if (assetOneofCase_ == 6) {
              assetOneofCase_ = 0;
              assetOneof_ = null;
              onChanged();
            }
          } else {
            if (assetOneofCase_ == 6) {
              assetOneofCase_ = 0;
              assetOneof_ = null;
            }
            dataBuilder_.clear();
          }
          return this;
        }
        /**
         * <pre>
         * Data object for brand name, description, ratings, prices etc.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeRequest.Asset.Data data = 6;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data.Builder getDataBuilder() {
          return getDataFieldBuilder().getBuilder();
        }
        /**
         * <pre>
         * Data object for brand name, description, ratings, prices etc.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeRequest.Asset.Data data = 6;</code>
         */
        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.DataOrBuilder getDataOrBuilder() {
          if ((assetOneofCase_ == 6) && (dataBuilder_ != null)) {
            return dataBuilder_.getMessageOrBuilder();
          } else {
            if (assetOneofCase_ == 6) {
              return (com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data) assetOneof_;
            }
            return com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data.getDefaultInstance();
          }
        }
        /**
         * <pre>
         * Data object for brand name, description, ratings, prices etc.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeRequest.Asset.Data data = 6;</code>
         */
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data.Builder, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.DataOrBuilder> 
            getDataFieldBuilder() {
          if (dataBuilder_ == null) {
            if (!(assetOneofCase_ == 6)) {
              assetOneof_ = com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data.getDefaultInstance();
            }
            dataBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
                com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data.Builder, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.DataOrBuilder>(
                    (com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Data) assetOneof_,
                    getParentForChildren(),
                    isClean());
            assetOneof_ = null;
          }
          assetOneofCase_ = 6;
          onChanged();;
          return dataBuilder_;
        }
        @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:com.iabtechlab.openrtb.v2.NativeRequest.Asset)
      }

      // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.NativeRequest.Asset)
      private static final com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset DEFAULT_INSTANCE;
      static {
        DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset();
      }

      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset getDefaultInstance() {
        return DEFAULT_INSTANCE;
      }

      @java.lang.Deprecated public static final com.google.protobuf.Parser<Asset>
          PARSER = new com.google.protobuf.AbstractParser<Asset>() {
        @java.lang.Override
        public Asset parsePartialFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return new Asset(input, extensionRegistry);
        }
      };

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

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

      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset getDefaultInstanceForType() {
        return DEFAULT_INSTANCE;
      }

    }

    public interface EventTrackersOrBuilder extends
        // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.NativeRequest.EventTrackers)
        com.google.protobuf.GeneratedMessageV3.
            ExtendableMessageOrBuilder<EventTrackers> {

      /**
       * <pre>
       * Type of event available for tracking.
       * Refer to enum com.iabtechlab.adcom.v1.EventType for generic values.
       * REQUIRED by the OpenRTB Native specification.
       * </pre>
       *
       * <code>required int32 event = 1;</code>
       * @return Whether the event field is set.
       */
      boolean hasEvent();
      /**
       * <pre>
       * Type of event available for tracking.
       * Refer to enum com.iabtechlab.adcom.v1.EventType for generic values.
       * REQUIRED by the OpenRTB Native specification.
       * </pre>
       *
       * <code>required int32 event = 1;</code>
       * @return The event.
       */
      int getEvent();

      /**
       * <pre>
       * Array of types of tracking available for the given event.
       * Refer to enum com.iabtechlab.adcom.v1.enums.EventTrackingMethod for generic values.
       * REQUIRED by the OpenRTB Native specification.
       * </pre>
       *
       * <code>repeated int32 methods = 2;</code>
       * @return A list containing the methods.
       */
      java.util.List<java.lang.Integer> getMethodsList();
      /**
       * <pre>
       * Array of types of tracking available for the given event.
       * Refer to enum com.iabtechlab.adcom.v1.enums.EventTrackingMethod for generic values.
       * REQUIRED by the OpenRTB Native specification.
       * </pre>
       *
       * <code>repeated int32 methods = 2;</code>
       * @return The count of methods.
       */
      int getMethodsCount();
      /**
       * <pre>
       * Array of types of tracking available for the given event.
       * Refer to enum com.iabtechlab.adcom.v1.enums.EventTrackingMethod for generic values.
       * REQUIRED by the OpenRTB Native specification.
       * </pre>
       *
       * <code>repeated int32 methods = 2;</code>
       * @param index The index of the element to return.
       * @return The methods at the given index.
       */
      int getMethods(int index);
    }
    /**
     * <pre>
     * OpenRTB Native 1.2: The EventTrackers object specifies the type of events
     * the bidder can request to be tracked in the bid response, and which types
     * of tracking are available for each event type, and is included as an array
     * in the request.
     * </pre>
     *
     * Protobuf type {@code com.iabtechlab.openrtb.v2.NativeRequest.EventTrackers}
     */
    public static final class EventTrackers extends
        com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
          EventTrackers> implements
        // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.NativeRequest.EventTrackers)
        EventTrackersOrBuilder {
    private static final long serialVersionUID = 0L;
      // Use EventTrackers.newBuilder() to construct.
      private EventTrackers(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers, ?> builder) {
        super(builder);
      }
      private EventTrackers() {
        methods_ = emptyIntList();
      }

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

      @java.lang.Override
      public final com.google.protobuf.UnknownFieldSet
      getUnknownFields() {
        return this.unknownFields;
      }
      private EventTrackers(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        this();
        if (extensionRegistry == null) {
          throw new java.lang.NullPointerException();
        }
        int mutable_bitField0_ = 0;
        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
            com.google.protobuf.UnknownFieldSet.newBuilder();
        try {
          boolean done = false;
          while (!done) {
            int tag = input.readTag();
            switch (tag) {
              case 0:
                done = true;
                break;
              case 8: {
                bitField0_ |= 0x00000001;
                event_ = input.readInt32();
                break;
              }
              case 16: {
                if (!((mutable_bitField0_ & 0x00000002) != 0)) {
                  methods_ = newIntList();
                  mutable_bitField0_ |= 0x00000002;
                }
                methods_.addInt(input.readInt32());
                break;
              }
              case 18: {
                int length = input.readRawVarint32();
                int limit = input.pushLimit(length);
                if (!((mutable_bitField0_ & 0x00000002) != 0) && input.getBytesUntilLimit() > 0) {
                  methods_ = newIntList();
                  mutable_bitField0_ |= 0x00000002;
                }
                while (input.getBytesUntilLimit() > 0) {
                  methods_.addInt(input.readInt32());
                }
                input.popLimit(limit);
                break;
              }
              default: {
                if (!parseUnknownField(
                    input, unknownFields, extensionRegistry, tag)) {
                  done = true;
                }
                break;
              }
            }
          }
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          throw e.setUnfinishedMessage(this);
        } catch (java.io.IOException e) {
          throw new com.google.protobuf.InvalidProtocolBufferException(
              e).setUnfinishedMessage(this);
        } finally {
          if (((mutable_bitField0_ & 0x00000002) != 0)) {
            methods_.makeImmutable(); // C
          }
          this.unknownFields = unknownFields.build();
          makeExtensionsImmutable();
        }
      }
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeRequest_EventTrackers_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeRequest_EventTrackers_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers.class, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers.Builder.class);
      }

      private int bitField0_;
      public static final int EVENT_FIELD_NUMBER = 1;
      private int event_;
      /**
       * <pre>
       * Type of event available for tracking.
       * Refer to enum com.iabtechlab.adcom.v1.EventType for generic values.
       * REQUIRED by the OpenRTB Native specification.
       * </pre>
       *
       * <code>required int32 event = 1;</code>
       * @return Whether the event field is set.
       */
      @java.lang.Override
      public boolean hasEvent() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <pre>
       * Type of event available for tracking.
       * Refer to enum com.iabtechlab.adcom.v1.EventType for generic values.
       * REQUIRED by the OpenRTB Native specification.
       * </pre>
       *
       * <code>required int32 event = 1;</code>
       * @return The event.
       */
      @java.lang.Override
      public int getEvent() {
        return event_;
      }

      public static final int METHODS_FIELD_NUMBER = 2;
      private com.google.protobuf.Internal.IntList methods_;
      /**
       * <pre>
       * Array of types of tracking available for the given event.
       * Refer to enum com.iabtechlab.adcom.v1.enums.EventTrackingMethod for generic values.
       * REQUIRED by the OpenRTB Native specification.
       * </pre>
       *
       * <code>repeated int32 methods = 2;</code>
       * @return A list containing the methods.
       */
      @java.lang.Override
      public java.util.List<java.lang.Integer>
          getMethodsList() {
        return methods_;
      }
      /**
       * <pre>
       * Array of types of tracking available for the given event.
       * Refer to enum com.iabtechlab.adcom.v1.enums.EventTrackingMethod for generic values.
       * REQUIRED by the OpenRTB Native specification.
       * </pre>
       *
       * <code>repeated int32 methods = 2;</code>
       * @return The count of methods.
       */
      public int getMethodsCount() {
        return methods_.size();
      }
      /**
       * <pre>
       * Array of types of tracking available for the given event.
       * Refer to enum com.iabtechlab.adcom.v1.enums.EventTrackingMethod for generic values.
       * REQUIRED by the OpenRTB Native specification.
       * </pre>
       *
       * <code>repeated int32 methods = 2;</code>
       * @param index The index of the element to return.
       * @return The methods at the given index.
       */
      public int getMethods(int index) {
        return methods_.getInt(index);
      }

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

        if (!hasEvent()) {
          memoizedIsInitialized = 0;
          return false;
        }
        if (!extensionsAreInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
        memoizedIsInitialized = 1;
        return true;
      }

      @java.lang.Override
      public void writeTo(com.google.protobuf.CodedOutputStream output)
                          throws java.io.IOException {
        com.google.protobuf.GeneratedMessageV3
          .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers>.ExtensionWriter
            extensionWriter = newExtensionWriter();
        if (((bitField0_ & 0x00000001) != 0)) {
          output.writeInt32(1, event_);
        }
        for (int i = 0; i < methods_.size(); i++) {
          output.writeInt32(2, methods_.getInt(i));
        }
        extensionWriter.writeUntil(10000, output);
        unknownFields.writeTo(output);
      }

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

        size = 0;
        if (((bitField0_ & 0x00000001) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeInt32Size(1, event_);
        }
        {
          int dataSize = 0;
          for (int i = 0; i < methods_.size(); i++) {
            dataSize += com.google.protobuf.CodedOutputStream
              .computeInt32SizeNoTag(methods_.getInt(i));
          }
          size += dataSize;
          size += 1 * getMethodsList().size();
        }
        size += extensionsSerializedSize();
        size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers)) {
          return super.equals(obj);
        }
        com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers other = (com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers) obj;

        if (hasEvent() != other.hasEvent()) return false;
        if (hasEvent()) {
          if (getEvent()
              != other.getEvent()) return false;
        }
        if (!getMethodsList()
            .equals(other.getMethodsList())) return false;
        if (!unknownFields.equals(other.unknownFields)) return false;
        if (!getExtensionFields().equals(other.getExtensionFields()))
          return false;
        return true;
      }

      @java.lang.Override
      public int hashCode() {
        if (memoizedHashCode != 0) {
          return memoizedHashCode;
        }
        int hash = 41;
        hash = (19 * hash) + getDescriptor().hashCode();
        if (hasEvent()) {
          hash = (37 * hash) + EVENT_FIELD_NUMBER;
          hash = (53 * hash) + getEvent();
        }
        if (getMethodsCount() > 0) {
          hash = (37 * hash) + METHODS_FIELD_NUMBER;
          hash = (53 * hash) + getMethodsList().hashCode();
        }
        hash = hashFields(hash, getExtensionFields());
        hash = (29 * hash) + unknownFields.hashCode();
        memoizedHashCode = hash;
        return hash;
      }

      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers parseFrom(
          java.nio.ByteBuffer data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers parseFrom(
          java.nio.ByteBuffer data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers parseFrom(
          com.google.protobuf.ByteString data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers parseFrom(
          com.google.protobuf.ByteString data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers parseFrom(byte[] data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers parseFrom(
          byte[] data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers parseFrom(java.io.InputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers 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.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers parseDelimitedFrom(java.io.InputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseDelimitedWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers 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.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers parseFrom(
          com.google.protobuf.CodedInputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers 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.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers 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>
       * OpenRTB Native 1.2: The EventTrackers object specifies the type of events
       * the bidder can request to be tracked in the bid response, and which types
       * of tracking are available for each event type, and is included as an array
       * in the request.
       * </pre>
       *
       * Protobuf type {@code com.iabtechlab.openrtb.v2.NativeRequest.EventTrackers}
       */
      public static final class Builder extends
          com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
            com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers, Builder> implements
          // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.NativeRequest.EventTrackers)
          com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackersOrBuilder {
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeRequest_EventTrackers_descriptor;
        }

        @java.lang.Override
        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeRequest_EventTrackers_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers.class, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers.Builder.class);
        }

        // Construct using com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers.newBuilder()
        private Builder() {
          maybeForceBuilderInitialization();
        }

        private Builder(
            com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
          super(parent);
          maybeForceBuilderInitialization();
        }
        private void maybeForceBuilderInitialization() {
          if (com.google.protobuf.GeneratedMessageV3
                  .alwaysUseFieldBuilders) {
          }
        }
        @java.lang.Override
        public Builder clear() {
          super.clear();
          event_ = 0;
          bitField0_ = (bitField0_ & ~0x00000001);
          methods_ = emptyIntList();
          bitField0_ = (bitField0_ & ~0x00000002);
          return this;
        }

        @java.lang.Override
        public com.google.protobuf.Descriptors.Descriptor
            getDescriptorForType() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeRequest_EventTrackers_descriptor;
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers getDefaultInstanceForType() {
          return com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers.getDefaultInstance();
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers build() {
          com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers result = buildPartial();
          if (!result.isInitialized()) {
            throw newUninitializedMessageException(result);
          }
          return result;
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers buildPartial() {
          com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers result = new com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers(this);
          int from_bitField0_ = bitField0_;
          int to_bitField0_ = 0;
          if (((from_bitField0_ & 0x00000001) != 0)) {
            result.event_ = event_;
            to_bitField0_ |= 0x00000001;
          }
          if (((bitField0_ & 0x00000002) != 0)) {
            methods_.makeImmutable();
            bitField0_ = (bitField0_ & ~0x00000002);
          }
          result.methods_ = methods_;
          result.bitField0_ = to_bitField0_;
          onBuilt();
          return result;
        }

        @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 <Type> Builder setExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers, Type> extension,
            Type value) {
          return super.setExtension(extension, value);
        }
        @java.lang.Override
        public <Type> Builder setExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers, java.util.List<Type>> extension,
            int index, Type value) {
          return super.setExtension(extension, index, value);
        }
        @java.lang.Override
        public <Type> Builder addExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers, java.util.List<Type>> extension,
            Type value) {
          return super.addExtension(extension, value);
        }
        @java.lang.Override
        public <Type> Builder clearExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers, ?> extension) {
          return super.clearExtension(extension);
        }
        @java.lang.Override
        public Builder mergeFrom(com.google.protobuf.Message other) {
          if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers) {
            return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers)other);
          } else {
            super.mergeFrom(other);
            return this;
          }
        }

        public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers other) {
          if (other == com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers.getDefaultInstance()) return this;
          if (other.hasEvent()) {
            setEvent(other.getEvent());
          }
          if (!other.methods_.isEmpty()) {
            if (methods_.isEmpty()) {
              methods_ = other.methods_;
              bitField0_ = (bitField0_ & ~0x00000002);
            } else {
              ensureMethodsIsMutable();
              methods_.addAll(other.methods_);
            }
            onChanged();
          }
          this.mergeExtensionFields(other);
          this.mergeUnknownFields(other.unknownFields);
          onChanged();
          return this;
        }

        @java.lang.Override
        public final boolean isInitialized() {
          if (!hasEvent()) {
            return false;
          }
          if (!extensionsAreInitialized()) {
            return false;
          }
          return true;
        }

        @java.lang.Override
        public Builder mergeFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws java.io.IOException {
          com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers parsedMessage = null;
          try {
            parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers) e.getUnfinishedMessage();
            throw e.unwrapIOException();
          } finally {
            if (parsedMessage != null) {
              mergeFrom(parsedMessage);
            }
          }
          return this;
        }
        private int bitField0_;

        private int event_ ;
        /**
         * <pre>
         * Type of event available for tracking.
         * Refer to enum com.iabtechlab.adcom.v1.EventType for generic values.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>required int32 event = 1;</code>
         * @return Whether the event field is set.
         */
        @java.lang.Override
        public boolean hasEvent() {
          return ((bitField0_ & 0x00000001) != 0);
        }
        /**
         * <pre>
         * Type of event available for tracking.
         * Refer to enum com.iabtechlab.adcom.v1.EventType for generic values.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>required int32 event = 1;</code>
         * @return The event.
         */
        @java.lang.Override
        public int getEvent() {
          return event_;
        }
        /**
         * <pre>
         * Type of event available for tracking.
         * Refer to enum com.iabtechlab.adcom.v1.EventType for generic values.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>required int32 event = 1;</code>
         * @param value The event to set.
         * @return This builder for chaining.
         */
        public Builder setEvent(int value) {
          bitField0_ |= 0x00000001;
          event_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Type of event available for tracking.
         * Refer to enum com.iabtechlab.adcom.v1.EventType for generic values.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>required int32 event = 1;</code>
         * @return This builder for chaining.
         */
        public Builder clearEvent() {
          bitField0_ = (bitField0_ & ~0x00000001);
          event_ = 0;
          onChanged();
          return this;
        }

        private com.google.protobuf.Internal.IntList methods_ = emptyIntList();
        private void ensureMethodsIsMutable() {
          if (!((bitField0_ & 0x00000002) != 0)) {
            methods_ = mutableCopy(methods_);
            bitField0_ |= 0x00000002;
           }
        }
        /**
         * <pre>
         * Array of types of tracking available for the given event.
         * Refer to enum com.iabtechlab.adcom.v1.enums.EventTrackingMethod for generic values.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>repeated int32 methods = 2;</code>
         * @return A list containing the methods.
         */
        public java.util.List<java.lang.Integer>
            getMethodsList() {
          return ((bitField0_ & 0x00000002) != 0) ?
                   java.util.Collections.unmodifiableList(methods_) : methods_;
        }
        /**
         * <pre>
         * Array of types of tracking available for the given event.
         * Refer to enum com.iabtechlab.adcom.v1.enums.EventTrackingMethod for generic values.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>repeated int32 methods = 2;</code>
         * @return The count of methods.
         */
        public int getMethodsCount() {
          return methods_.size();
        }
        /**
         * <pre>
         * Array of types of tracking available for the given event.
         * Refer to enum com.iabtechlab.adcom.v1.enums.EventTrackingMethod for generic values.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>repeated int32 methods = 2;</code>
         * @param index The index of the element to return.
         * @return The methods at the given index.
         */
        public int getMethods(int index) {
          return methods_.getInt(index);
        }
        /**
         * <pre>
         * Array of types of tracking available for the given event.
         * Refer to enum com.iabtechlab.adcom.v1.enums.EventTrackingMethod for generic values.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>repeated int32 methods = 2;</code>
         * @param index The index to set the value at.
         * @param value The methods to set.
         * @return This builder for chaining.
         */
        public Builder setMethods(
            int index, int value) {
          ensureMethodsIsMutable();
          methods_.setInt(index, value);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Array of types of tracking available for the given event.
         * Refer to enum com.iabtechlab.adcom.v1.enums.EventTrackingMethod for generic values.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>repeated int32 methods = 2;</code>
         * @param value The methods to add.
         * @return This builder for chaining.
         */
        public Builder addMethods(int value) {
          ensureMethodsIsMutable();
          methods_.addInt(value);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Array of types of tracking available for the given event.
         * Refer to enum com.iabtechlab.adcom.v1.enums.EventTrackingMethod for generic values.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>repeated int32 methods = 2;</code>
         * @param values The methods to add.
         * @return This builder for chaining.
         */
        public Builder addAllMethods(
            java.lang.Iterable<? extends java.lang.Integer> values) {
          ensureMethodsIsMutable();
          com.google.protobuf.AbstractMessageLite.Builder.addAll(
              values, methods_);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Array of types of tracking available for the given event.
         * Refer to enum com.iabtechlab.adcom.v1.enums.EventTrackingMethod for generic values.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>repeated int32 methods = 2;</code>
         * @return This builder for chaining.
         */
        public Builder clearMethods() {
          methods_ = emptyIntList();
          bitField0_ = (bitField0_ & ~0x00000002);
          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:com.iabtechlab.openrtb.v2.NativeRequest.EventTrackers)
      }

      // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.NativeRequest.EventTrackers)
      private static final com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers DEFAULT_INSTANCE;
      static {
        DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers();
      }

      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers getDefaultInstance() {
        return DEFAULT_INSTANCE;
      }

      @java.lang.Deprecated public static final com.google.protobuf.Parser<EventTrackers>
          PARSER = new com.google.protobuf.AbstractParser<EventTrackers>() {
        @java.lang.Override
        public EventTrackers parsePartialFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return new EventTrackers(input, extensionRegistry);
        }
      };

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

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

      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers getDefaultInstanceForType() {
        return DEFAULT_INSTANCE;
      }

    }

    private int bitField0_;
    public static final int VER_FIELD_NUMBER = 1;
    private volatile java.lang.Object ver_;
    /**
     * <pre>
     * Version of the Native Markup version in use.
     * </pre>
     *
     * <code>optional string ver = 1;</code>
     * @return Whether the ver field is set.
     */
    @java.lang.Override
    public boolean hasVer() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <pre>
     * Version of the Native Markup version in use.
     * </pre>
     *
     * <code>optional string ver = 1;</code>
     * @return The ver.
     */
    @java.lang.Override
    public java.lang.String getVer() {
      java.lang.Object ref = ver_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          ver_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * Version of the Native Markup version in use.
     * </pre>
     *
     * <code>optional string ver = 1;</code>
     * @return The bytes for ver.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getVerBytes() {
      java.lang.Object ref = ver_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        ver_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int LAYOUT_FIELD_NUMBER = 2;
    private int layout_;
    /**
     * <pre>
     * The Layout ID of the native ad unit.
     * Refer to enum LayoutId for generic values.
     * RECOMMENDED by OpenRTB Native 1.0; optional in 1.1, DEPRECATED in 1.2.
     * </pre>
     *
     * <code>optional int32 layout = 2;</code>
     * @return Whether the layout field is set.
     */
    @java.lang.Override
    public boolean hasLayout() {
      return ((bitField0_ & 0x00000002) != 0);
    }
    /**
     * <pre>
     * The Layout ID of the native ad unit.
     * Refer to enum LayoutId for generic values.
     * RECOMMENDED by OpenRTB Native 1.0; optional in 1.1, DEPRECATED in 1.2.
     * </pre>
     *
     * <code>optional int32 layout = 2;</code>
     * @return The layout.
     */
    @java.lang.Override
    public int getLayout() {
      return layout_;
    }

    public static final int ADUNIT_FIELD_NUMBER = 3;
    private int adunit_;
    /**
     * <pre>
     * The Ad unit ID of the native ad unit.
     * This corresponds to one of IAB Core-6 native ad units.
     * Refer to enum AdUnitId for generic values.
     * RECOMMENDED by OpenRTB Native 1.0; optional in 1.1, DEPRECATED in 1.2.
     * </pre>
     *
     * <code>optional int32 adunit = 3;</code>
     * @return Whether the adunit field is set.
     */
    @java.lang.Override
    public boolean hasAdunit() {
      return ((bitField0_ & 0x00000004) != 0);
    }
    /**
     * <pre>
     * The Ad unit ID of the native ad unit.
     * This corresponds to one of IAB Core-6 native ad units.
     * Refer to enum AdUnitId for generic values.
     * RECOMMENDED by OpenRTB Native 1.0; optional in 1.1, DEPRECATED in 1.2.
     * </pre>
     *
     * <code>optional int32 adunit = 3;</code>
     * @return The adunit.
     */
    @java.lang.Override
    public int getAdunit() {
      return adunit_;
    }

    public static final int CONTEXT_FIELD_NUMBER = 7;
    private int context_;
    /**
     * <pre>
     * The context in which the ad appears.
     * Refer to enum ContextType for generic values.
     * RECOMMENDED in 1.2.
     * </pre>
     *
     * <code>optional int32 context = 7;</code>
     * @return Whether the context field is set.
     */
    @java.lang.Override
    public boolean hasContext() {
      return ((bitField0_ & 0x00000008) != 0);
    }
    /**
     * <pre>
     * The context in which the ad appears.
     * Refer to enum ContextType for generic values.
     * RECOMMENDED in 1.2.
     * </pre>
     *
     * <code>optional int32 context = 7;</code>
     * @return The context.
     */
    @java.lang.Override
    public int getContext() {
      return context_;
    }

    public static final int CONTEXTSUBTYPE_FIELD_NUMBER = 8;
    private int contextsubtype_;
    /**
     * <pre>
     * A more detailed context in which the ad appears.
     * Refer to enum com.iabtechlab.adcom.v1.enums.DisplayContextType for generic values.
     * </pre>
     *
     * <code>optional int32 contextsubtype = 8;</code>
     * @return Whether the contextsubtype field is set.
     */
    @java.lang.Override
    public boolean hasContextsubtype() {
      return ((bitField0_ & 0x00000010) != 0);
    }
    /**
     * <pre>
     * A more detailed context in which the ad appears.
     * Refer to enum com.iabtechlab.adcom.v1.enums.DisplayContextType for generic values.
     * </pre>
     *
     * <code>optional int32 contextsubtype = 8;</code>
     * @return The contextsubtype.
     */
    @java.lang.Override
    public int getContextsubtype() {
      return contextsubtype_;
    }

    public static final int PLCMTTYPE_FIELD_NUMBER = 9;
    private int plcmttype_;
    /**
     * <pre>
     * The design/format/layout of the ad unit being offered.
     * Refer to enum com.iabtechlab.adcom.v1.enums.DisplayPlacementType for generic values.
     * RECOMMENDED by the OpenRTB Native specification.
     * </pre>
     *
     * <code>optional int32 plcmttype = 9;</code>
     * @return Whether the plcmttype field is set.
     */
    @java.lang.Override
    public boolean hasPlcmttype() {
      return ((bitField0_ & 0x00000020) != 0);
    }
    /**
     * <pre>
     * The design/format/layout of the ad unit being offered.
     * Refer to enum com.iabtechlab.adcom.v1.enums.DisplayPlacementType for generic values.
     * RECOMMENDED by the OpenRTB Native specification.
     * </pre>
     *
     * <code>optional int32 plcmttype = 9;</code>
     * @return The plcmttype.
     */
    @java.lang.Override
    public int getPlcmttype() {
      return plcmttype_;
    }

    public static final int PLCMTCNT_FIELD_NUMBER = 4;
    private int plcmtcnt_;
    /**
     * <pre>
     * The number of identical placements in this Layout.
     * </pre>
     *
     * <code>optional int32 plcmtcnt = 4 [default = 1];</code>
     * @return Whether the plcmtcnt field is set.
     */
    @java.lang.Override
    public boolean hasPlcmtcnt() {
      return ((bitField0_ & 0x00000040) != 0);
    }
    /**
     * <pre>
     * The number of identical placements in this Layout.
     * </pre>
     *
     * <code>optional int32 plcmtcnt = 4 [default = 1];</code>
     * @return The plcmtcnt.
     */
    @java.lang.Override
    public int getPlcmtcnt() {
      return plcmtcnt_;
    }

    public static final int SEQ_FIELD_NUMBER = 5;
    private int seq_;
    /**
     * <pre>
     * 0 for the first ad, 1 for the second ad, and so on. Note this would
     * generally NOT be used in combination with plcmtcnt - either you are
     * auctioning multiple identical placements (in which case
     * plcmtcnt&gt;1, seq=0) or you are holding separate auctions for distinct
     * items in the feed (in which case plcmtcnt=1, seq&gt;=1).
     * </pre>
     *
     * <code>optional int32 seq = 5 [default = 0];</code>
     * @return Whether the seq field is set.
     */
    @java.lang.Override
    public boolean hasSeq() {
      return ((bitField0_ & 0x00000080) != 0);
    }
    /**
     * <pre>
     * 0 for the first ad, 1 for the second ad, and so on. Note this would
     * generally NOT be used in combination with plcmtcnt - either you are
     * auctioning multiple identical placements (in which case
     * plcmtcnt&gt;1, seq=0) or you are holding separate auctions for distinct
     * items in the feed (in which case plcmtcnt=1, seq&gt;=1).
     * </pre>
     *
     * <code>optional int32 seq = 5 [default = 0];</code>
     * @return The seq.
     */
    @java.lang.Override
    public int getSeq() {
      return seq_;
    }

    public static final int ASSETS_FIELD_NUMBER = 6;
    private java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset> assets_;
    /**
     * <pre>
     * Any bid must comply with the array of elements expressed by the Exchange.
     * REQUIRED by the OpenRTB Native specification: at least 1 element.
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.Asset assets = 6;</code>
     */
    @java.lang.Override
    public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset> getAssetsList() {
      return assets_;
    }
    /**
     * <pre>
     * Any bid must comply with the array of elements expressed by the Exchange.
     * REQUIRED by the OpenRTB Native specification: at least 1 element.
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.Asset assets = 6;</code>
     */
    @java.lang.Override
    public java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.AssetOrBuilder> 
        getAssetsOrBuilderList() {
      return assets_;
    }
    /**
     * <pre>
     * Any bid must comply with the array of elements expressed by the Exchange.
     * REQUIRED by the OpenRTB Native specification: at least 1 element.
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.Asset assets = 6;</code>
     */
    @java.lang.Override
    public int getAssetsCount() {
      return assets_.size();
    }
    /**
     * <pre>
     * Any bid must comply with the array of elements expressed by the Exchange.
     * REQUIRED by the OpenRTB Native specification: at least 1 element.
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.Asset assets = 6;</code>
     */
    @java.lang.Override
    public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset getAssets(int index) {
      return assets_.get(index);
    }
    /**
     * <pre>
     * Any bid must comply with the array of elements expressed by the Exchange.
     * REQUIRED by the OpenRTB Native specification: at least 1 element.
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.Asset assets = 6;</code>
     */
    @java.lang.Override
    public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.AssetOrBuilder getAssetsOrBuilder(
        int index) {
      return assets_.get(index);
    }

    public static final int AURLSUPPORT_FIELD_NUMBER = 11;
    private boolean aurlsupport_;
    /**
     * <pre>
     * Whether the supply source / impression supports returning an assetsurl
     * instead of an asset object. 0 or the absence of the field indicates no such
     * support.
     * Implemented in 1.2
     * </pre>
     *
     * <code>optional bool aurlsupport = 11;</code>
     * @return Whether the aurlsupport field is set.
     */
    @java.lang.Override
    public boolean hasAurlsupport() {
      return ((bitField0_ & 0x00000100) != 0);
    }
    /**
     * <pre>
     * Whether the supply source / impression supports returning an assetsurl
     * instead of an asset object. 0 or the absence of the field indicates no such
     * support.
     * Implemented in 1.2
     * </pre>
     *
     * <code>optional bool aurlsupport = 11;</code>
     * @return The aurlsupport.
     */
    @java.lang.Override
    public boolean getAurlsupport() {
      return aurlsupport_;
    }

    public static final int DURLSUPPORT_FIELD_NUMBER = 12;
    private boolean durlsupport_;
    /**
     * <pre>
     * Whether the supply source / impression supports returning a DCO URL
     * instead of an asset object. 0 or the absence of the field indicates no such
     * support.
     * Implemented in 1.2
     * Beta feature.
     * </pre>
     *
     * <code>optional bool durlsupport = 12;</code>
     * @return Whether the durlsupport field is set.
     */
    @java.lang.Override
    public boolean hasDurlsupport() {
      return ((bitField0_ & 0x00000200) != 0);
    }
    /**
     * <pre>
     * Whether the supply source / impression supports returning a DCO URL
     * instead of an asset object. 0 or the absence of the field indicates no such
     * support.
     * Implemented in 1.2
     * Beta feature.
     * </pre>
     *
     * <code>optional bool durlsupport = 12;</code>
     * @return The durlsupport.
     */
    @java.lang.Override
    public boolean getDurlsupport() {
      return durlsupport_;
    }

    public static final int EVENTTRACKERS_FIELD_NUMBER = 13;
    private java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers> eventtrackers_;
    /**
     * <pre>
     * Specifies what type of event tracking is supported.
     * Implemented in 1.2
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.EventTrackers eventtrackers = 13;</code>
     */
    @java.lang.Override
    public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers> getEventtrackersList() {
      return eventtrackers_;
    }
    /**
     * <pre>
     * Specifies what type of event tracking is supported.
     * Implemented in 1.2
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.EventTrackers eventtrackers = 13;</code>
     */
    @java.lang.Override
    public java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackersOrBuilder> 
        getEventtrackersOrBuilderList() {
      return eventtrackers_;
    }
    /**
     * <pre>
     * Specifies what type of event tracking is supported.
     * Implemented in 1.2
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.EventTrackers eventtrackers = 13;</code>
     */
    @java.lang.Override
    public int getEventtrackersCount() {
      return eventtrackers_.size();
    }
    /**
     * <pre>
     * Specifies what type of event tracking is supported.
     * Implemented in 1.2
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.EventTrackers eventtrackers = 13;</code>
     */
    @java.lang.Override
    public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers getEventtrackers(int index) {
      return eventtrackers_.get(index);
    }
    /**
     * <pre>
     * Specifies what type of event tracking is supported.
     * Implemented in 1.2
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.EventTrackers eventtrackers = 13;</code>
     */
    @java.lang.Override
    public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackersOrBuilder getEventtrackersOrBuilder(
        int index) {
      return eventtrackers_.get(index);
    }

    public static final int PRIVACY_FIELD_NUMBER = 14;
    private boolean privacy_;
    /**
     * <pre>
     * Set to 1 when the native ad supports buyer-specific privacy notice.
     * Set to 0 (or field absent) when the native ad doesn't support custom
     * privacy links or if support is unknown.
     * RECOMMENDED and implemented in 1.2
     * </pre>
     *
     * <code>optional bool privacy = 14;</code>
     * @return Whether the privacy field is set.
     */
    @java.lang.Override
    public boolean hasPrivacy() {
      return ((bitField0_ & 0x00000400) != 0);
    }
    /**
     * <pre>
     * Set to 1 when the native ad supports buyer-specific privacy notice.
     * Set to 0 (or field absent) when the native ad doesn't support custom
     * privacy links or if support is unknown.
     * RECOMMENDED and implemented in 1.2
     * </pre>
     *
     * <code>optional bool privacy = 14;</code>
     * @return The privacy.
     */
    @java.lang.Override
    public boolean getPrivacy() {
      return privacy_;
    }

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

      for (int i = 0; i < getAssetsCount(); i++) {
        if (!getAssets(i).isInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
      }
      for (int i = 0; i < getEventtrackersCount(); i++) {
        if (!getEventtrackers(i).isInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
      }
      if (!extensionsAreInitialized()) {
        memoizedIsInitialized = 0;
        return false;
      }
      memoizedIsInitialized = 1;
      return true;
    }

    @java.lang.Override
    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      com.google.protobuf.GeneratedMessageV3
        .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest>.ExtensionWriter
          extensionWriter = newExtensionWriter();
      if (((bitField0_ & 0x00000001) != 0)) {
        com.google.protobuf.GeneratedMessageV3.writeString(output, 1, ver_);
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        output.writeInt32(2, layout_);
      }
      if (((bitField0_ & 0x00000004) != 0)) {
        output.writeInt32(3, adunit_);
      }
      if (((bitField0_ & 0x00000040) != 0)) {
        output.writeInt32(4, plcmtcnt_);
      }
      if (((bitField0_ & 0x00000080) != 0)) {
        output.writeInt32(5, seq_);
      }
      for (int i = 0; i < assets_.size(); i++) {
        output.writeMessage(6, assets_.get(i));
      }
      if (((bitField0_ & 0x00000008) != 0)) {
        output.writeInt32(7, context_);
      }
      if (((bitField0_ & 0x00000010) != 0)) {
        output.writeInt32(8, contextsubtype_);
      }
      if (((bitField0_ & 0x00000020) != 0)) {
        output.writeInt32(9, plcmttype_);
      }
      if (((bitField0_ & 0x00000100) != 0)) {
        output.writeBool(11, aurlsupport_);
      }
      if (((bitField0_ & 0x00000200) != 0)) {
        output.writeBool(12, durlsupport_);
      }
      for (int i = 0; i < eventtrackers_.size(); i++) {
        output.writeMessage(13, eventtrackers_.get(i));
      }
      if (((bitField0_ & 0x00000400) != 0)) {
        output.writeBool(14, privacy_);
      }
      extensionWriter.writeUntil(10000, output);
      unknownFields.writeTo(output);
    }

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

      size = 0;
      if (((bitField0_ & 0x00000001) != 0)) {
        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, ver_);
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt32Size(2, layout_);
      }
      if (((bitField0_ & 0x00000004) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt32Size(3, adunit_);
      }
      if (((bitField0_ & 0x00000040) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt32Size(4, plcmtcnt_);
      }
      if (((bitField0_ & 0x00000080) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt32Size(5, seq_);
      }
      for (int i = 0; i < assets_.size(); i++) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(6, assets_.get(i));
      }
      if (((bitField0_ & 0x00000008) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt32Size(7, context_);
      }
      if (((bitField0_ & 0x00000010) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt32Size(8, contextsubtype_);
      }
      if (((bitField0_ & 0x00000020) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeInt32Size(9, plcmttype_);
      }
      if (((bitField0_ & 0x00000100) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBoolSize(11, aurlsupport_);
      }
      if (((bitField0_ & 0x00000200) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBoolSize(12, durlsupport_);
      }
      for (int i = 0; i < eventtrackers_.size(); i++) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(13, eventtrackers_.get(i));
      }
      if (((bitField0_ & 0x00000400) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeBoolSize(14, privacy_);
      }
      size += extensionsSerializedSize();
      size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.NativeRequest)) {
        return super.equals(obj);
      }
      com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest other = (com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest) obj;

      if (hasVer() != other.hasVer()) return false;
      if (hasVer()) {
        if (!getVer()
            .equals(other.getVer())) return false;
      }
      if (hasLayout() != other.hasLayout()) return false;
      if (hasLayout()) {
        if (getLayout()
            != other.getLayout()) return false;
      }
      if (hasAdunit() != other.hasAdunit()) return false;
      if (hasAdunit()) {
        if (getAdunit()
            != other.getAdunit()) return false;
      }
      if (hasContext() != other.hasContext()) return false;
      if (hasContext()) {
        if (getContext()
            != other.getContext()) return false;
      }
      if (hasContextsubtype() != other.hasContextsubtype()) return false;
      if (hasContextsubtype()) {
        if (getContextsubtype()
            != other.getContextsubtype()) return false;
      }
      if (hasPlcmttype() != other.hasPlcmttype()) return false;
      if (hasPlcmttype()) {
        if (getPlcmttype()
            != other.getPlcmttype()) return false;
      }
      if (hasPlcmtcnt() != other.hasPlcmtcnt()) return false;
      if (hasPlcmtcnt()) {
        if (getPlcmtcnt()
            != other.getPlcmtcnt()) return false;
      }
      if (hasSeq() != other.hasSeq()) return false;
      if (hasSeq()) {
        if (getSeq()
            != other.getSeq()) return false;
      }
      if (!getAssetsList()
          .equals(other.getAssetsList())) return false;
      if (hasAurlsupport() != other.hasAurlsupport()) return false;
      if (hasAurlsupport()) {
        if (getAurlsupport()
            != other.getAurlsupport()) return false;
      }
      if (hasDurlsupport() != other.hasDurlsupport()) return false;
      if (hasDurlsupport()) {
        if (getDurlsupport()
            != other.getDurlsupport()) return false;
      }
      if (!getEventtrackersList()
          .equals(other.getEventtrackersList())) return false;
      if (hasPrivacy() != other.hasPrivacy()) return false;
      if (hasPrivacy()) {
        if (getPrivacy()
            != other.getPrivacy()) return false;
      }
      if (!unknownFields.equals(other.unknownFields)) return false;
      if (!getExtensionFields().equals(other.getExtensionFields()))
        return false;
      return true;
    }

    @java.lang.Override
    public int hashCode() {
      if (memoizedHashCode != 0) {
        return memoizedHashCode;
      }
      int hash = 41;
      hash = (19 * hash) + getDescriptor().hashCode();
      if (hasVer()) {
        hash = (37 * hash) + VER_FIELD_NUMBER;
        hash = (53 * hash) + getVer().hashCode();
      }
      if (hasLayout()) {
        hash = (37 * hash) + LAYOUT_FIELD_NUMBER;
        hash = (53 * hash) + getLayout();
      }
      if (hasAdunit()) {
        hash = (37 * hash) + ADUNIT_FIELD_NUMBER;
        hash = (53 * hash) + getAdunit();
      }
      if (hasContext()) {
        hash = (37 * hash) + CONTEXT_FIELD_NUMBER;
        hash = (53 * hash) + getContext();
      }
      if (hasContextsubtype()) {
        hash = (37 * hash) + CONTEXTSUBTYPE_FIELD_NUMBER;
        hash = (53 * hash) + getContextsubtype();
      }
      if (hasPlcmttype()) {
        hash = (37 * hash) + PLCMTTYPE_FIELD_NUMBER;
        hash = (53 * hash) + getPlcmttype();
      }
      if (hasPlcmtcnt()) {
        hash = (37 * hash) + PLCMTCNT_FIELD_NUMBER;
        hash = (53 * hash) + getPlcmtcnt();
      }
      if (hasSeq()) {
        hash = (37 * hash) + SEQ_FIELD_NUMBER;
        hash = (53 * hash) + getSeq();
      }
      if (getAssetsCount() > 0) {
        hash = (37 * hash) + ASSETS_FIELD_NUMBER;
        hash = (53 * hash) + getAssetsList().hashCode();
      }
      if (hasAurlsupport()) {
        hash = (37 * hash) + AURLSUPPORT_FIELD_NUMBER;
        hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
            getAurlsupport());
      }
      if (hasDurlsupport()) {
        hash = (37 * hash) + DURLSUPPORT_FIELD_NUMBER;
        hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
            getDurlsupport());
      }
      if (getEventtrackersCount() > 0) {
        hash = (37 * hash) + EVENTTRACKERS_FIELD_NUMBER;
        hash = (53 * hash) + getEventtrackersList().hashCode();
      }
      if (hasPrivacy()) {
        hash = (37 * hash) + PRIVACY_FIELD_NUMBER;
        hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
            getPrivacy());
      }
      hash = hashFields(hash, getExtensionFields());
      hash = (29 * hash) + unknownFields.hashCode();
      memoizedHashCode = hash;
      return hash;
    }

    public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest 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.iabtechlab.openrtb.v2.OpenRtb.NativeRequest parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest 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.iabtechlab.openrtb.v2.OpenRtb.NativeRequest parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest 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.iabtechlab.openrtb.v2.OpenRtb.NativeRequest 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>
     * OpenRTB Native 1.0: The Native Object defines the native advertising
     * opportunity available for bid via this bid request. It must be included
     * directly in the impression object if the impression offered for auction
     * is a native ad format.
     * Note: Prior to VERSION 1.1, the specification could be interpreted as
     * requiring the native request to have a root node with a single field "native"
     * that would contain the NativeRequest as its value.
     * In 1.2 The NativeRequest Object specified here is now the root object.
     * </pre>
     *
     * Protobuf type {@code com.iabtechlab.openrtb.v2.NativeRequest}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
          com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest, Builder> implements
        // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.NativeRequest)
        com.iabtechlab.openrtb.v2.OpenRtb.NativeRequestOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeRequest_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeRequest_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.class, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Builder.class);
      }

      // Construct using com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
          getAssetsFieldBuilder();
          getEventtrackersFieldBuilder();
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        ver_ = "";
        bitField0_ = (bitField0_ & ~0x00000001);
        layout_ = 0;
        bitField0_ = (bitField0_ & ~0x00000002);
        adunit_ = 0;
        bitField0_ = (bitField0_ & ~0x00000004);
        context_ = 0;
        bitField0_ = (bitField0_ & ~0x00000008);
        contextsubtype_ = 0;
        bitField0_ = (bitField0_ & ~0x00000010);
        plcmttype_ = 0;
        bitField0_ = (bitField0_ & ~0x00000020);
        plcmtcnt_ = 1;
        bitField0_ = (bitField0_ & ~0x00000040);
        seq_ = 0;
        bitField0_ = (bitField0_ & ~0x00000080);
        if (assetsBuilder_ == null) {
          assets_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000100);
        } else {
          assetsBuilder_.clear();
        }
        aurlsupport_ = false;
        bitField0_ = (bitField0_ & ~0x00000200);
        durlsupport_ = false;
        bitField0_ = (bitField0_ & ~0x00000400);
        if (eventtrackersBuilder_ == null) {
          eventtrackers_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000800);
        } else {
          eventtrackersBuilder_.clear();
        }
        privacy_ = false;
        bitField0_ = (bitField0_ & ~0x00001000);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeRequest_descriptor;
      }

      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest getDefaultInstanceForType() {
        return com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.getDefaultInstance();
      }

      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest build() {
        com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest buildPartial() {
        com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest result = new com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) != 0)) {
          to_bitField0_ |= 0x00000001;
        }
        result.ver_ = ver_;
        if (((from_bitField0_ & 0x00000002) != 0)) {
          result.layout_ = layout_;
          to_bitField0_ |= 0x00000002;
        }
        if (((from_bitField0_ & 0x00000004) != 0)) {
          result.adunit_ = adunit_;
          to_bitField0_ |= 0x00000004;
        }
        if (((from_bitField0_ & 0x00000008) != 0)) {
          result.context_ = context_;
          to_bitField0_ |= 0x00000008;
        }
        if (((from_bitField0_ & 0x00000010) != 0)) {
          result.contextsubtype_ = contextsubtype_;
          to_bitField0_ |= 0x00000010;
        }
        if (((from_bitField0_ & 0x00000020) != 0)) {
          result.plcmttype_ = plcmttype_;
          to_bitField0_ |= 0x00000020;
        }
        if (((from_bitField0_ & 0x00000040) != 0)) {
          to_bitField0_ |= 0x00000040;
        }
        result.plcmtcnt_ = plcmtcnt_;
        if (((from_bitField0_ & 0x00000080) != 0)) {
          result.seq_ = seq_;
          to_bitField0_ |= 0x00000080;
        }
        if (assetsBuilder_ == null) {
          if (((bitField0_ & 0x00000100) != 0)) {
            assets_ = java.util.Collections.unmodifiableList(assets_);
            bitField0_ = (bitField0_ & ~0x00000100);
          }
          result.assets_ = assets_;
        } else {
          result.assets_ = assetsBuilder_.build();
        }
        if (((from_bitField0_ & 0x00000200) != 0)) {
          result.aurlsupport_ = aurlsupport_;
          to_bitField0_ |= 0x00000100;
        }
        if (((from_bitField0_ & 0x00000400) != 0)) {
          result.durlsupport_ = durlsupport_;
          to_bitField0_ |= 0x00000200;
        }
        if (eventtrackersBuilder_ == null) {
          if (((bitField0_ & 0x00000800) != 0)) {
            eventtrackers_ = java.util.Collections.unmodifiableList(eventtrackers_);
            bitField0_ = (bitField0_ & ~0x00000800);
          }
          result.eventtrackers_ = eventtrackers_;
        } else {
          result.eventtrackers_ = eventtrackersBuilder_.build();
        }
        if (((from_bitField0_ & 0x00001000) != 0)) {
          result.privacy_ = privacy_;
          to_bitField0_ |= 0x00000400;
        }
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      @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 <Type> Builder setExtension(
          com.google.protobuf.GeneratedMessage.GeneratedExtension<
              com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest, Type> extension,
          Type value) {
        return super.setExtension(extension, value);
      }
      @java.lang.Override
      public <Type> Builder setExtension(
          com.google.protobuf.GeneratedMessage.GeneratedExtension<
              com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest, java.util.List<Type>> extension,
          int index, Type value) {
        return super.setExtension(extension, index, value);
      }
      @java.lang.Override
      public <Type> Builder addExtension(
          com.google.protobuf.GeneratedMessage.GeneratedExtension<
              com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest, java.util.List<Type>> extension,
          Type value) {
        return super.addExtension(extension, value);
      }
      @java.lang.Override
      public <Type> Builder clearExtension(
          com.google.protobuf.GeneratedMessage.GeneratedExtension<
              com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest, ?> extension) {
        return super.clearExtension(extension);
      }
      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest) {
          return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest other) {
        if (other == com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.getDefaultInstance()) return this;
        if (other.hasVer()) {
          bitField0_ |= 0x00000001;
          ver_ = other.ver_;
          onChanged();
        }
        if (other.hasLayout()) {
          setLayout(other.getLayout());
        }
        if (other.hasAdunit()) {
          setAdunit(other.getAdunit());
        }
        if (other.hasContext()) {
          setContext(other.getContext());
        }
        if (other.hasContextsubtype()) {
          setContextsubtype(other.getContextsubtype());
        }
        if (other.hasPlcmttype()) {
          setPlcmttype(other.getPlcmttype());
        }
        if (other.hasPlcmtcnt()) {
          setPlcmtcnt(other.getPlcmtcnt());
        }
        if (other.hasSeq()) {
          setSeq(other.getSeq());
        }
        if (assetsBuilder_ == null) {
          if (!other.assets_.isEmpty()) {
            if (assets_.isEmpty()) {
              assets_ = other.assets_;
              bitField0_ = (bitField0_ & ~0x00000100);
            } else {
              ensureAssetsIsMutable();
              assets_.addAll(other.assets_);
            }
            onChanged();
          }
        } else {
          if (!other.assets_.isEmpty()) {
            if (assetsBuilder_.isEmpty()) {
              assetsBuilder_.dispose();
              assetsBuilder_ = null;
              assets_ = other.assets_;
              bitField0_ = (bitField0_ & ~0x00000100);
              assetsBuilder_ = 
                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
                   getAssetsFieldBuilder() : null;
            } else {
              assetsBuilder_.addAllMessages(other.assets_);
            }
          }
        }
        if (other.hasAurlsupport()) {
          setAurlsupport(other.getAurlsupport());
        }
        if (other.hasDurlsupport()) {
          setDurlsupport(other.getDurlsupport());
        }
        if (eventtrackersBuilder_ == null) {
          if (!other.eventtrackers_.isEmpty()) {
            if (eventtrackers_.isEmpty()) {
              eventtrackers_ = other.eventtrackers_;
              bitField0_ = (bitField0_ & ~0x00000800);
            } else {
              ensureEventtrackersIsMutable();
              eventtrackers_.addAll(other.eventtrackers_);
            }
            onChanged();
          }
        } else {
          if (!other.eventtrackers_.isEmpty()) {
            if (eventtrackersBuilder_.isEmpty()) {
              eventtrackersBuilder_.dispose();
              eventtrackersBuilder_ = null;
              eventtrackers_ = other.eventtrackers_;
              bitField0_ = (bitField0_ & ~0x00000800);
              eventtrackersBuilder_ = 
                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
                   getEventtrackersFieldBuilder() : null;
            } else {
              eventtrackersBuilder_.addAllMessages(other.eventtrackers_);
            }
          }
        }
        if (other.hasPrivacy()) {
          setPrivacy(other.getPrivacy());
        }
        this.mergeExtensionFields(other);
        this.mergeUnknownFields(other.unknownFields);
        onChanged();
        return this;
      }

      @java.lang.Override
      public final boolean isInitialized() {
        for (int i = 0; i < getAssetsCount(); i++) {
          if (!getAssets(i).isInitialized()) {
            return false;
          }
        }
        for (int i = 0; i < getEventtrackersCount(); i++) {
          if (!getEventtrackers(i).isInitialized()) {
            return false;
          }
        }
        if (!extensionsAreInitialized()) {
          return false;
        }
        return true;
      }

      @java.lang.Override
      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest) e.getUnfinishedMessage();
          throw e.unwrapIOException();
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      private java.lang.Object ver_ = "";
      /**
       * <pre>
       * Version of the Native Markup version in use.
       * </pre>
       *
       * <code>optional string ver = 1;</code>
       * @return Whether the ver field is set.
       */
      public boolean hasVer() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <pre>
       * Version of the Native Markup version in use.
       * </pre>
       *
       * <code>optional string ver = 1;</code>
       * @return The ver.
       */
      public java.lang.String getVer() {
        java.lang.Object ref = ver_;
        if (!(ref instanceof java.lang.String)) {
          com.google.protobuf.ByteString bs =
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            ver_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * Version of the Native Markup version in use.
       * </pre>
       *
       * <code>optional string ver = 1;</code>
       * @return The bytes for ver.
       */
      public com.google.protobuf.ByteString
          getVerBytes() {
        java.lang.Object ref = ver_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          ver_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * Version of the Native Markup version in use.
       * </pre>
       *
       * <code>optional string ver = 1;</code>
       * @param value The ver to set.
       * @return This builder for chaining.
       */
      public Builder setVer(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
        ver_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Version of the Native Markup version in use.
       * </pre>
       *
       * <code>optional string ver = 1;</code>
       * @return This builder for chaining.
       */
      public Builder clearVer() {
        bitField0_ = (bitField0_ & ~0x00000001);
        ver_ = getDefaultInstance().getVer();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Version of the Native Markup version in use.
       * </pre>
       *
       * <code>optional string ver = 1;</code>
       * @param value The bytes for ver to set.
       * @return This builder for chaining.
       */
      public Builder setVerBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
        ver_ = value;
        onChanged();
        return this;
      }

      private int layout_ ;
      /**
       * <pre>
       * The Layout ID of the native ad unit.
       * Refer to enum LayoutId for generic values.
       * RECOMMENDED by OpenRTB Native 1.0; optional in 1.1, DEPRECATED in 1.2.
       * </pre>
       *
       * <code>optional int32 layout = 2;</code>
       * @return Whether the layout field is set.
       */
      @java.lang.Override
      public boolean hasLayout() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <pre>
       * The Layout ID of the native ad unit.
       * Refer to enum LayoutId for generic values.
       * RECOMMENDED by OpenRTB Native 1.0; optional in 1.1, DEPRECATED in 1.2.
       * </pre>
       *
       * <code>optional int32 layout = 2;</code>
       * @return The layout.
       */
      @java.lang.Override
      public int getLayout() {
        return layout_;
      }
      /**
       * <pre>
       * The Layout ID of the native ad unit.
       * Refer to enum LayoutId for generic values.
       * RECOMMENDED by OpenRTB Native 1.0; optional in 1.1, DEPRECATED in 1.2.
       * </pre>
       *
       * <code>optional int32 layout = 2;</code>
       * @param value The layout to set.
       * @return This builder for chaining.
       */
      public Builder setLayout(int value) {
        bitField0_ |= 0x00000002;
        layout_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The Layout ID of the native ad unit.
       * Refer to enum LayoutId for generic values.
       * RECOMMENDED by OpenRTB Native 1.0; optional in 1.1, DEPRECATED in 1.2.
       * </pre>
       *
       * <code>optional int32 layout = 2;</code>
       * @return This builder for chaining.
       */
      public Builder clearLayout() {
        bitField0_ = (bitField0_ & ~0x00000002);
        layout_ = 0;
        onChanged();
        return this;
      }

      private int adunit_ ;
      /**
       * <pre>
       * The Ad unit ID of the native ad unit.
       * This corresponds to one of IAB Core-6 native ad units.
       * Refer to enum AdUnitId for generic values.
       * RECOMMENDED by OpenRTB Native 1.0; optional in 1.1, DEPRECATED in 1.2.
       * </pre>
       *
       * <code>optional int32 adunit = 3;</code>
       * @return Whether the adunit field is set.
       */
      @java.lang.Override
      public boolean hasAdunit() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <pre>
       * The Ad unit ID of the native ad unit.
       * This corresponds to one of IAB Core-6 native ad units.
       * Refer to enum AdUnitId for generic values.
       * RECOMMENDED by OpenRTB Native 1.0; optional in 1.1, DEPRECATED in 1.2.
       * </pre>
       *
       * <code>optional int32 adunit = 3;</code>
       * @return The adunit.
       */
      @java.lang.Override
      public int getAdunit() {
        return adunit_;
      }
      /**
       * <pre>
       * The Ad unit ID of the native ad unit.
       * This corresponds to one of IAB Core-6 native ad units.
       * Refer to enum AdUnitId for generic values.
       * RECOMMENDED by OpenRTB Native 1.0; optional in 1.1, DEPRECATED in 1.2.
       * </pre>
       *
       * <code>optional int32 adunit = 3;</code>
       * @param value The adunit to set.
       * @return This builder for chaining.
       */
      public Builder setAdunit(int value) {
        bitField0_ |= 0x00000004;
        adunit_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The Ad unit ID of the native ad unit.
       * This corresponds to one of IAB Core-6 native ad units.
       * Refer to enum AdUnitId for generic values.
       * RECOMMENDED by OpenRTB Native 1.0; optional in 1.1, DEPRECATED in 1.2.
       * </pre>
       *
       * <code>optional int32 adunit = 3;</code>
       * @return This builder for chaining.
       */
      public Builder clearAdunit() {
        bitField0_ = (bitField0_ & ~0x00000004);
        adunit_ = 0;
        onChanged();
        return this;
      }

      private int context_ ;
      /**
       * <pre>
       * The context in which the ad appears.
       * Refer to enum ContextType for generic values.
       * RECOMMENDED in 1.2.
       * </pre>
       *
       * <code>optional int32 context = 7;</code>
       * @return Whether the context field is set.
       */
      @java.lang.Override
      public boolean hasContext() {
        return ((bitField0_ & 0x00000008) != 0);
      }
      /**
       * <pre>
       * The context in which the ad appears.
       * Refer to enum ContextType for generic values.
       * RECOMMENDED in 1.2.
       * </pre>
       *
       * <code>optional int32 context = 7;</code>
       * @return The context.
       */
      @java.lang.Override
      public int getContext() {
        return context_;
      }
      /**
       * <pre>
       * The context in which the ad appears.
       * Refer to enum ContextType for generic values.
       * RECOMMENDED in 1.2.
       * </pre>
       *
       * <code>optional int32 context = 7;</code>
       * @param value The context to set.
       * @return This builder for chaining.
       */
      public Builder setContext(int value) {
        bitField0_ |= 0x00000008;
        context_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The context in which the ad appears.
       * Refer to enum ContextType for generic values.
       * RECOMMENDED in 1.2.
       * </pre>
       *
       * <code>optional int32 context = 7;</code>
       * @return This builder for chaining.
       */
      public Builder clearContext() {
        bitField0_ = (bitField0_ & ~0x00000008);
        context_ = 0;
        onChanged();
        return this;
      }

      private int contextsubtype_ ;
      /**
       * <pre>
       * A more detailed context in which the ad appears.
       * Refer to enum com.iabtechlab.adcom.v1.enums.DisplayContextType for generic values.
       * </pre>
       *
       * <code>optional int32 contextsubtype = 8;</code>
       * @return Whether the contextsubtype field is set.
       */
      @java.lang.Override
      public boolean hasContextsubtype() {
        return ((bitField0_ & 0x00000010) != 0);
      }
      /**
       * <pre>
       * A more detailed context in which the ad appears.
       * Refer to enum com.iabtechlab.adcom.v1.enums.DisplayContextType for generic values.
       * </pre>
       *
       * <code>optional int32 contextsubtype = 8;</code>
       * @return The contextsubtype.
       */
      @java.lang.Override
      public int getContextsubtype() {
        return contextsubtype_;
      }
      /**
       * <pre>
       * A more detailed context in which the ad appears.
       * Refer to enum com.iabtechlab.adcom.v1.enums.DisplayContextType for generic values.
       * </pre>
       *
       * <code>optional int32 contextsubtype = 8;</code>
       * @param value The contextsubtype to set.
       * @return This builder for chaining.
       */
      public Builder setContextsubtype(int value) {
        bitField0_ |= 0x00000010;
        contextsubtype_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * A more detailed context in which the ad appears.
       * Refer to enum com.iabtechlab.adcom.v1.enums.DisplayContextType for generic values.
       * </pre>
       *
       * <code>optional int32 contextsubtype = 8;</code>
       * @return This builder for chaining.
       */
      public Builder clearContextsubtype() {
        bitField0_ = (bitField0_ & ~0x00000010);
        contextsubtype_ = 0;
        onChanged();
        return this;
      }

      private int plcmttype_ ;
      /**
       * <pre>
       * The design/format/layout of the ad unit being offered.
       * Refer to enum com.iabtechlab.adcom.v1.enums.DisplayPlacementType for generic values.
       * RECOMMENDED by the OpenRTB Native specification.
       * </pre>
       *
       * <code>optional int32 plcmttype = 9;</code>
       * @return Whether the plcmttype field is set.
       */
      @java.lang.Override
      public boolean hasPlcmttype() {
        return ((bitField0_ & 0x00000020) != 0);
      }
      /**
       * <pre>
       * The design/format/layout of the ad unit being offered.
       * Refer to enum com.iabtechlab.adcom.v1.enums.DisplayPlacementType for generic values.
       * RECOMMENDED by the OpenRTB Native specification.
       * </pre>
       *
       * <code>optional int32 plcmttype = 9;</code>
       * @return The plcmttype.
       */
      @java.lang.Override
      public int getPlcmttype() {
        return plcmttype_;
      }
      /**
       * <pre>
       * The design/format/layout of the ad unit being offered.
       * Refer to enum com.iabtechlab.adcom.v1.enums.DisplayPlacementType for generic values.
       * RECOMMENDED by the OpenRTB Native specification.
       * </pre>
       *
       * <code>optional int32 plcmttype = 9;</code>
       * @param value The plcmttype to set.
       * @return This builder for chaining.
       */
      public Builder setPlcmttype(int value) {
        bitField0_ |= 0x00000020;
        plcmttype_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The design/format/layout of the ad unit being offered.
       * Refer to enum com.iabtechlab.adcom.v1.enums.DisplayPlacementType for generic values.
       * RECOMMENDED by the OpenRTB Native specification.
       * </pre>
       *
       * <code>optional int32 plcmttype = 9;</code>
       * @return This builder for chaining.
       */
      public Builder clearPlcmttype() {
        bitField0_ = (bitField0_ & ~0x00000020);
        plcmttype_ = 0;
        onChanged();
        return this;
      }

      private int plcmtcnt_ = 1;
      /**
       * <pre>
       * The number of identical placements in this Layout.
       * </pre>
       *
       * <code>optional int32 plcmtcnt = 4 [default = 1];</code>
       * @return Whether the plcmtcnt field is set.
       */
      @java.lang.Override
      public boolean hasPlcmtcnt() {
        return ((bitField0_ & 0x00000040) != 0);
      }
      /**
       * <pre>
       * The number of identical placements in this Layout.
       * </pre>
       *
       * <code>optional int32 plcmtcnt = 4 [default = 1];</code>
       * @return The plcmtcnt.
       */
      @java.lang.Override
      public int getPlcmtcnt() {
        return plcmtcnt_;
      }
      /**
       * <pre>
       * The number of identical placements in this Layout.
       * </pre>
       *
       * <code>optional int32 plcmtcnt = 4 [default = 1];</code>
       * @param value The plcmtcnt to set.
       * @return This builder for chaining.
       */
      public Builder setPlcmtcnt(int value) {
        bitField0_ |= 0x00000040;
        plcmtcnt_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * The number of identical placements in this Layout.
       * </pre>
       *
       * <code>optional int32 plcmtcnt = 4 [default = 1];</code>
       * @return This builder for chaining.
       */
      public Builder clearPlcmtcnt() {
        bitField0_ = (bitField0_ & ~0x00000040);
        plcmtcnt_ = 1;
        onChanged();
        return this;
      }

      private int seq_ ;
      /**
       * <pre>
       * 0 for the first ad, 1 for the second ad, and so on. Note this would
       * generally NOT be used in combination with plcmtcnt - either you are
       * auctioning multiple identical placements (in which case
       * plcmtcnt&gt;1, seq=0) or you are holding separate auctions for distinct
       * items in the feed (in which case plcmtcnt=1, seq&gt;=1).
       * </pre>
       *
       * <code>optional int32 seq = 5 [default = 0];</code>
       * @return Whether the seq field is set.
       */
      @java.lang.Override
      public boolean hasSeq() {
        return ((bitField0_ & 0x00000080) != 0);
      }
      /**
       * <pre>
       * 0 for the first ad, 1 for the second ad, and so on. Note this would
       * generally NOT be used in combination with plcmtcnt - either you are
       * auctioning multiple identical placements (in which case
       * plcmtcnt&gt;1, seq=0) or you are holding separate auctions for distinct
       * items in the feed (in which case plcmtcnt=1, seq&gt;=1).
       * </pre>
       *
       * <code>optional int32 seq = 5 [default = 0];</code>
       * @return The seq.
       */
      @java.lang.Override
      public int getSeq() {
        return seq_;
      }
      /**
       * <pre>
       * 0 for the first ad, 1 for the second ad, and so on. Note this would
       * generally NOT be used in combination with plcmtcnt - either you are
       * auctioning multiple identical placements (in which case
       * plcmtcnt&gt;1, seq=0) or you are holding separate auctions for distinct
       * items in the feed (in which case plcmtcnt=1, seq&gt;=1).
       * </pre>
       *
       * <code>optional int32 seq = 5 [default = 0];</code>
       * @param value The seq to set.
       * @return This builder for chaining.
       */
      public Builder setSeq(int value) {
        bitField0_ |= 0x00000080;
        seq_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * 0 for the first ad, 1 for the second ad, and so on. Note this would
       * generally NOT be used in combination with plcmtcnt - either you are
       * auctioning multiple identical placements (in which case
       * plcmtcnt&gt;1, seq=0) or you are holding separate auctions for distinct
       * items in the feed (in which case plcmtcnt=1, seq&gt;=1).
       * </pre>
       *
       * <code>optional int32 seq = 5 [default = 0];</code>
       * @return This builder for chaining.
       */
      public Builder clearSeq() {
        bitField0_ = (bitField0_ & ~0x00000080);
        seq_ = 0;
        onChanged();
        return this;
      }

      private java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset> assets_ =
        java.util.Collections.emptyList();
      private void ensureAssetsIsMutable() {
        if (!((bitField0_ & 0x00000100) != 0)) {
          assets_ = new java.util.ArrayList<com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset>(assets_);
          bitField0_ |= 0x00000100;
         }
      }

      private com.google.protobuf.RepeatedFieldBuilderV3<
          com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Builder, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.AssetOrBuilder> assetsBuilder_;

      /**
       * <pre>
       * Any bid must comply with the array of elements expressed by the Exchange.
       * REQUIRED by the OpenRTB Native specification: at least 1 element.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.Asset assets = 6;</code>
       */
      public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset> getAssetsList() {
        if (assetsBuilder_ == null) {
          return java.util.Collections.unmodifiableList(assets_);
        } else {
          return assetsBuilder_.getMessageList();
        }
      }
      /**
       * <pre>
       * Any bid must comply with the array of elements expressed by the Exchange.
       * REQUIRED by the OpenRTB Native specification: at least 1 element.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.Asset assets = 6;</code>
       */
      public int getAssetsCount() {
        if (assetsBuilder_ == null) {
          return assets_.size();
        } else {
          return assetsBuilder_.getCount();
        }
      }
      /**
       * <pre>
       * Any bid must comply with the array of elements expressed by the Exchange.
       * REQUIRED by the OpenRTB Native specification: at least 1 element.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.Asset assets = 6;</code>
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset getAssets(int index) {
        if (assetsBuilder_ == null) {
          return assets_.get(index);
        } else {
          return assetsBuilder_.getMessage(index);
        }
      }
      /**
       * <pre>
       * Any bid must comply with the array of elements expressed by the Exchange.
       * REQUIRED by the OpenRTB Native specification: at least 1 element.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.Asset assets = 6;</code>
       */
      public Builder setAssets(
          int index, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset value) {
        if (assetsBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureAssetsIsMutable();
          assets_.set(index, value);
          onChanged();
        } else {
          assetsBuilder_.setMessage(index, value);
        }
        return this;
      }
      /**
       * <pre>
       * Any bid must comply with the array of elements expressed by the Exchange.
       * REQUIRED by the OpenRTB Native specification: at least 1 element.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.Asset assets = 6;</code>
       */
      public Builder setAssets(
          int index, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Builder builderForValue) {
        if (assetsBuilder_ == null) {
          ensureAssetsIsMutable();
          assets_.set(index, builderForValue.build());
          onChanged();
        } else {
          assetsBuilder_.setMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * <pre>
       * Any bid must comply with the array of elements expressed by the Exchange.
       * REQUIRED by the OpenRTB Native specification: at least 1 element.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.Asset assets = 6;</code>
       */
      public Builder addAssets(com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset value) {
        if (assetsBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureAssetsIsMutable();
          assets_.add(value);
          onChanged();
        } else {
          assetsBuilder_.addMessage(value);
        }
        return this;
      }
      /**
       * <pre>
       * Any bid must comply with the array of elements expressed by the Exchange.
       * REQUIRED by the OpenRTB Native specification: at least 1 element.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.Asset assets = 6;</code>
       */
      public Builder addAssets(
          int index, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset value) {
        if (assetsBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureAssetsIsMutable();
          assets_.add(index, value);
          onChanged();
        } else {
          assetsBuilder_.addMessage(index, value);
        }
        return this;
      }
      /**
       * <pre>
       * Any bid must comply with the array of elements expressed by the Exchange.
       * REQUIRED by the OpenRTB Native specification: at least 1 element.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.Asset assets = 6;</code>
       */
      public Builder addAssets(
          com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Builder builderForValue) {
        if (assetsBuilder_ == null) {
          ensureAssetsIsMutable();
          assets_.add(builderForValue.build());
          onChanged();
        } else {
          assetsBuilder_.addMessage(builderForValue.build());
        }
        return this;
      }
      /**
       * <pre>
       * Any bid must comply with the array of elements expressed by the Exchange.
       * REQUIRED by the OpenRTB Native specification: at least 1 element.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.Asset assets = 6;</code>
       */
      public Builder addAssets(
          int index, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Builder builderForValue) {
        if (assetsBuilder_ == null) {
          ensureAssetsIsMutable();
          assets_.add(index, builderForValue.build());
          onChanged();
        } else {
          assetsBuilder_.addMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * <pre>
       * Any bid must comply with the array of elements expressed by the Exchange.
       * REQUIRED by the OpenRTB Native specification: at least 1 element.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.Asset assets = 6;</code>
       */
      public Builder addAllAssets(
          java.lang.Iterable<? extends com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset> values) {
        if (assetsBuilder_ == null) {
          ensureAssetsIsMutable();
          com.google.protobuf.AbstractMessageLite.Builder.addAll(
              values, assets_);
          onChanged();
        } else {
          assetsBuilder_.addAllMessages(values);
        }
        return this;
      }
      /**
       * <pre>
       * Any bid must comply with the array of elements expressed by the Exchange.
       * REQUIRED by the OpenRTB Native specification: at least 1 element.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.Asset assets = 6;</code>
       */
      public Builder clearAssets() {
        if (assetsBuilder_ == null) {
          assets_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000100);
          onChanged();
        } else {
          assetsBuilder_.clear();
        }
        return this;
      }
      /**
       * <pre>
       * Any bid must comply with the array of elements expressed by the Exchange.
       * REQUIRED by the OpenRTB Native specification: at least 1 element.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.Asset assets = 6;</code>
       */
      public Builder removeAssets(int index) {
        if (assetsBuilder_ == null) {
          ensureAssetsIsMutable();
          assets_.remove(index);
          onChanged();
        } else {
          assetsBuilder_.remove(index);
        }
        return this;
      }
      /**
       * <pre>
       * Any bid must comply with the array of elements expressed by the Exchange.
       * REQUIRED by the OpenRTB Native specification: at least 1 element.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.Asset assets = 6;</code>
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Builder getAssetsBuilder(
          int index) {
        return getAssetsFieldBuilder().getBuilder(index);
      }
      /**
       * <pre>
       * Any bid must comply with the array of elements expressed by the Exchange.
       * REQUIRED by the OpenRTB Native specification: at least 1 element.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.Asset assets = 6;</code>
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.AssetOrBuilder getAssetsOrBuilder(
          int index) {
        if (assetsBuilder_ == null) {
          return assets_.get(index);  } else {
          return assetsBuilder_.getMessageOrBuilder(index);
        }
      }
      /**
       * <pre>
       * Any bid must comply with the array of elements expressed by the Exchange.
       * REQUIRED by the OpenRTB Native specification: at least 1 element.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.Asset assets = 6;</code>
       */
      public java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.AssetOrBuilder> 
           getAssetsOrBuilderList() {
        if (assetsBuilder_ != null) {
          return assetsBuilder_.getMessageOrBuilderList();
        } else {
          return java.util.Collections.unmodifiableList(assets_);
        }
      }
      /**
       * <pre>
       * Any bid must comply with the array of elements expressed by the Exchange.
       * REQUIRED by the OpenRTB Native specification: at least 1 element.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.Asset assets = 6;</code>
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Builder addAssetsBuilder() {
        return getAssetsFieldBuilder().addBuilder(
            com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.getDefaultInstance());
      }
      /**
       * <pre>
       * Any bid must comply with the array of elements expressed by the Exchange.
       * REQUIRED by the OpenRTB Native specification: at least 1 element.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.Asset assets = 6;</code>
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Builder addAssetsBuilder(
          int index) {
        return getAssetsFieldBuilder().addBuilder(
            index, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.getDefaultInstance());
      }
      /**
       * <pre>
       * Any bid must comply with the array of elements expressed by the Exchange.
       * REQUIRED by the OpenRTB Native specification: at least 1 element.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.Asset assets = 6;</code>
       */
      public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Builder> 
           getAssetsBuilderList() {
        return getAssetsFieldBuilder().getBuilderList();
      }
      private com.google.protobuf.RepeatedFieldBuilderV3<
          com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Builder, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.AssetOrBuilder> 
          getAssetsFieldBuilder() {
        if (assetsBuilder_ == null) {
          assetsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
              com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.Asset.Builder, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.AssetOrBuilder>(
                  assets_,
                  ((bitField0_ & 0x00000100) != 0),
                  getParentForChildren(),
                  isClean());
          assets_ = null;
        }
        return assetsBuilder_;
      }

      private boolean aurlsupport_ ;
      /**
       * <pre>
       * Whether the supply source / impression supports returning an assetsurl
       * instead of an asset object. 0 or the absence of the field indicates no such
       * support.
       * Implemented in 1.2
       * </pre>
       *
       * <code>optional bool aurlsupport = 11;</code>
       * @return Whether the aurlsupport field is set.
       */
      @java.lang.Override
      public boolean hasAurlsupport() {
        return ((bitField0_ & 0x00000200) != 0);
      }
      /**
       * <pre>
       * Whether the supply source / impression supports returning an assetsurl
       * instead of an asset object. 0 or the absence of the field indicates no such
       * support.
       * Implemented in 1.2
       * </pre>
       *
       * <code>optional bool aurlsupport = 11;</code>
       * @return The aurlsupport.
       */
      @java.lang.Override
      public boolean getAurlsupport() {
        return aurlsupport_;
      }
      /**
       * <pre>
       * Whether the supply source / impression supports returning an assetsurl
       * instead of an asset object. 0 or the absence of the field indicates no such
       * support.
       * Implemented in 1.2
       * </pre>
       *
       * <code>optional bool aurlsupport = 11;</code>
       * @param value The aurlsupport to set.
       * @return This builder for chaining.
       */
      public Builder setAurlsupport(boolean value) {
        bitField0_ |= 0x00000200;
        aurlsupport_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Whether the supply source / impression supports returning an assetsurl
       * instead of an asset object. 0 or the absence of the field indicates no such
       * support.
       * Implemented in 1.2
       * </pre>
       *
       * <code>optional bool aurlsupport = 11;</code>
       * @return This builder for chaining.
       */
      public Builder clearAurlsupport() {
        bitField0_ = (bitField0_ & ~0x00000200);
        aurlsupport_ = false;
        onChanged();
        return this;
      }

      private boolean durlsupport_ ;
      /**
       * <pre>
       * Whether the supply source / impression supports returning a DCO URL
       * instead of an asset object. 0 or the absence of the field indicates no such
       * support.
       * Implemented in 1.2
       * Beta feature.
       * </pre>
       *
       * <code>optional bool durlsupport = 12;</code>
       * @return Whether the durlsupport field is set.
       */
      @java.lang.Override
      public boolean hasDurlsupport() {
        return ((bitField0_ & 0x00000400) != 0);
      }
      /**
       * <pre>
       * Whether the supply source / impression supports returning a DCO URL
       * instead of an asset object. 0 or the absence of the field indicates no such
       * support.
       * Implemented in 1.2
       * Beta feature.
       * </pre>
       *
       * <code>optional bool durlsupport = 12;</code>
       * @return The durlsupport.
       */
      @java.lang.Override
      public boolean getDurlsupport() {
        return durlsupport_;
      }
      /**
       * <pre>
       * Whether the supply source / impression supports returning a DCO URL
       * instead of an asset object. 0 or the absence of the field indicates no such
       * support.
       * Implemented in 1.2
       * Beta feature.
       * </pre>
       *
       * <code>optional bool durlsupport = 12;</code>
       * @param value The durlsupport to set.
       * @return This builder for chaining.
       */
      public Builder setDurlsupport(boolean value) {
        bitField0_ |= 0x00000400;
        durlsupport_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Whether the supply source / impression supports returning a DCO URL
       * instead of an asset object. 0 or the absence of the field indicates no such
       * support.
       * Implemented in 1.2
       * Beta feature.
       * </pre>
       *
       * <code>optional bool durlsupport = 12;</code>
       * @return This builder for chaining.
       */
      public Builder clearDurlsupport() {
        bitField0_ = (bitField0_ & ~0x00000400);
        durlsupport_ = false;
        onChanged();
        return this;
      }

      private java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers> eventtrackers_ =
        java.util.Collections.emptyList();
      private void ensureEventtrackersIsMutable() {
        if (!((bitField0_ & 0x00000800) != 0)) {
          eventtrackers_ = new java.util.ArrayList<com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers>(eventtrackers_);
          bitField0_ |= 0x00000800;
         }
      }

      private com.google.protobuf.RepeatedFieldBuilderV3<
          com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers.Builder, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackersOrBuilder> eventtrackersBuilder_;

      /**
       * <pre>
       * Specifies what type of event tracking is supported.
       * Implemented in 1.2
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.EventTrackers eventtrackers = 13;</code>
       */
      public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers> getEventtrackersList() {
        if (eventtrackersBuilder_ == null) {
          return java.util.Collections.unmodifiableList(eventtrackers_);
        } else {
          return eventtrackersBuilder_.getMessageList();
        }
      }
      /**
       * <pre>
       * Specifies what type of event tracking is supported.
       * Implemented in 1.2
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.EventTrackers eventtrackers = 13;</code>
       */
      public int getEventtrackersCount() {
        if (eventtrackersBuilder_ == null) {
          return eventtrackers_.size();
        } else {
          return eventtrackersBuilder_.getCount();
        }
      }
      /**
       * <pre>
       * Specifies what type of event tracking is supported.
       * Implemented in 1.2
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.EventTrackers eventtrackers = 13;</code>
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers getEventtrackers(int index) {
        if (eventtrackersBuilder_ == null) {
          return eventtrackers_.get(index);
        } else {
          return eventtrackersBuilder_.getMessage(index);
        }
      }
      /**
       * <pre>
       * Specifies what type of event tracking is supported.
       * Implemented in 1.2
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.EventTrackers eventtrackers = 13;</code>
       */
      public Builder setEventtrackers(
          int index, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers value) {
        if (eventtrackersBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureEventtrackersIsMutable();
          eventtrackers_.set(index, value);
          onChanged();
        } else {
          eventtrackersBuilder_.setMessage(index, value);
        }
        return this;
      }
      /**
       * <pre>
       * Specifies what type of event tracking is supported.
       * Implemented in 1.2
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.EventTrackers eventtrackers = 13;</code>
       */
      public Builder setEventtrackers(
          int index, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers.Builder builderForValue) {
        if (eventtrackersBuilder_ == null) {
          ensureEventtrackersIsMutable();
          eventtrackers_.set(index, builderForValue.build());
          onChanged();
        } else {
          eventtrackersBuilder_.setMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * <pre>
       * Specifies what type of event tracking is supported.
       * Implemented in 1.2
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.EventTrackers eventtrackers = 13;</code>
       */
      public Builder addEventtrackers(com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers value) {
        if (eventtrackersBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureEventtrackersIsMutable();
          eventtrackers_.add(value);
          onChanged();
        } else {
          eventtrackersBuilder_.addMessage(value);
        }
        return this;
      }
      /**
       * <pre>
       * Specifies what type of event tracking is supported.
       * Implemented in 1.2
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.EventTrackers eventtrackers = 13;</code>
       */
      public Builder addEventtrackers(
          int index, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers value) {
        if (eventtrackersBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureEventtrackersIsMutable();
          eventtrackers_.add(index, value);
          onChanged();
        } else {
          eventtrackersBuilder_.addMessage(index, value);
        }
        return this;
      }
      /**
       * <pre>
       * Specifies what type of event tracking is supported.
       * Implemented in 1.2
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.EventTrackers eventtrackers = 13;</code>
       */
      public Builder addEventtrackers(
          com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers.Builder builderForValue) {
        if (eventtrackersBuilder_ == null) {
          ensureEventtrackersIsMutable();
          eventtrackers_.add(builderForValue.build());
          onChanged();
        } else {
          eventtrackersBuilder_.addMessage(builderForValue.build());
        }
        return this;
      }
      /**
       * <pre>
       * Specifies what type of event tracking is supported.
       * Implemented in 1.2
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.EventTrackers eventtrackers = 13;</code>
       */
      public Builder addEventtrackers(
          int index, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers.Builder builderForValue) {
        if (eventtrackersBuilder_ == null) {
          ensureEventtrackersIsMutable();
          eventtrackers_.add(index, builderForValue.build());
          onChanged();
        } else {
          eventtrackersBuilder_.addMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * <pre>
       * Specifies what type of event tracking is supported.
       * Implemented in 1.2
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.EventTrackers eventtrackers = 13;</code>
       */
      public Builder addAllEventtrackers(
          java.lang.Iterable<? extends com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers> values) {
        if (eventtrackersBuilder_ == null) {
          ensureEventtrackersIsMutable();
          com.google.protobuf.AbstractMessageLite.Builder.addAll(
              values, eventtrackers_);
          onChanged();
        } else {
          eventtrackersBuilder_.addAllMessages(values);
        }
        return this;
      }
      /**
       * <pre>
       * Specifies what type of event tracking is supported.
       * Implemented in 1.2
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.EventTrackers eventtrackers = 13;</code>
       */
      public Builder clearEventtrackers() {
        if (eventtrackersBuilder_ == null) {
          eventtrackers_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000800);
          onChanged();
        } else {
          eventtrackersBuilder_.clear();
        }
        return this;
      }
      /**
       * <pre>
       * Specifies what type of event tracking is supported.
       * Implemented in 1.2
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.EventTrackers eventtrackers = 13;</code>
       */
      public Builder removeEventtrackers(int index) {
        if (eventtrackersBuilder_ == null) {
          ensureEventtrackersIsMutable();
          eventtrackers_.remove(index);
          onChanged();
        } else {
          eventtrackersBuilder_.remove(index);
        }
        return this;
      }
      /**
       * <pre>
       * Specifies what type of event tracking is supported.
       * Implemented in 1.2
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.EventTrackers eventtrackers = 13;</code>
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers.Builder getEventtrackersBuilder(
          int index) {
        return getEventtrackersFieldBuilder().getBuilder(index);
      }
      /**
       * <pre>
       * Specifies what type of event tracking is supported.
       * Implemented in 1.2
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.EventTrackers eventtrackers = 13;</code>
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackersOrBuilder getEventtrackersOrBuilder(
          int index) {
        if (eventtrackersBuilder_ == null) {
          return eventtrackers_.get(index);  } else {
          return eventtrackersBuilder_.getMessageOrBuilder(index);
        }
      }
      /**
       * <pre>
       * Specifies what type of event tracking is supported.
       * Implemented in 1.2
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.EventTrackers eventtrackers = 13;</code>
       */
      public java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackersOrBuilder> 
           getEventtrackersOrBuilderList() {
        if (eventtrackersBuilder_ != null) {
          return eventtrackersBuilder_.getMessageOrBuilderList();
        } else {
          return java.util.Collections.unmodifiableList(eventtrackers_);
        }
      }
      /**
       * <pre>
       * Specifies what type of event tracking is supported.
       * Implemented in 1.2
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.EventTrackers eventtrackers = 13;</code>
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers.Builder addEventtrackersBuilder() {
        return getEventtrackersFieldBuilder().addBuilder(
            com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers.getDefaultInstance());
      }
      /**
       * <pre>
       * Specifies what type of event tracking is supported.
       * Implemented in 1.2
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.EventTrackers eventtrackers = 13;</code>
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers.Builder addEventtrackersBuilder(
          int index) {
        return getEventtrackersFieldBuilder().addBuilder(
            index, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers.getDefaultInstance());
      }
      /**
       * <pre>
       * Specifies what type of event tracking is supported.
       * Implemented in 1.2
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeRequest.EventTrackers eventtrackers = 13;</code>
       */
      public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers.Builder> 
           getEventtrackersBuilderList() {
        return getEventtrackersFieldBuilder().getBuilderList();
      }
      private com.google.protobuf.RepeatedFieldBuilderV3<
          com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers.Builder, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackersOrBuilder> 
          getEventtrackersFieldBuilder() {
        if (eventtrackersBuilder_ == null) {
          eventtrackersBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
              com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackers.Builder, com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest.EventTrackersOrBuilder>(
                  eventtrackers_,
                  ((bitField0_ & 0x00000800) != 0),
                  getParentForChildren(),
                  isClean());
          eventtrackers_ = null;
        }
        return eventtrackersBuilder_;
      }

      private boolean privacy_ ;
      /**
       * <pre>
       * Set to 1 when the native ad supports buyer-specific privacy notice.
       * Set to 0 (or field absent) when the native ad doesn't support custom
       * privacy links or if support is unknown.
       * RECOMMENDED and implemented in 1.2
       * </pre>
       *
       * <code>optional bool privacy = 14;</code>
       * @return Whether the privacy field is set.
       */
      @java.lang.Override
      public boolean hasPrivacy() {
        return ((bitField0_ & 0x00001000) != 0);
      }
      /**
       * <pre>
       * Set to 1 when the native ad supports buyer-specific privacy notice.
       * Set to 0 (or field absent) when the native ad doesn't support custom
       * privacy links or if support is unknown.
       * RECOMMENDED and implemented in 1.2
       * </pre>
       *
       * <code>optional bool privacy = 14;</code>
       * @return The privacy.
       */
      @java.lang.Override
      public boolean getPrivacy() {
        return privacy_;
      }
      /**
       * <pre>
       * Set to 1 when the native ad supports buyer-specific privacy notice.
       * Set to 0 (or field absent) when the native ad doesn't support custom
       * privacy links or if support is unknown.
       * RECOMMENDED and implemented in 1.2
       * </pre>
       *
       * <code>optional bool privacy = 14;</code>
       * @param value The privacy to set.
       * @return This builder for chaining.
       */
      public Builder setPrivacy(boolean value) {
        bitField0_ |= 0x00001000;
        privacy_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Set to 1 when the native ad supports buyer-specific privacy notice.
       * Set to 0 (or field absent) when the native ad doesn't support custom
       * privacy links or if support is unknown.
       * RECOMMENDED and implemented in 1.2
       * </pre>
       *
       * <code>optional bool privacy = 14;</code>
       * @return This builder for chaining.
       */
      public Builder clearPrivacy() {
        bitField0_ = (bitField0_ & ~0x00001000);
        privacy_ = 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:com.iabtechlab.openrtb.v2.NativeRequest)
    }

    // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.NativeRequest)
    private static final com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest();
    }

    public static com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    @java.lang.Deprecated public static final com.google.protobuf.Parser<NativeRequest>
        PARSER = new com.google.protobuf.AbstractParser<NativeRequest>() {
      @java.lang.Override
      public NativeRequest parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new NativeRequest(input, extensionRegistry);
      }
    };

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

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

    @java.lang.Override
    public com.iabtechlab.openrtb.v2.OpenRtb.NativeRequest getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  public interface NativeResponseOrBuilder extends
      // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.NativeResponse)
      com.google.protobuf.GeneratedMessageV3.
          ExtendableMessageOrBuilder<NativeResponse> {

    /**
     * <pre>
     * Version of the Native Markup version in use.
     * RECOMMENDED in 1.2
     * </pre>
     *
     * <code>optional string ver = 1;</code>
     * @return Whether the ver field is set.
     */
    boolean hasVer();
    /**
     * <pre>
     * Version of the Native Markup version in use.
     * RECOMMENDED in 1.2
     * </pre>
     *
     * <code>optional string ver = 1;</code>
     * @return The ver.
     */
    java.lang.String getVer();
    /**
     * <pre>
     * Version of the Native Markup version in use.
     * RECOMMENDED in 1.2
     * </pre>
     *
     * <code>optional string ver = 1;</code>
     * @return The bytes for ver.
     */
    com.google.protobuf.ByteString
        getVerBytes();

    /**
     * <pre>
     * List of native ad's assets.
     * RECOMMENDED in 1.0, 1.1, or in 1.2 as a fallback if assetsurl is provided.
     * REQUIRED in 1.2, if not assetsurl is provided.
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.Asset assets = 2;</code>
     */
    java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset> 
        getAssetsList();
    /**
     * <pre>
     * List of native ad's assets.
     * RECOMMENDED in 1.0, 1.1, or in 1.2 as a fallback if assetsurl is provided.
     * REQUIRED in 1.2, if not assetsurl is provided.
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.Asset assets = 2;</code>
     */
    com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset getAssets(int index);
    /**
     * <pre>
     * List of native ad's assets.
     * RECOMMENDED in 1.0, 1.1, or in 1.2 as a fallback if assetsurl is provided.
     * REQUIRED in 1.2, if not assetsurl is provided.
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.Asset assets = 2;</code>
     */
    int getAssetsCount();
    /**
     * <pre>
     * List of native ad's assets.
     * RECOMMENDED in 1.0, 1.1, or in 1.2 as a fallback if assetsurl is provided.
     * REQUIRED in 1.2, if not assetsurl is provided.
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.Asset assets = 2;</code>
     */
    java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.AssetOrBuilder> 
        getAssetsOrBuilderList();
    /**
     * <pre>
     * List of native ad's assets.
     * RECOMMENDED in 1.0, 1.1, or in 1.2 as a fallback if assetsurl is provided.
     * REQUIRED in 1.2, if not assetsurl is provided.
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.Asset assets = 2;</code>
     */
    com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.AssetOrBuilder getAssetsOrBuilder(
        int index);

    /**
     * <pre>
     * URL of alternate source for the assets object. The expected response is a
     * JSON object mirroring the asset object in the bid response, subject to
     * certain requirements as specified in the individual objects.
     * Where present, overrides the assets object in the response.
     * Implemented in 1.2
     * </pre>
     *
     * <code>optional string assetsurl = 6;</code>
     * @return Whether the assetsurl field is set.
     */
    boolean hasAssetsurl();
    /**
     * <pre>
     * URL of alternate source for the assets object. The expected response is a
     * JSON object mirroring the asset object in the bid response, subject to
     * certain requirements as specified in the individual objects.
     * Where present, overrides the assets object in the response.
     * Implemented in 1.2
     * </pre>
     *
     * <code>optional string assetsurl = 6;</code>
     * @return The assetsurl.
     */
    java.lang.String getAssetsurl();
    /**
     * <pre>
     * URL of alternate source for the assets object. The expected response is a
     * JSON object mirroring the asset object in the bid response, subject to
     * certain requirements as specified in the individual objects.
     * Where present, overrides the assets object in the response.
     * Implemented in 1.2
     * </pre>
     *
     * <code>optional string assetsurl = 6;</code>
     * @return The bytes for assetsurl.
     */
    com.google.protobuf.ByteString
        getAssetsurlBytes();

    /**
     * <pre>
     * URL where a dynamic creative specification may be found for populating this
     * ad, per the Dynamic Content Ads Specification.
     * Note this is a beta option as the interpretation of the Dynamic Content Ads
     * Specification and how to assign those elementes into a native ad is outside
     * the scope of this spec and must be agreed offline between parties or as may
     * be specified in a future revision of the Dynamic Content Ads spec.
     * Where present, overrides the assets object in the response.
     * Implemented in 1.2
     * </pre>
     *
     * <code>optional string dcourl = 7;</code>
     * @return Whether the dcourl field is set.
     */
    boolean hasDcourl();
    /**
     * <pre>
     * URL where a dynamic creative specification may be found for populating this
     * ad, per the Dynamic Content Ads Specification.
     * Note this is a beta option as the interpretation of the Dynamic Content Ads
     * Specification and how to assign those elementes into a native ad is outside
     * the scope of this spec and must be agreed offline between parties or as may
     * be specified in a future revision of the Dynamic Content Ads spec.
     * Where present, overrides the assets object in the response.
     * Implemented in 1.2
     * </pre>
     *
     * <code>optional string dcourl = 7;</code>
     * @return The dcourl.
     */
    java.lang.String getDcourl();
    /**
     * <pre>
     * URL where a dynamic creative specification may be found for populating this
     * ad, per the Dynamic Content Ads Specification.
     * Note this is a beta option as the interpretation of the Dynamic Content Ads
     * Specification and how to assign those elementes into a native ad is outside
     * the scope of this spec and must be agreed offline between parties or as may
     * be specified in a future revision of the Dynamic Content Ads spec.
     * Where present, overrides the assets object in the response.
     * Implemented in 1.2
     * </pre>
     *
     * <code>optional string dcourl = 7;</code>
     * @return The bytes for dcourl.
     */
    com.google.protobuf.ByteString
        getDcourlBytes();

    /**
     * <pre>
     * Destination Link. This is default link object for the ad.
     * Individual assets can also have a link object which applies if the asset is
     * activated (clicked). If the asset doesn't have a link object, the parent
     * link object applies.
     * See ResponseLink definition.
     * REQUIRED by the OpenRTB Native specification.
     * </pre>
     *
     * <code>required .com.iabtechlab.openrtb.v2.NativeResponse.Link link = 3;</code>
     * @return Whether the link field is set.
     */
    boolean hasLink();
    /**
     * <pre>
     * Destination Link. This is default link object for the ad.
     * Individual assets can also have a link object which applies if the asset is
     * activated (clicked). If the asset doesn't have a link object, the parent
     * link object applies.
     * See ResponseLink definition.
     * REQUIRED by the OpenRTB Native specification.
     * </pre>
     *
     * <code>required .com.iabtechlab.openrtb.v2.NativeResponse.Link link = 3;</code>
     * @return The link.
     */
    com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link getLink();
    /**
     * <pre>
     * Destination Link. This is default link object for the ad.
     * Individual assets can also have a link object which applies if the asset is
     * activated (clicked). If the asset doesn't have a link object, the parent
     * link object applies.
     * See ResponseLink definition.
     * REQUIRED by the OpenRTB Native specification.
     * </pre>
     *
     * <code>required .com.iabtechlab.openrtb.v2.NativeResponse.Link link = 3;</code>
     */
    com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.LinkOrBuilder getLinkOrBuilder();

    /**
     * <pre>
     * Array of impression tracking URLs, expected to return a 1x1 image or
     * 204 response - typically only passed when using 3rd party trackers.
     * To be deprecated in 1.2 - Replaced with EventTracker.
     * </pre>
     *
     * <code>repeated string imptrackers = 4;</code>
     * @return A list containing the imptrackers.
     */
    java.util.List<java.lang.String>
        getImptrackersList();
    /**
     * <pre>
     * Array of impression tracking URLs, expected to return a 1x1 image or
     * 204 response - typically only passed when using 3rd party trackers.
     * To be deprecated in 1.2 - Replaced with EventTracker.
     * </pre>
     *
     * <code>repeated string imptrackers = 4;</code>
     * @return The count of imptrackers.
     */
    int getImptrackersCount();
    /**
     * <pre>
     * Array of impression tracking URLs, expected to return a 1x1 image or
     * 204 response - typically only passed when using 3rd party trackers.
     * To be deprecated in 1.2 - Replaced with EventTracker.
     * </pre>
     *
     * <code>repeated string imptrackers = 4;</code>
     * @param index The index of the element to return.
     * @return The imptrackers at the given index.
     */
    java.lang.String getImptrackers(int index);
    /**
     * <pre>
     * Array of impression tracking URLs, expected to return a 1x1 image or
     * 204 response - typically only passed when using 3rd party trackers.
     * To be deprecated in 1.2 - Replaced with EventTracker.
     * </pre>
     *
     * <code>repeated string imptrackers = 4;</code>
     * @param index The index of the value to return.
     * @return The bytes of the imptrackers at the given index.
     */
    com.google.protobuf.ByteString
        getImptrackersBytes(int index);

    /**
     * <pre>
     * Optional javascript impression tracker. Contains &lt;script&gt; tags to be
     * executed at impression time where it can be supported.
     * To be deprecated in 1.2 - Replaced with EventTracker.
     * </pre>
     *
     * <code>optional string jstracker = 5;</code>
     * @return Whether the jstracker field is set.
     */
    boolean hasJstracker();
    /**
     * <pre>
     * Optional javascript impression tracker. Contains &lt;script&gt; tags to be
     * executed at impression time where it can be supported.
     * To be deprecated in 1.2 - Replaced with EventTracker.
     * </pre>
     *
     * <code>optional string jstracker = 5;</code>
     * @return The jstracker.
     */
    java.lang.String getJstracker();
    /**
     * <pre>
     * Optional javascript impression tracker. Contains &lt;script&gt; tags to be
     * executed at impression time where it can be supported.
     * To be deprecated in 1.2 - Replaced with EventTracker.
     * </pre>
     *
     * <code>optional string jstracker = 5;</code>
     * @return The bytes for jstracker.
     */
    com.google.protobuf.ByteString
        getJstrackerBytes();

    /**
     * <pre>
     * Array of response event trackers to run with the ad, in response to the
     * declared supported methods in the NativeRequest. Replaces imptrackers and
     * jstrackers.
     * Implemented in 1.2
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.EventTracker eventtrackers = 8;</code>
     */
    java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker> 
        getEventtrackersList();
    /**
     * <pre>
     * Array of response event trackers to run with the ad, in response to the
     * declared supported methods in the NativeRequest. Replaces imptrackers and
     * jstrackers.
     * Implemented in 1.2
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.EventTracker eventtrackers = 8;</code>
     */
    com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker getEventtrackers(int index);
    /**
     * <pre>
     * Array of response event trackers to run with the ad, in response to the
     * declared supported methods in the NativeRequest. Replaces imptrackers and
     * jstrackers.
     * Implemented in 1.2
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.EventTracker eventtrackers = 8;</code>
     */
    int getEventtrackersCount();
    /**
     * <pre>
     * Array of response event trackers to run with the ad, in response to the
     * declared supported methods in the NativeRequest. Replaces imptrackers and
     * jstrackers.
     * Implemented in 1.2
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.EventTracker eventtrackers = 8;</code>
     */
    java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTrackerOrBuilder> 
        getEventtrackersOrBuilderList();
    /**
     * <pre>
     * Array of response event trackers to run with the ad, in response to the
     * declared supported methods in the NativeRequest. Replaces imptrackers and
     * jstrackers.
     * Implemented in 1.2
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.EventTracker eventtrackers = 8;</code>
     */
    com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTrackerOrBuilder getEventtrackersOrBuilder(
        int index);

    /**
     * <pre>
     * If support was indicated in the request, URL of a page informing the user
     * about the buyer's targeting activity.
     * Implemented in 1.2
     * </pre>
     *
     * <code>optional string privacy = 9;</code>
     * @return Whether the privacy field is set.
     */
    boolean hasPrivacy();
    /**
     * <pre>
     * If support was indicated in the request, URL of a page informing the user
     * about the buyer's targeting activity.
     * Implemented in 1.2
     * </pre>
     *
     * <code>optional string privacy = 9;</code>
     * @return The privacy.
     */
    java.lang.String getPrivacy();
    /**
     * <pre>
     * If support was indicated in the request, URL of a page informing the user
     * about the buyer's targeting activity.
     * Implemented in 1.2
     * </pre>
     *
     * <code>optional string privacy = 9;</code>
     * @return The bytes for privacy.
     */
    com.google.protobuf.ByteString
        getPrivacyBytes();
  }
  /**
   * <pre>
   * OpenRTB Native 1.0: The native response object is the top level JSON object
   * which identifies an native response.
   * Note: Prior to VERSION 1.1, the native response's root node was an object
   * with a single field "native" that would contain the object above as its
   * value.
   * In 1.2 The NativeResponse Object specified here is now the root object.
   * </pre>
   *
   * Protobuf type {@code com.iabtechlab.openrtb.v2.NativeResponse}
   */
  public static final class NativeResponse extends
      com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
        NativeResponse> implements
      // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.NativeResponse)
      NativeResponseOrBuilder {
  private static final long serialVersionUID = 0L;
    // Use NativeResponse.newBuilder() to construct.
    private NativeResponse(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse, ?> builder) {
      super(builder);
    }
    private NativeResponse() {
      ver_ = "";
      assets_ = java.util.Collections.emptyList();
      assetsurl_ = "";
      dcourl_ = "";
      imptrackers_ = com.google.protobuf.LazyStringArrayList.EMPTY;
      jstracker_ = "";
      eventtrackers_ = java.util.Collections.emptyList();
      privacy_ = "";
    }

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

    @java.lang.Override
    public final com.google.protobuf.UnknownFieldSet
    getUnknownFields() {
      return this.unknownFields;
    }
    private NativeResponse(
        com.google.protobuf.CodedInputStream input,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      this();
      if (extensionRegistry == null) {
        throw new java.lang.NullPointerException();
      }
      int mutable_bitField0_ = 0;
      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
          com.google.protobuf.UnknownFieldSet.newBuilder();
      try {
        boolean done = false;
        while (!done) {
          int tag = input.readTag();
          switch (tag) {
            case 0:
              done = true;
              break;
            case 10: {
              com.google.protobuf.ByteString bs = input.readBytes();
              bitField0_ |= 0x00000001;
              ver_ = bs;
              break;
            }
            case 18: {
              if (!((mutable_bitField0_ & 0x00000002) != 0)) {
                assets_ = new java.util.ArrayList<com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset>();
                mutable_bitField0_ |= 0x00000002;
              }
              assets_.add(
                  input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.PARSER, extensionRegistry));
              break;
            }
            case 26: {
              com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link.Builder subBuilder = null;
              if (((bitField0_ & 0x00000008) != 0)) {
                subBuilder = link_.toBuilder();
              }
              link_ = input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link.PARSER, extensionRegistry);
              if (subBuilder != null) {
                subBuilder.mergeFrom(link_);
                link_ = subBuilder.buildPartial();
              }
              bitField0_ |= 0x00000008;
              break;
            }
            case 34: {
              com.google.protobuf.ByteString bs = input.readBytes();
              if (!((mutable_bitField0_ & 0x00000020) != 0)) {
                imptrackers_ = new com.google.protobuf.LazyStringArrayList();
                mutable_bitField0_ |= 0x00000020;
              }
              imptrackers_.add(bs);
              break;
            }
            case 42: {
              com.google.protobuf.ByteString bs = input.readBytes();
              bitField0_ |= 0x00000010;
              jstracker_ = bs;
              break;
            }
            case 50: {
              com.google.protobuf.ByteString bs = input.readBytes();
              bitField0_ |= 0x00000002;
              assetsurl_ = bs;
              break;
            }
            case 58: {
              com.google.protobuf.ByteString bs = input.readBytes();
              bitField0_ |= 0x00000004;
              dcourl_ = bs;
              break;
            }
            case 66: {
              if (!((mutable_bitField0_ & 0x00000080) != 0)) {
                eventtrackers_ = new java.util.ArrayList<com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker>();
                mutable_bitField0_ |= 0x00000080;
              }
              eventtrackers_.add(
                  input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker.PARSER, extensionRegistry));
              break;
            }
            case 74: {
              com.google.protobuf.ByteString bs = input.readBytes();
              bitField0_ |= 0x00000020;
              privacy_ = bs;
              break;
            }
            default: {
              if (!parseUnknownField(
                  input, unknownFields, extensionRegistry, tag)) {
                done = true;
              }
              break;
            }
          }
        }
      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
        throw e.setUnfinishedMessage(this);
      } catch (java.io.IOException e) {
        throw new com.google.protobuf.InvalidProtocolBufferException(
            e).setUnfinishedMessage(this);
      } finally {
        if (((mutable_bitField0_ & 0x00000002) != 0)) {
          assets_ = java.util.Collections.unmodifiableList(assets_);
        }
        if (((mutable_bitField0_ & 0x00000020) != 0)) {
          imptrackers_ = imptrackers_.getUnmodifiableView();
        }
        if (((mutable_bitField0_ & 0x00000080) != 0)) {
          eventtrackers_ = java.util.Collections.unmodifiableList(eventtrackers_);
        }
        this.unknownFields = unknownFields.build();
        makeExtensionsImmutable();
      }
    }
    public static final com.google.protobuf.Descriptors.Descriptor
        getDescriptor() {
      return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeResponse_descriptor;
    }

    @java.lang.Override
    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
        internalGetFieldAccessorTable() {
      return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeResponse_fieldAccessorTable
          .ensureFieldAccessorsInitialized(
              com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.class, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Builder.class);
    }

    public interface LinkOrBuilder extends
        // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.NativeResponse.Link)
        com.google.protobuf.GeneratedMessageV3.
            ExtendableMessageOrBuilder<Link> {

      /**
       * <pre>
       * Landing URL of the clickable link.
       * REQUIRED by the OpenRTB Native specification.
       * </pre>
       *
       * <code>required string url = 1;</code>
       * @return Whether the url field is set.
       */
      boolean hasUrl();
      /**
       * <pre>
       * Landing URL of the clickable link.
       * REQUIRED by the OpenRTB Native specification.
       * </pre>
       *
       * <code>required string url = 1;</code>
       * @return The url.
       */
      java.lang.String getUrl();
      /**
       * <pre>
       * Landing URL of the clickable link.
       * REQUIRED by the OpenRTB Native specification.
       * </pre>
       *
       * <code>required string url = 1;</code>
       * @return The bytes for url.
       */
      com.google.protobuf.ByteString
          getUrlBytes();

      /**
       * <pre>
       * List of third-party tracker URLs to be fired on click of the URL.
       * </pre>
       *
       * <code>repeated string clicktrackers = 2;</code>
       * @return A list containing the clicktrackers.
       */
      java.util.List<java.lang.String>
          getClicktrackersList();
      /**
       * <pre>
       * List of third-party tracker URLs to be fired on click of the URL.
       * </pre>
       *
       * <code>repeated string clicktrackers = 2;</code>
       * @return The count of clicktrackers.
       */
      int getClicktrackersCount();
      /**
       * <pre>
       * List of third-party tracker URLs to be fired on click of the URL.
       * </pre>
       *
       * <code>repeated string clicktrackers = 2;</code>
       * @param index The index of the element to return.
       * @return The clicktrackers at the given index.
       */
      java.lang.String getClicktrackers(int index);
      /**
       * <pre>
       * List of third-party tracker URLs to be fired on click of the URL.
       * </pre>
       *
       * <code>repeated string clicktrackers = 2;</code>
       * @param index The index of the value to return.
       * @return The bytes of the clicktrackers at the given index.
       */
      com.google.protobuf.ByteString
          getClicktrackersBytes(int index);

      /**
       * <pre>
       * Fallback URL for deeplink. To be used if the URL given in url is not
       * supported by the device.
       * </pre>
       *
       * <code>optional string fallback = 3;</code>
       * @return Whether the fallback field is set.
       */
      boolean hasFallback();
      /**
       * <pre>
       * Fallback URL for deeplink. To be used if the URL given in url is not
       * supported by the device.
       * </pre>
       *
       * <code>optional string fallback = 3;</code>
       * @return The fallback.
       */
      java.lang.String getFallback();
      /**
       * <pre>
       * Fallback URL for deeplink. To be used if the URL given in url is not
       * supported by the device.
       * </pre>
       *
       * <code>optional string fallback = 3;</code>
       * @return The bytes for fallback.
       */
      com.google.protobuf.ByteString
          getFallbackBytes();
    }
    /**
     * <pre>
     * OpenRTB Native 1.0: Used for "call to action" assets, or other links from
     * the Native ad. This Object should be associated to its peer object in the
     * parent Asset Object or as the master link in the top level NativeResponse
     * object. When that peer object is activated (clicked) the action should take
     * the user to the location of the link.
     * </pre>
     *
     * Protobuf type {@code com.iabtechlab.openrtb.v2.NativeResponse.Link}
     */
    public static final class Link extends
        com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
          Link> implements
        // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.NativeResponse.Link)
        LinkOrBuilder {
    private static final long serialVersionUID = 0L;
      // Use Link.newBuilder() to construct.
      private Link(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link, ?> builder) {
        super(builder);
      }
      private Link() {
        url_ = "";
        clicktrackers_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        fallback_ = "";
      }

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

      @java.lang.Override
      public final com.google.protobuf.UnknownFieldSet
      getUnknownFields() {
        return this.unknownFields;
      }
      private Link(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        this();
        if (extensionRegistry == null) {
          throw new java.lang.NullPointerException();
        }
        int mutable_bitField0_ = 0;
        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
            com.google.protobuf.UnknownFieldSet.newBuilder();
        try {
          boolean done = false;
          while (!done) {
            int tag = input.readTag();
            switch (tag) {
              case 0:
                done = true;
                break;
              case 10: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000001;
                url_ = bs;
                break;
              }
              case 18: {
                com.google.protobuf.ByteString bs = input.readBytes();
                if (!((mutable_bitField0_ & 0x00000002) != 0)) {
                  clicktrackers_ = new com.google.protobuf.LazyStringArrayList();
                  mutable_bitField0_ |= 0x00000002;
                }
                clicktrackers_.add(bs);
                break;
              }
              case 26: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000002;
                fallback_ = bs;
                break;
              }
              default: {
                if (!parseUnknownField(
                    input, unknownFields, extensionRegistry, tag)) {
                  done = true;
                }
                break;
              }
            }
          }
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          throw e.setUnfinishedMessage(this);
        } catch (java.io.IOException e) {
          throw new com.google.protobuf.InvalidProtocolBufferException(
              e).setUnfinishedMessage(this);
        } finally {
          if (((mutable_bitField0_ & 0x00000002) != 0)) {
            clicktrackers_ = clicktrackers_.getUnmodifiableView();
          }
          this.unknownFields = unknownFields.build();
          makeExtensionsImmutable();
        }
      }
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Link_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Link_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link.class, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link.Builder.class);
      }

      private int bitField0_;
      public static final int URL_FIELD_NUMBER = 1;
      private volatile java.lang.Object url_;
      /**
       * <pre>
       * Landing URL of the clickable link.
       * REQUIRED by the OpenRTB Native specification.
       * </pre>
       *
       * <code>required string url = 1;</code>
       * @return Whether the url field is set.
       */
      @java.lang.Override
      public boolean hasUrl() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <pre>
       * Landing URL of the clickable link.
       * REQUIRED by the OpenRTB Native specification.
       * </pre>
       *
       * <code>required string url = 1;</code>
       * @return The url.
       */
      @java.lang.Override
      public java.lang.String getUrl() {
        java.lang.Object ref = url_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            url_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Landing URL of the clickable link.
       * REQUIRED by the OpenRTB Native specification.
       * </pre>
       *
       * <code>required string url = 1;</code>
       * @return The bytes for url.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getUrlBytes() {
        java.lang.Object ref = url_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          url_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

      public static final int CLICKTRACKERS_FIELD_NUMBER = 2;
      private com.google.protobuf.LazyStringList clicktrackers_;
      /**
       * <pre>
       * List of third-party tracker URLs to be fired on click of the URL.
       * </pre>
       *
       * <code>repeated string clicktrackers = 2;</code>
       * @return A list containing the clicktrackers.
       */
      public com.google.protobuf.ProtocolStringList
          getClicktrackersList() {
        return clicktrackers_;
      }
      /**
       * <pre>
       * List of third-party tracker URLs to be fired on click of the URL.
       * </pre>
       *
       * <code>repeated string clicktrackers = 2;</code>
       * @return The count of clicktrackers.
       */
      public int getClicktrackersCount() {
        return clicktrackers_.size();
      }
      /**
       * <pre>
       * List of third-party tracker URLs to be fired on click of the URL.
       * </pre>
       *
       * <code>repeated string clicktrackers = 2;</code>
       * @param index The index of the element to return.
       * @return The clicktrackers at the given index.
       */
      public java.lang.String getClicktrackers(int index) {
        return clicktrackers_.get(index);
      }
      /**
       * <pre>
       * List of third-party tracker URLs to be fired on click of the URL.
       * </pre>
       *
       * <code>repeated string clicktrackers = 2;</code>
       * @param index The index of the value to return.
       * @return The bytes of the clicktrackers at the given index.
       */
      public com.google.protobuf.ByteString
          getClicktrackersBytes(int index) {
        return clicktrackers_.getByteString(index);
      }

      public static final int FALLBACK_FIELD_NUMBER = 3;
      private volatile java.lang.Object fallback_;
      /**
       * <pre>
       * Fallback URL for deeplink. To be used if the URL given in url is not
       * supported by the device.
       * </pre>
       *
       * <code>optional string fallback = 3;</code>
       * @return Whether the fallback field is set.
       */
      @java.lang.Override
      public boolean hasFallback() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <pre>
       * Fallback URL for deeplink. To be used if the URL given in url is not
       * supported by the device.
       * </pre>
       *
       * <code>optional string fallback = 3;</code>
       * @return The fallback.
       */
      @java.lang.Override
      public java.lang.String getFallback() {
        java.lang.Object ref = fallback_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            fallback_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * Fallback URL for deeplink. To be used if the URL given in url is not
       * supported by the device.
       * </pre>
       *
       * <code>optional string fallback = 3;</code>
       * @return The bytes for fallback.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getFallbackBytes() {
        java.lang.Object ref = fallback_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          fallback_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

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

        if (!hasUrl()) {
          memoizedIsInitialized = 0;
          return false;
        }
        if (!extensionsAreInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
        memoizedIsInitialized = 1;
        return true;
      }

      @java.lang.Override
      public void writeTo(com.google.protobuf.CodedOutputStream output)
                          throws java.io.IOException {
        com.google.protobuf.GeneratedMessageV3
          .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link>.ExtensionWriter
            extensionWriter = newExtensionWriter();
        if (((bitField0_ & 0x00000001) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 1, url_);
        }
        for (int i = 0; i < clicktrackers_.size(); i++) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 2, clicktrackers_.getRaw(i));
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 3, fallback_);
        }
        extensionWriter.writeUntil(10000, output);
        unknownFields.writeTo(output);
      }

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

        size = 0;
        if (((bitField0_ & 0x00000001) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, url_);
        }
        {
          int dataSize = 0;
          for (int i = 0; i < clicktrackers_.size(); i++) {
            dataSize += computeStringSizeNoTag(clicktrackers_.getRaw(i));
          }
          size += dataSize;
          size += 1 * getClicktrackersList().size();
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, fallback_);
        }
        size += extensionsSerializedSize();
        size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link)) {
          return super.equals(obj);
        }
        com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link other = (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link) obj;

        if (hasUrl() != other.hasUrl()) return false;
        if (hasUrl()) {
          if (!getUrl()
              .equals(other.getUrl())) return false;
        }
        if (!getClicktrackersList()
            .equals(other.getClicktrackersList())) return false;
        if (hasFallback() != other.hasFallback()) return false;
        if (hasFallback()) {
          if (!getFallback()
              .equals(other.getFallback())) return false;
        }
        if (!unknownFields.equals(other.unknownFields)) return false;
        if (!getExtensionFields().equals(other.getExtensionFields()))
          return false;
        return true;
      }

      @java.lang.Override
      public int hashCode() {
        if (memoizedHashCode != 0) {
          return memoizedHashCode;
        }
        int hash = 41;
        hash = (19 * hash) + getDescriptor().hashCode();
        if (hasUrl()) {
          hash = (37 * hash) + URL_FIELD_NUMBER;
          hash = (53 * hash) + getUrl().hashCode();
        }
        if (getClicktrackersCount() > 0) {
          hash = (37 * hash) + CLICKTRACKERS_FIELD_NUMBER;
          hash = (53 * hash) + getClicktrackersList().hashCode();
        }
        if (hasFallback()) {
          hash = (37 * hash) + FALLBACK_FIELD_NUMBER;
          hash = (53 * hash) + getFallback().hashCode();
        }
        hash = hashFields(hash, getExtensionFields());
        hash = (29 * hash) + unknownFields.hashCode();
        memoizedHashCode = hash;
        return hash;
      }

      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link parseFrom(
          java.nio.ByteBuffer data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link parseFrom(
          java.nio.ByteBuffer data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link parseFrom(
          com.google.protobuf.ByteString data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link parseFrom(
          com.google.protobuf.ByteString data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link parseFrom(byte[] data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link parseFrom(
          byte[] data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link parseFrom(java.io.InputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link 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.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link parseDelimitedFrom(java.io.InputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseDelimitedWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link 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.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link parseFrom(
          com.google.protobuf.CodedInputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link 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.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link 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>
       * OpenRTB Native 1.0: Used for "call to action" assets, or other links from
       * the Native ad. This Object should be associated to its peer object in the
       * parent Asset Object or as the master link in the top level NativeResponse
       * object. When that peer object is activated (clicked) the action should take
       * the user to the location of the link.
       * </pre>
       *
       * Protobuf type {@code com.iabtechlab.openrtb.v2.NativeResponse.Link}
       */
      public static final class Builder extends
          com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
            com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link, Builder> implements
          // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.NativeResponse.Link)
          com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.LinkOrBuilder {
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Link_descriptor;
        }

        @java.lang.Override
        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Link_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link.class, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link.Builder.class);
        }

        // Construct using com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link.newBuilder()
        private Builder() {
          maybeForceBuilderInitialization();
        }

        private Builder(
            com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
          super(parent);
          maybeForceBuilderInitialization();
        }
        private void maybeForceBuilderInitialization() {
          if (com.google.protobuf.GeneratedMessageV3
                  .alwaysUseFieldBuilders) {
          }
        }
        @java.lang.Override
        public Builder clear() {
          super.clear();
          url_ = "";
          bitField0_ = (bitField0_ & ~0x00000001);
          clicktrackers_ = com.google.protobuf.LazyStringArrayList.EMPTY;
          bitField0_ = (bitField0_ & ~0x00000002);
          fallback_ = "";
          bitField0_ = (bitField0_ & ~0x00000004);
          return this;
        }

        @java.lang.Override
        public com.google.protobuf.Descriptors.Descriptor
            getDescriptorForType() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Link_descriptor;
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link getDefaultInstanceForType() {
          return com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link.getDefaultInstance();
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link build() {
          com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link result = buildPartial();
          if (!result.isInitialized()) {
            throw newUninitializedMessageException(result);
          }
          return result;
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link buildPartial() {
          com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link result = new com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link(this);
          int from_bitField0_ = bitField0_;
          int to_bitField0_ = 0;
          if (((from_bitField0_ & 0x00000001) != 0)) {
            to_bitField0_ |= 0x00000001;
          }
          result.url_ = url_;
          if (((bitField0_ & 0x00000002) != 0)) {
            clicktrackers_ = clicktrackers_.getUnmodifiableView();
            bitField0_ = (bitField0_ & ~0x00000002);
          }
          result.clicktrackers_ = clicktrackers_;
          if (((from_bitField0_ & 0x00000004) != 0)) {
            to_bitField0_ |= 0x00000002;
          }
          result.fallback_ = fallback_;
          result.bitField0_ = to_bitField0_;
          onBuilt();
          return result;
        }

        @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 <Type> Builder setExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link, Type> extension,
            Type value) {
          return super.setExtension(extension, value);
        }
        @java.lang.Override
        public <Type> Builder setExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link, java.util.List<Type>> extension,
            int index, Type value) {
          return super.setExtension(extension, index, value);
        }
        @java.lang.Override
        public <Type> Builder addExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link, java.util.List<Type>> extension,
            Type value) {
          return super.addExtension(extension, value);
        }
        @java.lang.Override
        public <Type> Builder clearExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link, ?> extension) {
          return super.clearExtension(extension);
        }
        @java.lang.Override
        public Builder mergeFrom(com.google.protobuf.Message other) {
          if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link) {
            return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link)other);
          } else {
            super.mergeFrom(other);
            return this;
          }
        }

        public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link other) {
          if (other == com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link.getDefaultInstance()) return this;
          if (other.hasUrl()) {
            bitField0_ |= 0x00000001;
            url_ = other.url_;
            onChanged();
          }
          if (!other.clicktrackers_.isEmpty()) {
            if (clicktrackers_.isEmpty()) {
              clicktrackers_ = other.clicktrackers_;
              bitField0_ = (bitField0_ & ~0x00000002);
            } else {
              ensureClicktrackersIsMutable();
              clicktrackers_.addAll(other.clicktrackers_);
            }
            onChanged();
          }
          if (other.hasFallback()) {
            bitField0_ |= 0x00000004;
            fallback_ = other.fallback_;
            onChanged();
          }
          this.mergeExtensionFields(other);
          this.mergeUnknownFields(other.unknownFields);
          onChanged();
          return this;
        }

        @java.lang.Override
        public final boolean isInitialized() {
          if (!hasUrl()) {
            return false;
          }
          if (!extensionsAreInitialized()) {
            return false;
          }
          return true;
        }

        @java.lang.Override
        public Builder mergeFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws java.io.IOException {
          com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link parsedMessage = null;
          try {
            parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link) e.getUnfinishedMessage();
            throw e.unwrapIOException();
          } finally {
            if (parsedMessage != null) {
              mergeFrom(parsedMessage);
            }
          }
          return this;
        }
        private int bitField0_;

        private java.lang.Object url_ = "";
        /**
         * <pre>
         * Landing URL of the clickable link.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>required string url = 1;</code>
         * @return Whether the url field is set.
         */
        public boolean hasUrl() {
          return ((bitField0_ & 0x00000001) != 0);
        }
        /**
         * <pre>
         * Landing URL of the clickable link.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>required string url = 1;</code>
         * @return The url.
         */
        public java.lang.String getUrl() {
          java.lang.Object ref = url_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              url_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Landing URL of the clickable link.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>required string url = 1;</code>
         * @return The bytes for url.
         */
        public com.google.protobuf.ByteString
            getUrlBytes() {
          java.lang.Object ref = url_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            url_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Landing URL of the clickable link.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>required string url = 1;</code>
         * @param value The url to set.
         * @return This builder for chaining.
         */
        public Builder setUrl(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
          url_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Landing URL of the clickable link.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>required string url = 1;</code>
         * @return This builder for chaining.
         */
        public Builder clearUrl() {
          bitField0_ = (bitField0_ & ~0x00000001);
          url_ = getDefaultInstance().getUrl();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Landing URL of the clickable link.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>required string url = 1;</code>
         * @param value The bytes for url to set.
         * @return This builder for chaining.
         */
        public Builder setUrlBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
          url_ = value;
          onChanged();
          return this;
        }

        private com.google.protobuf.LazyStringList clicktrackers_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        private void ensureClicktrackersIsMutable() {
          if (!((bitField0_ & 0x00000002) != 0)) {
            clicktrackers_ = new com.google.protobuf.LazyStringArrayList(clicktrackers_);
            bitField0_ |= 0x00000002;
           }
        }
        /**
         * <pre>
         * List of third-party tracker URLs to be fired on click of the URL.
         * </pre>
         *
         * <code>repeated string clicktrackers = 2;</code>
         * @return A list containing the clicktrackers.
         */
        public com.google.protobuf.ProtocolStringList
            getClicktrackersList() {
          return clicktrackers_.getUnmodifiableView();
        }
        /**
         * <pre>
         * List of third-party tracker URLs to be fired on click of the URL.
         * </pre>
         *
         * <code>repeated string clicktrackers = 2;</code>
         * @return The count of clicktrackers.
         */
        public int getClicktrackersCount() {
          return clicktrackers_.size();
        }
        /**
         * <pre>
         * List of third-party tracker URLs to be fired on click of the URL.
         * </pre>
         *
         * <code>repeated string clicktrackers = 2;</code>
         * @param index The index of the element to return.
         * @return The clicktrackers at the given index.
         */
        public java.lang.String getClicktrackers(int index) {
          return clicktrackers_.get(index);
        }
        /**
         * <pre>
         * List of third-party tracker URLs to be fired on click of the URL.
         * </pre>
         *
         * <code>repeated string clicktrackers = 2;</code>
         * @param index The index of the value to return.
         * @return The bytes of the clicktrackers at the given index.
         */
        public com.google.protobuf.ByteString
            getClicktrackersBytes(int index) {
          return clicktrackers_.getByteString(index);
        }
        /**
         * <pre>
         * List of third-party tracker URLs to be fired on click of the URL.
         * </pre>
         *
         * <code>repeated string clicktrackers = 2;</code>
         * @param index The index to set the value at.
         * @param value The clicktrackers to set.
         * @return This builder for chaining.
         */
        public Builder setClicktrackers(
            int index, java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  ensureClicktrackersIsMutable();
          clicktrackers_.set(index, value);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * List of third-party tracker URLs to be fired on click of the URL.
         * </pre>
         *
         * <code>repeated string clicktrackers = 2;</code>
         * @param value The clicktrackers to add.
         * @return This builder for chaining.
         */
        public Builder addClicktrackers(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  ensureClicktrackersIsMutable();
          clicktrackers_.add(value);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * List of third-party tracker URLs to be fired on click of the URL.
         * </pre>
         *
         * <code>repeated string clicktrackers = 2;</code>
         * @param values The clicktrackers to add.
         * @return This builder for chaining.
         */
        public Builder addAllClicktrackers(
            java.lang.Iterable<java.lang.String> values) {
          ensureClicktrackersIsMutable();
          com.google.protobuf.AbstractMessageLite.Builder.addAll(
              values, clicktrackers_);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * List of third-party tracker URLs to be fired on click of the URL.
         * </pre>
         *
         * <code>repeated string clicktrackers = 2;</code>
         * @return This builder for chaining.
         */
        public Builder clearClicktrackers() {
          clicktrackers_ = com.google.protobuf.LazyStringArrayList.EMPTY;
          bitField0_ = (bitField0_ & ~0x00000002);
          onChanged();
          return this;
        }
        /**
         * <pre>
         * List of third-party tracker URLs to be fired on click of the URL.
         * </pre>
         *
         * <code>repeated string clicktrackers = 2;</code>
         * @param value The bytes of the clicktrackers to add.
         * @return This builder for chaining.
         */
        public Builder addClicktrackersBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  ensureClicktrackersIsMutable();
          clicktrackers_.add(value);
          onChanged();
          return this;
        }

        private java.lang.Object fallback_ = "";
        /**
         * <pre>
         * Fallback URL for deeplink. To be used if the URL given in url is not
         * supported by the device.
         * </pre>
         *
         * <code>optional string fallback = 3;</code>
         * @return Whether the fallback field is set.
         */
        public boolean hasFallback() {
          return ((bitField0_ & 0x00000004) != 0);
        }
        /**
         * <pre>
         * Fallback URL for deeplink. To be used if the URL given in url is not
         * supported by the device.
         * </pre>
         *
         * <code>optional string fallback = 3;</code>
         * @return The fallback.
         */
        public java.lang.String getFallback() {
          java.lang.Object ref = fallback_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              fallback_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * Fallback URL for deeplink. To be used if the URL given in url is not
         * supported by the device.
         * </pre>
         *
         * <code>optional string fallback = 3;</code>
         * @return The bytes for fallback.
         */
        public com.google.protobuf.ByteString
            getFallbackBytes() {
          java.lang.Object ref = fallback_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            fallback_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * Fallback URL for deeplink. To be used if the URL given in url is not
         * supported by the device.
         * </pre>
         *
         * <code>optional string fallback = 3;</code>
         * @param value The fallback to set.
         * @return This builder for chaining.
         */
        public Builder setFallback(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
          fallback_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Fallback URL for deeplink. To be used if the URL given in url is not
         * supported by the device.
         * </pre>
         *
         * <code>optional string fallback = 3;</code>
         * @return This builder for chaining.
         */
        public Builder clearFallback() {
          bitField0_ = (bitField0_ & ~0x00000004);
          fallback_ = getDefaultInstance().getFallback();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Fallback URL for deeplink. To be used if the URL given in url is not
         * supported by the device.
         * </pre>
         *
         * <code>optional string fallback = 3;</code>
         * @param value The bytes for fallback to set.
         * @return This builder for chaining.
         */
        public Builder setFallbackBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
          fallback_ = value;
          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:com.iabtechlab.openrtb.v2.NativeResponse.Link)
      }

      // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.NativeResponse.Link)
      private static final com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link DEFAULT_INSTANCE;
      static {
        DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link();
      }

      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link getDefaultInstance() {
        return DEFAULT_INSTANCE;
      }

      @java.lang.Deprecated public static final com.google.protobuf.Parser<Link>
          PARSER = new com.google.protobuf.AbstractParser<Link>() {
        @java.lang.Override
        public Link parsePartialFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return new Link(input, extensionRegistry);
        }
      };

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

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

      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link getDefaultInstanceForType() {
        return DEFAULT_INSTANCE;
      }

    }

    public interface AssetOrBuilder extends
        // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.NativeResponse.Asset)
        com.google.protobuf.GeneratedMessageV3.
            ExtendableMessageOrBuilder<Asset> {

      /**
       * <pre>
       * Unique asset ID, assigned by exchange, must match one of the asset IDs
       * in request.
       * REQUIRED in 1.0, or in 1.2 if embedded asset is being used.
       * </pre>
       *
       * <code>required int32 id = 1;</code>
       * @return Whether the id field is set.
       */
      boolean hasId();
      /**
       * <pre>
       * Unique asset ID, assigned by exchange, must match one of the asset IDs
       * in request.
       * REQUIRED in 1.0, or in 1.2 if embedded asset is being used.
       * </pre>
       *
       * <code>required int32 id = 1;</code>
       * @return The id.
       */
      int getId();

      /**
       * <pre>
       * Set to 1 if asset is required. (bidder requires it to be displayed).
       * </pre>
       *
       * <code>optional bool required = 2 [default = false];</code>
       * @return Whether the required field is set.
       */
      boolean hasRequired();
      /**
       * <pre>
       * Set to 1 if asset is required. (bidder requires it to be displayed).
       * </pre>
       *
       * <code>optional bool required = 2 [default = false];</code>
       * @return The required.
       */
      boolean getRequired();

      /**
       * <pre>
       * Title object for title assets.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Title title = 3;</code>
       * @return Whether the title field is set.
       */
      boolean hasTitle();
      /**
       * <pre>
       * Title object for title assets.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Title title = 3;</code>
       * @return The title.
       */
      com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title getTitle();
      /**
       * <pre>
       * Title object for title assets.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Title title = 3;</code>
       */
      com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.TitleOrBuilder getTitleOrBuilder();

      /**
       * <pre>
       * Image object for image assets.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Image img = 4;</code>
       * @return Whether the img field is set.
       */
      boolean hasImg();
      /**
       * <pre>
       * Image object for image assets.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Image img = 4;</code>
       * @return The img.
       */
      com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image getImg();
      /**
       * <pre>
       * Image object for image assets.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Image img = 4;</code>
       */
      com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.ImageOrBuilder getImgOrBuilder();

      /**
       * <pre>
       * Video object for video assets.
       * Note that in-stream video ads are not part of Native.
       * Native ads may contain a video as the ad creative itself.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Video video = 5;</code>
       * @return Whether the video field is set.
       */
      boolean hasVideo();
      /**
       * <pre>
       * Video object for video assets.
       * Note that in-stream video ads are not part of Native.
       * Native ads may contain a video as the ad creative itself.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Video video = 5;</code>
       * @return The video.
       */
      com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video getVideo();
      /**
       * <pre>
       * Video object for video assets.
       * Note that in-stream video ads are not part of Native.
       * Native ads may contain a video as the ad creative itself.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Video video = 5;</code>
       */
      com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.VideoOrBuilder getVideoOrBuilder();

      /**
       * <pre>
       * Data object for ratings, prices etc.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Data data = 6;</code>
       * @return Whether the data field is set.
       */
      boolean hasData();
      /**
       * <pre>
       * Data object for ratings, prices etc.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Data data = 6;</code>
       * @return The data.
       */
      com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data getData();
      /**
       * <pre>
       * Data object for ratings, prices etc.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Data data = 6;</code>
       */
      com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.DataOrBuilder getDataOrBuilder();

      /**
       * <pre>
       * Link object for call to actions.
       * This link object applies if the asset item is activated (clicked).
       * If there is no link object on the asset, the parent link object on the
       * bid response apply.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.NativeResponse.Link link = 7;</code>
       * @return Whether the link field is set.
       */
      boolean hasLink();
      /**
       * <pre>
       * Link object for call to actions.
       * This link object applies if the asset item is activated (clicked).
       * If there is no link object on the asset, the parent link object on the
       * bid response apply.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.NativeResponse.Link link = 7;</code>
       * @return The link.
       */
      com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link getLink();
      /**
       * <pre>
       * Link object for call to actions.
       * This link object applies if the asset item is activated (clicked).
       * If there is no link object on the asset, the parent link object on the
       * bid response apply.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.NativeResponse.Link link = 7;</code>
       */
      com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.LinkOrBuilder getLinkOrBuilder();

      public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.AssetOneofCase getAssetOneofCase();
    }
    /**
     * <pre>
     * OpenRTB Native 1.0: Corresponds to the Asset Object in the request.
     * The main container object for each asset requested or supported by Exchange
     * on behalf of the rendering client. Any object that is required is to be
     * flagged as such. Only one of the {title,img,video,data} objects should be
     * present in each object. All others should be null/absent. The id is to be
     * unique within the Asset array so that the response can be aligned.
     * </pre>
     *
     * Protobuf type {@code com.iabtechlab.openrtb.v2.NativeResponse.Asset}
     */
    public static final class Asset extends
        com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
          Asset> implements
        // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.NativeResponse.Asset)
        AssetOrBuilder {
    private static final long serialVersionUID = 0L;
      // Use Asset.newBuilder() to construct.
      private Asset(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset, ?> builder) {
        super(builder);
      }
      private Asset() {
      }

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

      @java.lang.Override
      public final com.google.protobuf.UnknownFieldSet
      getUnknownFields() {
        return this.unknownFields;
      }
      private Asset(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        this();
        if (extensionRegistry == null) {
          throw new java.lang.NullPointerException();
        }
        int mutable_bitField0_ = 0;
        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
            com.google.protobuf.UnknownFieldSet.newBuilder();
        try {
          boolean done = false;
          while (!done) {
            int tag = input.readTag();
            switch (tag) {
              case 0:
                done = true;
                break;
              case 8: {
                bitField0_ |= 0x00000001;
                id_ = input.readInt32();
                break;
              }
              case 16: {
                bitField0_ |= 0x00000002;
                required_ = input.readBool();
                break;
              }
              case 26: {
                com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title.Builder subBuilder = null;
                if (assetOneofCase_ == 3) {
                  subBuilder = ((com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title) assetOneof_).toBuilder();
                }
                assetOneof_ =
                    input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title.PARSER, extensionRegistry);
                if (subBuilder != null) {
                  subBuilder.mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title) assetOneof_);
                  assetOneof_ = subBuilder.buildPartial();
                }
                assetOneofCase_ = 3;
                break;
              }
              case 34: {
                com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image.Builder subBuilder = null;
                if (assetOneofCase_ == 4) {
                  subBuilder = ((com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image) assetOneof_).toBuilder();
                }
                assetOneof_ =
                    input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image.PARSER, extensionRegistry);
                if (subBuilder != null) {
                  subBuilder.mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image) assetOneof_);
                  assetOneof_ = subBuilder.buildPartial();
                }
                assetOneofCase_ = 4;
                break;
              }
              case 42: {
                com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video.Builder subBuilder = null;
                if (assetOneofCase_ == 5) {
                  subBuilder = ((com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video) assetOneof_).toBuilder();
                }
                assetOneof_ =
                    input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video.PARSER, extensionRegistry);
                if (subBuilder != null) {
                  subBuilder.mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video) assetOneof_);
                  assetOneof_ = subBuilder.buildPartial();
                }
                assetOneofCase_ = 5;
                break;
              }
              case 50: {
                com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data.Builder subBuilder = null;
                if (assetOneofCase_ == 6) {
                  subBuilder = ((com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data) assetOneof_).toBuilder();
                }
                assetOneof_ =
                    input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data.PARSER, extensionRegistry);
                if (subBuilder != null) {
                  subBuilder.mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data) assetOneof_);
                  assetOneof_ = subBuilder.buildPartial();
                }
                assetOneofCase_ = 6;
                break;
              }
              case 58: {
                com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link.Builder subBuilder = null;
                if (((bitField0_ & 0x00000040) != 0)) {
                  subBuilder = link_.toBuilder();
                }
                link_ = input.readMessage(com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link.PARSER, extensionRegistry);
                if (subBuilder != null) {
                  subBuilder.mergeFrom(link_);
                  link_ = subBuilder.buildPartial();
                }
                bitField0_ |= 0x00000040;
                break;
              }
              default: {
                if (!parseUnknownField(
                    input, unknownFields, extensionRegistry, tag)) {
                  done = true;
                }
                break;
              }
            }
          }
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          throw e.setUnfinishedMessage(this);
        } catch (java.io.IOException e) {
          throw new com.google.protobuf.InvalidProtocolBufferException(
              e).setUnfinishedMessage(this);
        } finally {
          this.unknownFields = unknownFields.build();
          makeExtensionsImmutable();
        }
      }
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.class, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Builder.class);
      }

      public interface TitleOrBuilder extends
          // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.NativeResponse.Asset.Title)
          com.google.protobuf.GeneratedMessageV3.
              ExtendableMessageOrBuilder<Title> {

        /**
         * <pre>
         * The text associated with the text element.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>required string text = 1;</code>
         * @return Whether the text field is set.
         */
        boolean hasText();
        /**
         * <pre>
         * The text associated with the text element.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>required string text = 1;</code>
         * @return The text.
         */
        java.lang.String getText();
        /**
         * <pre>
         * The text associated with the text element.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>required string text = 1;</code>
         * @return The bytes for text.
         */
        com.google.protobuf.ByteString
            getTextBytes();

        /**
         * <pre>
         * The length of the title being provided.
         * REQUIRED if using assetsurl/dcourl representation.
         * Implemented in 1.2
         * </pre>
         *
         * <code>optional int32 len = 2;</code>
         * @return Whether the len field is set.
         */
        boolean hasLen();
        /**
         * <pre>
         * The length of the title being provided.
         * REQUIRED if using assetsurl/dcourl representation.
         * Implemented in 1.2
         * </pre>
         *
         * <code>optional int32 len = 2;</code>
         * @return The len.
         */
        int getLen();
      }
      /**
       * <pre>
       * OpenRTB Native 1.0: Corresponds to the Title Object in the request,
       * with the value filled in.
       * If using assetsurl or dcourl response rather than embedded asset
       * response, it is recommended that three title objects be provided, the
       * length of each is less than or equal to the three recommended maximum
       * title lengths (25,90,140).
       * </pre>
       *
       * Protobuf type {@code com.iabtechlab.openrtb.v2.NativeResponse.Asset.Title}
       */
      public static final class Title extends
          com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
            Title> implements
          // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.NativeResponse.Asset.Title)
          TitleOrBuilder {
      private static final long serialVersionUID = 0L;
        // Use Title.newBuilder() to construct.
        private Title(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title, ?> builder) {
          super(builder);
        }
        private Title() {
          text_ = "";
        }

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

        @java.lang.Override
        public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
          return this.unknownFields;
        }
        private Title(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          this();
          if (extensionRegistry == null) {
            throw new java.lang.NullPointerException();
          }
          int mutable_bitField0_ = 0;
          com.google.protobuf.UnknownFieldSet.Builder unknownFields =
              com.google.protobuf.UnknownFieldSet.newBuilder();
          try {
            boolean done = false;
            while (!done) {
              int tag = input.readTag();
              switch (tag) {
                case 0:
                  done = true;
                  break;
                case 10: {
                  com.google.protobuf.ByteString bs = input.readBytes();
                  bitField0_ |= 0x00000001;
                  text_ = bs;
                  break;
                }
                case 16: {
                  bitField0_ |= 0x00000002;
                  len_ = input.readInt32();
                  break;
                }
                default: {
                  if (!parseUnknownField(
                      input, unknownFields, extensionRegistry, tag)) {
                    done = true;
                  }
                  break;
                }
              }
            }
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            throw e.setUnfinishedMessage(this);
          } catch (java.io.IOException e) {
            throw new com.google.protobuf.InvalidProtocolBufferException(
                e).setUnfinishedMessage(this);
          } finally {
            this.unknownFields = unknownFields.build();
            makeExtensionsImmutable();
          }
        }
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_Title_descriptor;
        }

        @java.lang.Override
        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_Title_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title.class, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title.Builder.class);
        }

        private int bitField0_;
        public static final int TEXT_FIELD_NUMBER = 1;
        private volatile java.lang.Object text_;
        /**
         * <pre>
         * The text associated with the text element.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>required string text = 1;</code>
         * @return Whether the text field is set.
         */
        @java.lang.Override
        public boolean hasText() {
          return ((bitField0_ & 0x00000001) != 0);
        }
        /**
         * <pre>
         * The text associated with the text element.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>required string text = 1;</code>
         * @return The text.
         */
        @java.lang.Override
        public java.lang.String getText() {
          java.lang.Object ref = text_;
          if (ref instanceof java.lang.String) {
            return (java.lang.String) ref;
          } else {
            com.google.protobuf.ByteString bs = 
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              text_ = s;
            }
            return s;
          }
        }
        /**
         * <pre>
         * The text associated with the text element.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>required string text = 1;</code>
         * @return The bytes for text.
         */
        @java.lang.Override
        public com.google.protobuf.ByteString
            getTextBytes() {
          java.lang.Object ref = text_;
          if (ref instanceof java.lang.String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            text_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }

        public static final int LEN_FIELD_NUMBER = 2;
        private int len_;
        /**
         * <pre>
         * The length of the title being provided.
         * REQUIRED if using assetsurl/dcourl representation.
         * Implemented in 1.2
         * </pre>
         *
         * <code>optional int32 len = 2;</code>
         * @return Whether the len field is set.
         */
        @java.lang.Override
        public boolean hasLen() {
          return ((bitField0_ & 0x00000002) != 0);
        }
        /**
         * <pre>
         * The length of the title being provided.
         * REQUIRED if using assetsurl/dcourl representation.
         * Implemented in 1.2
         * </pre>
         *
         * <code>optional int32 len = 2;</code>
         * @return The len.
         */
        @java.lang.Override
        public int getLen() {
          return len_;
        }

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

          if (!hasText()) {
            memoizedIsInitialized = 0;
            return false;
          }
          if (!extensionsAreInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
          memoizedIsInitialized = 1;
          return true;
        }

        @java.lang.Override
        public void writeTo(com.google.protobuf.CodedOutputStream output)
                            throws java.io.IOException {
          com.google.protobuf.GeneratedMessageV3
            .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title>.ExtensionWriter
              extensionWriter = newExtensionWriter();
          if (((bitField0_ & 0x00000001) != 0)) {
            com.google.protobuf.GeneratedMessageV3.writeString(output, 1, text_);
          }
          if (((bitField0_ & 0x00000002) != 0)) {
            output.writeInt32(2, len_);
          }
          extensionWriter.writeUntil(10000, output);
          unknownFields.writeTo(output);
        }

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

          size = 0;
          if (((bitField0_ & 0x00000001) != 0)) {
            size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, text_);
          }
          if (((bitField0_ & 0x00000002) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(2, len_);
          }
          size += extensionsSerializedSize();
          size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title)) {
            return super.equals(obj);
          }
          com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title other = (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title) obj;

          if (hasText() != other.hasText()) return false;
          if (hasText()) {
            if (!getText()
                .equals(other.getText())) return false;
          }
          if (hasLen() != other.hasLen()) return false;
          if (hasLen()) {
            if (getLen()
                != other.getLen()) return false;
          }
          if (!unknownFields.equals(other.unknownFields)) return false;
          if (!getExtensionFields().equals(other.getExtensionFields()))
            return false;
          return true;
        }

        @java.lang.Override
        public int hashCode() {
          if (memoizedHashCode != 0) {
            return memoizedHashCode;
          }
          int hash = 41;
          hash = (19 * hash) + getDescriptor().hashCode();
          if (hasText()) {
            hash = (37 * hash) + TEXT_FIELD_NUMBER;
            hash = (53 * hash) + getText().hashCode();
          }
          if (hasLen()) {
            hash = (37 * hash) + LEN_FIELD_NUMBER;
            hash = (53 * hash) + getLen();
          }
          hash = hashFields(hash, getExtensionFields());
          hash = (29 * hash) + unknownFields.hashCode();
          memoizedHashCode = hash;
          return hash;
        }

        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title parseFrom(
            java.nio.ByteBuffer data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title parseFrom(
            java.nio.ByteBuffer data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title parseFrom(
            com.google.protobuf.ByteString data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title parseFrom(
            com.google.protobuf.ByteString data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title parseFrom(byte[] data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title parseFrom(
            byte[] data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title parseFrom(java.io.InputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title 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.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title parseDelimitedFrom(java.io.InputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseDelimitedWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title 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.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title parseFrom(
            com.google.protobuf.CodedInputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title 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.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title 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>
         * OpenRTB Native 1.0: Corresponds to the Title Object in the request,
         * with the value filled in.
         * If using assetsurl or dcourl response rather than embedded asset
         * response, it is recommended that three title objects be provided, the
         * length of each is less than or equal to the three recommended maximum
         * title lengths (25,90,140).
         * </pre>
         *
         * Protobuf type {@code com.iabtechlab.openrtb.v2.NativeResponse.Asset.Title}
         */
        public static final class Builder extends
            com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
              com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title, Builder> implements
            // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.NativeResponse.Asset.Title)
            com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.TitleOrBuilder {
          public static final com.google.protobuf.Descriptors.Descriptor
              getDescriptor() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_Title_descriptor;
          }

          @java.lang.Override
          protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
              internalGetFieldAccessorTable() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_Title_fieldAccessorTable
                .ensureFieldAccessorsInitialized(
                    com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title.class, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title.Builder.class);
          }

          // Construct using com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title.newBuilder()
          private Builder() {
            maybeForceBuilderInitialization();
          }

          private Builder(
              com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
            super(parent);
            maybeForceBuilderInitialization();
          }
          private void maybeForceBuilderInitialization() {
            if (com.google.protobuf.GeneratedMessageV3
                    .alwaysUseFieldBuilders) {
            }
          }
          @java.lang.Override
          public Builder clear() {
            super.clear();
            text_ = "";
            bitField0_ = (bitField0_ & ~0x00000001);
            len_ = 0;
            bitField0_ = (bitField0_ & ~0x00000002);
            return this;
          }

          @java.lang.Override
          public com.google.protobuf.Descriptors.Descriptor
              getDescriptorForType() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_Title_descriptor;
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title getDefaultInstanceForType() {
            return com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title.getDefaultInstance();
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title build() {
            com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title result = buildPartial();
            if (!result.isInitialized()) {
              throw newUninitializedMessageException(result);
            }
            return result;
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title buildPartial() {
            com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title result = new com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title(this);
            int from_bitField0_ = bitField0_;
            int to_bitField0_ = 0;
            if (((from_bitField0_ & 0x00000001) != 0)) {
              to_bitField0_ |= 0x00000001;
            }
            result.text_ = text_;
            if (((from_bitField0_ & 0x00000002) != 0)) {
              result.len_ = len_;
              to_bitField0_ |= 0x00000002;
            }
            result.bitField0_ = to_bitField0_;
            onBuilt();
            return result;
          }

          @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 <Type> Builder setExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title, Type> extension,
              Type value) {
            return super.setExtension(extension, value);
          }
          @java.lang.Override
          public <Type> Builder setExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title, java.util.List<Type>> extension,
              int index, Type value) {
            return super.setExtension(extension, index, value);
          }
          @java.lang.Override
          public <Type> Builder addExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title, java.util.List<Type>> extension,
              Type value) {
            return super.addExtension(extension, value);
          }
          @java.lang.Override
          public <Type> Builder clearExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title, ?> extension) {
            return super.clearExtension(extension);
          }
          @java.lang.Override
          public Builder mergeFrom(com.google.protobuf.Message other) {
            if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title) {
              return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title)other);
            } else {
              super.mergeFrom(other);
              return this;
            }
          }

          public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title other) {
            if (other == com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title.getDefaultInstance()) return this;
            if (other.hasText()) {
              bitField0_ |= 0x00000001;
              text_ = other.text_;
              onChanged();
            }
            if (other.hasLen()) {
              setLen(other.getLen());
            }
            this.mergeExtensionFields(other);
            this.mergeUnknownFields(other.unknownFields);
            onChanged();
            return this;
          }

          @java.lang.Override
          public final boolean isInitialized() {
            if (!hasText()) {
              return false;
            }
            if (!extensionsAreInitialized()) {
              return false;
            }
            return true;
          }

          @java.lang.Override
          public Builder mergeFrom(
              com.google.protobuf.CodedInputStream input,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title parsedMessage = null;
            try {
              parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
              parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title) e.getUnfinishedMessage();
              throw e.unwrapIOException();
            } finally {
              if (parsedMessage != null) {
                mergeFrom(parsedMessage);
              }
            }
            return this;
          }
          private int bitField0_;

          private java.lang.Object text_ = "";
          /**
           * <pre>
           * The text associated with the text element.
           * REQUIRED by the OpenRTB Native specification.
           * </pre>
           *
           * <code>required string text = 1;</code>
           * @return Whether the text field is set.
           */
          public boolean hasText() {
            return ((bitField0_ & 0x00000001) != 0);
          }
          /**
           * <pre>
           * The text associated with the text element.
           * REQUIRED by the OpenRTB Native specification.
           * </pre>
           *
           * <code>required string text = 1;</code>
           * @return The text.
           */
          public java.lang.String getText() {
            java.lang.Object ref = text_;
            if (!(ref instanceof java.lang.String)) {
              com.google.protobuf.ByteString bs =
                  (com.google.protobuf.ByteString) ref;
              java.lang.String s = bs.toStringUtf8();
              if (bs.isValidUtf8()) {
                text_ = s;
              }
              return s;
            } else {
              return (java.lang.String) ref;
            }
          }
          /**
           * <pre>
           * The text associated with the text element.
           * REQUIRED by the OpenRTB Native specification.
           * </pre>
           *
           * <code>required string text = 1;</code>
           * @return The bytes for text.
           */
          public com.google.protobuf.ByteString
              getTextBytes() {
            java.lang.Object ref = text_;
            if (ref instanceof String) {
              com.google.protobuf.ByteString b = 
                  com.google.protobuf.ByteString.copyFromUtf8(
                      (java.lang.String) ref);
              text_ = b;
              return b;
            } else {
              return (com.google.protobuf.ByteString) ref;
            }
          }
          /**
           * <pre>
           * The text associated with the text element.
           * REQUIRED by the OpenRTB Native specification.
           * </pre>
           *
           * <code>required string text = 1;</code>
           * @param value The text to set.
           * @return This builder for chaining.
           */
          public Builder setText(
              java.lang.String value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
            text_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * The text associated with the text element.
           * REQUIRED by the OpenRTB Native specification.
           * </pre>
           *
           * <code>required string text = 1;</code>
           * @return This builder for chaining.
           */
          public Builder clearText() {
            bitField0_ = (bitField0_ & ~0x00000001);
            text_ = getDefaultInstance().getText();
            onChanged();
            return this;
          }
          /**
           * <pre>
           * The text associated with the text element.
           * REQUIRED by the OpenRTB Native specification.
           * </pre>
           *
           * <code>required string text = 1;</code>
           * @param value The bytes for text to set.
           * @return This builder for chaining.
           */
          public Builder setTextBytes(
              com.google.protobuf.ByteString value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
            text_ = value;
            onChanged();
            return this;
          }

          private int len_ ;
          /**
           * <pre>
           * The length of the title being provided.
           * REQUIRED if using assetsurl/dcourl representation.
           * Implemented in 1.2
           * </pre>
           *
           * <code>optional int32 len = 2;</code>
           * @return Whether the len field is set.
           */
          @java.lang.Override
          public boolean hasLen() {
            return ((bitField0_ & 0x00000002) != 0);
          }
          /**
           * <pre>
           * The length of the title being provided.
           * REQUIRED if using assetsurl/dcourl representation.
           * Implemented in 1.2
           * </pre>
           *
           * <code>optional int32 len = 2;</code>
           * @return The len.
           */
          @java.lang.Override
          public int getLen() {
            return len_;
          }
          /**
           * <pre>
           * The length of the title being provided.
           * REQUIRED if using assetsurl/dcourl representation.
           * Implemented in 1.2
           * </pre>
           *
           * <code>optional int32 len = 2;</code>
           * @param value The len to set.
           * @return This builder for chaining.
           */
          public Builder setLen(int value) {
            bitField0_ |= 0x00000002;
            len_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * The length of the title being provided.
           * REQUIRED if using assetsurl/dcourl representation.
           * Implemented in 1.2
           * </pre>
           *
           * <code>optional int32 len = 2;</code>
           * @return This builder for chaining.
           */
          public Builder clearLen() {
            bitField0_ = (bitField0_ & ~0x00000002);
            len_ = 0;
            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:com.iabtechlab.openrtb.v2.NativeResponse.Asset.Title)
        }

        // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.NativeResponse.Asset.Title)
        private static final com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title DEFAULT_INSTANCE;
        static {
          DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title();
        }

        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title getDefaultInstance() {
          return DEFAULT_INSTANCE;
        }

        @java.lang.Deprecated public static final com.google.protobuf.Parser<Title>
            PARSER = new com.google.protobuf.AbstractParser<Title>() {
          @java.lang.Override
          public Title parsePartialFrom(
              com.google.protobuf.CodedInputStream input,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.protobuf.InvalidProtocolBufferException {
            return new Title(input, extensionRegistry);
          }
        };

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

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

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title getDefaultInstanceForType() {
          return DEFAULT_INSTANCE;
        }

      }

      public interface ImageOrBuilder extends
          // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.NativeResponse.Asset.Image)
          com.google.protobuf.GeneratedMessageV3.
              ExtendableMessageOrBuilder<Image> {

        /**
         * <pre>
         * The type of image element being submitted from the ImageType enum.
         * Refer to enum com.iabtechlab.adcom.v1.NativeImageAssetType for generic values.
         * REQUIRED for assetsurl or dcourl responses,
         * not required to embedded asset responses.
         * Implemented in 1.2
         * </pre>
         *
         * <code>optional int32 type = 4;</code>
         * @return Whether the type field is set.
         */
        boolean hasType();
        /**
         * <pre>
         * The type of image element being submitted from the ImageType enum.
         * Refer to enum com.iabtechlab.adcom.v1.NativeImageAssetType for generic values.
         * REQUIRED for assetsurl or dcourl responses,
         * not required to embedded asset responses.
         * Implemented in 1.2
         * </pre>
         *
         * <code>optional int32 type = 4;</code>
         * @return The type.
         */
        int getType();

        /**
         * <pre>
         * URL of the image asset.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>required string url = 1;</code>
         * @return Whether the url field is set.
         */
        boolean hasUrl();
        /**
         * <pre>
         * URL of the image asset.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>required string url = 1;</code>
         * @return The url.
         */
        java.lang.String getUrl();
        /**
         * <pre>
         * URL of the image asset.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>required string url = 1;</code>
         * @return The bytes for url.
         */
        com.google.protobuf.ByteString
            getUrlBytes();

        /**
         * <pre>
         * Width of the image in pixels.
         * RECOMMENDED in 1.0, 1.1, or in 1.2 for embedded asset responses.
         * REQUIRED in 1.2 for assetsurl or dcourl if multiple assets
         * of the same type submitted.
         * </pre>
         *
         * <code>optional int32 w = 2;</code>
         * @return Whether the w field is set.
         */
        boolean hasW();
        /**
         * <pre>
         * Width of the image in pixels.
         * RECOMMENDED in 1.0, 1.1, or in 1.2 for embedded asset responses.
         * REQUIRED in 1.2 for assetsurl or dcourl if multiple assets
         * of the same type submitted.
         * </pre>
         *
         * <code>optional int32 w = 2;</code>
         * @return The w.
         */
        int getW();

        /**
         * <pre>
         * Height of the image in pixels.
         * RECOMMENDED in 1.0, 1.1, or in 1.2 for embedded asset responses.
         * REQUIRED in 1.2 for assetsurl or dcourl if multiple assets
         * of the same type submitted.
         * </pre>
         *
         * <code>optional int32 h = 3;</code>
         * @return Whether the h field is set.
         */
        boolean hasH();
        /**
         * <pre>
         * Height of the image in pixels.
         * RECOMMENDED in 1.0, 1.1, or in 1.2 for embedded asset responses.
         * REQUIRED in 1.2 for assetsurl or dcourl if multiple assets
         * of the same type submitted.
         * </pre>
         *
         * <code>optional int32 h = 3;</code>
         * @return The h.
         */
        int getH();
      }
      /**
       * <pre>
       * OpenRTB Native 1.0: Corresponds to the Image Object in the request.
       * The Image object to be used for all image elements of the Native ad
       * such as Icons, Main Image, etc.
       * It is recommended that if assetsurl/dcourl is being used rather than
       * embbedded assets, that an image of each recommended aspect ratio
       * (per ImageType enum) be provided for image type 3 (MAIN_IMAGE).
       * </pre>
       *
       * Protobuf type {@code com.iabtechlab.openrtb.v2.NativeResponse.Asset.Image}
       */
      public static final class Image extends
          com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
            Image> implements
          // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.NativeResponse.Asset.Image)
          ImageOrBuilder {
      private static final long serialVersionUID = 0L;
        // Use Image.newBuilder() to construct.
        private Image(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image, ?> builder) {
          super(builder);
        }
        private Image() {
          url_ = "";
        }

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

        @java.lang.Override
        public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
          return this.unknownFields;
        }
        private Image(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          this();
          if (extensionRegistry == null) {
            throw new java.lang.NullPointerException();
          }
          int mutable_bitField0_ = 0;
          com.google.protobuf.UnknownFieldSet.Builder unknownFields =
              com.google.protobuf.UnknownFieldSet.newBuilder();
          try {
            boolean done = false;
            while (!done) {
              int tag = input.readTag();
              switch (tag) {
                case 0:
                  done = true;
                  break;
                case 10: {
                  com.google.protobuf.ByteString bs = input.readBytes();
                  bitField0_ |= 0x00000002;
                  url_ = bs;
                  break;
                }
                case 16: {
                  bitField0_ |= 0x00000004;
                  w_ = input.readInt32();
                  break;
                }
                case 24: {
                  bitField0_ |= 0x00000008;
                  h_ = input.readInt32();
                  break;
                }
                case 32: {
                  bitField0_ |= 0x00000001;
                  type_ = input.readInt32();
                  break;
                }
                default: {
                  if (!parseUnknownField(
                      input, unknownFields, extensionRegistry, tag)) {
                    done = true;
                  }
                  break;
                }
              }
            }
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            throw e.setUnfinishedMessage(this);
          } catch (java.io.IOException e) {
            throw new com.google.protobuf.InvalidProtocolBufferException(
                e).setUnfinishedMessage(this);
          } finally {
            this.unknownFields = unknownFields.build();
            makeExtensionsImmutable();
          }
        }
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_Image_descriptor;
        }

        @java.lang.Override
        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_Image_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image.class, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image.Builder.class);
        }

        private int bitField0_;
        public static final int TYPE_FIELD_NUMBER = 4;
        private int type_;
        /**
         * <pre>
         * The type of image element being submitted from the ImageType enum.
         * Refer to enum com.iabtechlab.adcom.v1.NativeImageAssetType for generic values.
         * REQUIRED for assetsurl or dcourl responses,
         * not required to embedded asset responses.
         * Implemented in 1.2
         * </pre>
         *
         * <code>optional int32 type = 4;</code>
         * @return Whether the type field is set.
         */
        @java.lang.Override
        public boolean hasType() {
          return ((bitField0_ & 0x00000001) != 0);
        }
        /**
         * <pre>
         * The type of image element being submitted from the ImageType enum.
         * Refer to enum com.iabtechlab.adcom.v1.NativeImageAssetType for generic values.
         * REQUIRED for assetsurl or dcourl responses,
         * not required to embedded asset responses.
         * Implemented in 1.2
         * </pre>
         *
         * <code>optional int32 type = 4;</code>
         * @return The type.
         */
        @java.lang.Override
        public int getType() {
          return type_;
        }

        public static final int URL_FIELD_NUMBER = 1;
        private volatile java.lang.Object url_;
        /**
         * <pre>
         * URL of the image asset.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>required string url = 1;</code>
         * @return Whether the url field is set.
         */
        @java.lang.Override
        public boolean hasUrl() {
          return ((bitField0_ & 0x00000002) != 0);
        }
        /**
         * <pre>
         * URL of the image asset.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>required string url = 1;</code>
         * @return The url.
         */
        @java.lang.Override
        public java.lang.String getUrl() {
          java.lang.Object ref = url_;
          if (ref instanceof java.lang.String) {
            return (java.lang.String) ref;
          } else {
            com.google.protobuf.ByteString bs = 
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              url_ = s;
            }
            return s;
          }
        }
        /**
         * <pre>
         * URL of the image asset.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>required string url = 1;</code>
         * @return The bytes for url.
         */
        @java.lang.Override
        public com.google.protobuf.ByteString
            getUrlBytes() {
          java.lang.Object ref = url_;
          if (ref instanceof java.lang.String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            url_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }

        public static final int W_FIELD_NUMBER = 2;
        private int w_;
        /**
         * <pre>
         * Width of the image in pixels.
         * RECOMMENDED in 1.0, 1.1, or in 1.2 for embedded asset responses.
         * REQUIRED in 1.2 for assetsurl or dcourl if multiple assets
         * of the same type submitted.
         * </pre>
         *
         * <code>optional int32 w = 2;</code>
         * @return Whether the w field is set.
         */
        @java.lang.Override
        public boolean hasW() {
          return ((bitField0_ & 0x00000004) != 0);
        }
        /**
         * <pre>
         * Width of the image in pixels.
         * RECOMMENDED in 1.0, 1.1, or in 1.2 for embedded asset responses.
         * REQUIRED in 1.2 for assetsurl or dcourl if multiple assets
         * of the same type submitted.
         * </pre>
         *
         * <code>optional int32 w = 2;</code>
         * @return The w.
         */
        @java.lang.Override
        public int getW() {
          return w_;
        }

        public static final int H_FIELD_NUMBER = 3;
        private int h_;
        /**
         * <pre>
         * Height of the image in pixels.
         * RECOMMENDED in 1.0, 1.1, or in 1.2 for embedded asset responses.
         * REQUIRED in 1.2 for assetsurl or dcourl if multiple assets
         * of the same type submitted.
         * </pre>
         *
         * <code>optional int32 h = 3;</code>
         * @return Whether the h field is set.
         */
        @java.lang.Override
        public boolean hasH() {
          return ((bitField0_ & 0x00000008) != 0);
        }
        /**
         * <pre>
         * Height of the image in pixels.
         * RECOMMENDED in 1.0, 1.1, or in 1.2 for embedded asset responses.
         * REQUIRED in 1.2 for assetsurl or dcourl if multiple assets
         * of the same type submitted.
         * </pre>
         *
         * <code>optional int32 h = 3;</code>
         * @return The h.
         */
        @java.lang.Override
        public int getH() {
          return h_;
        }

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

          if (!hasUrl()) {
            memoizedIsInitialized = 0;
            return false;
          }
          if (!extensionsAreInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
          memoizedIsInitialized = 1;
          return true;
        }

        @java.lang.Override
        public void writeTo(com.google.protobuf.CodedOutputStream output)
                            throws java.io.IOException {
          com.google.protobuf.GeneratedMessageV3
            .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image>.ExtensionWriter
              extensionWriter = newExtensionWriter();
          if (((bitField0_ & 0x00000002) != 0)) {
            com.google.protobuf.GeneratedMessageV3.writeString(output, 1, url_);
          }
          if (((bitField0_ & 0x00000004) != 0)) {
            output.writeInt32(2, w_);
          }
          if (((bitField0_ & 0x00000008) != 0)) {
            output.writeInt32(3, h_);
          }
          if (((bitField0_ & 0x00000001) != 0)) {
            output.writeInt32(4, type_);
          }
          extensionWriter.writeUntil(10000, output);
          unknownFields.writeTo(output);
        }

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

          size = 0;
          if (((bitField0_ & 0x00000002) != 0)) {
            size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, url_);
          }
          if (((bitField0_ & 0x00000004) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(2, w_);
          }
          if (((bitField0_ & 0x00000008) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(3, h_);
          }
          if (((bitField0_ & 0x00000001) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(4, type_);
          }
          size += extensionsSerializedSize();
          size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image)) {
            return super.equals(obj);
          }
          com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image other = (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image) obj;

          if (hasType() != other.hasType()) return false;
          if (hasType()) {
            if (getType()
                != other.getType()) return false;
          }
          if (hasUrl() != other.hasUrl()) return false;
          if (hasUrl()) {
            if (!getUrl()
                .equals(other.getUrl())) return false;
          }
          if (hasW() != other.hasW()) return false;
          if (hasW()) {
            if (getW()
                != other.getW()) return false;
          }
          if (hasH() != other.hasH()) return false;
          if (hasH()) {
            if (getH()
                != other.getH()) return false;
          }
          if (!unknownFields.equals(other.unknownFields)) return false;
          if (!getExtensionFields().equals(other.getExtensionFields()))
            return false;
          return true;
        }

        @java.lang.Override
        public int hashCode() {
          if (memoizedHashCode != 0) {
            return memoizedHashCode;
          }
          int hash = 41;
          hash = (19 * hash) + getDescriptor().hashCode();
          if (hasType()) {
            hash = (37 * hash) + TYPE_FIELD_NUMBER;
            hash = (53 * hash) + getType();
          }
          if (hasUrl()) {
            hash = (37 * hash) + URL_FIELD_NUMBER;
            hash = (53 * hash) + getUrl().hashCode();
          }
          if (hasW()) {
            hash = (37 * hash) + W_FIELD_NUMBER;
            hash = (53 * hash) + getW();
          }
          if (hasH()) {
            hash = (37 * hash) + H_FIELD_NUMBER;
            hash = (53 * hash) + getH();
          }
          hash = hashFields(hash, getExtensionFields());
          hash = (29 * hash) + unknownFields.hashCode();
          memoizedHashCode = hash;
          return hash;
        }

        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image parseFrom(
            java.nio.ByteBuffer data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image parseFrom(
            java.nio.ByteBuffer data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image parseFrom(
            com.google.protobuf.ByteString data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image parseFrom(
            com.google.protobuf.ByteString data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image parseFrom(byte[] data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image parseFrom(
            byte[] data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image parseFrom(java.io.InputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image 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.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image parseDelimitedFrom(java.io.InputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseDelimitedWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image 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.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image parseFrom(
            com.google.protobuf.CodedInputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image 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.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image 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>
         * OpenRTB Native 1.0: Corresponds to the Image Object in the request.
         * The Image object to be used for all image elements of the Native ad
         * such as Icons, Main Image, etc.
         * It is recommended that if assetsurl/dcourl is being used rather than
         * embbedded assets, that an image of each recommended aspect ratio
         * (per ImageType enum) be provided for image type 3 (MAIN_IMAGE).
         * </pre>
         *
         * Protobuf type {@code com.iabtechlab.openrtb.v2.NativeResponse.Asset.Image}
         */
        public static final class Builder extends
            com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
              com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image, Builder> implements
            // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.NativeResponse.Asset.Image)
            com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.ImageOrBuilder {
          public static final com.google.protobuf.Descriptors.Descriptor
              getDescriptor() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_Image_descriptor;
          }

          @java.lang.Override
          protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
              internalGetFieldAccessorTable() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_Image_fieldAccessorTable
                .ensureFieldAccessorsInitialized(
                    com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image.class, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image.Builder.class);
          }

          // Construct using com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image.newBuilder()
          private Builder() {
            maybeForceBuilderInitialization();
          }

          private Builder(
              com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
            super(parent);
            maybeForceBuilderInitialization();
          }
          private void maybeForceBuilderInitialization() {
            if (com.google.protobuf.GeneratedMessageV3
                    .alwaysUseFieldBuilders) {
            }
          }
          @java.lang.Override
          public Builder clear() {
            super.clear();
            type_ = 0;
            bitField0_ = (bitField0_ & ~0x00000001);
            url_ = "";
            bitField0_ = (bitField0_ & ~0x00000002);
            w_ = 0;
            bitField0_ = (bitField0_ & ~0x00000004);
            h_ = 0;
            bitField0_ = (bitField0_ & ~0x00000008);
            return this;
          }

          @java.lang.Override
          public com.google.protobuf.Descriptors.Descriptor
              getDescriptorForType() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_Image_descriptor;
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image getDefaultInstanceForType() {
            return com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image.getDefaultInstance();
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image build() {
            com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image result = buildPartial();
            if (!result.isInitialized()) {
              throw newUninitializedMessageException(result);
            }
            return result;
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image buildPartial() {
            com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image result = new com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image(this);
            int from_bitField0_ = bitField0_;
            int to_bitField0_ = 0;
            if (((from_bitField0_ & 0x00000001) != 0)) {
              result.type_ = type_;
              to_bitField0_ |= 0x00000001;
            }
            if (((from_bitField0_ & 0x00000002) != 0)) {
              to_bitField0_ |= 0x00000002;
            }
            result.url_ = url_;
            if (((from_bitField0_ & 0x00000004) != 0)) {
              result.w_ = w_;
              to_bitField0_ |= 0x00000004;
            }
            if (((from_bitField0_ & 0x00000008) != 0)) {
              result.h_ = h_;
              to_bitField0_ |= 0x00000008;
            }
            result.bitField0_ = to_bitField0_;
            onBuilt();
            return result;
          }

          @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 <Type> Builder setExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image, Type> extension,
              Type value) {
            return super.setExtension(extension, value);
          }
          @java.lang.Override
          public <Type> Builder setExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image, java.util.List<Type>> extension,
              int index, Type value) {
            return super.setExtension(extension, index, value);
          }
          @java.lang.Override
          public <Type> Builder addExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image, java.util.List<Type>> extension,
              Type value) {
            return super.addExtension(extension, value);
          }
          @java.lang.Override
          public <Type> Builder clearExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image, ?> extension) {
            return super.clearExtension(extension);
          }
          @java.lang.Override
          public Builder mergeFrom(com.google.protobuf.Message other) {
            if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image) {
              return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image)other);
            } else {
              super.mergeFrom(other);
              return this;
            }
          }

          public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image other) {
            if (other == com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image.getDefaultInstance()) return this;
            if (other.hasType()) {
              setType(other.getType());
            }
            if (other.hasUrl()) {
              bitField0_ |= 0x00000002;
              url_ = other.url_;
              onChanged();
            }
            if (other.hasW()) {
              setW(other.getW());
            }
            if (other.hasH()) {
              setH(other.getH());
            }
            this.mergeExtensionFields(other);
            this.mergeUnknownFields(other.unknownFields);
            onChanged();
            return this;
          }

          @java.lang.Override
          public final boolean isInitialized() {
            if (!hasUrl()) {
              return false;
            }
            if (!extensionsAreInitialized()) {
              return false;
            }
            return true;
          }

          @java.lang.Override
          public Builder mergeFrom(
              com.google.protobuf.CodedInputStream input,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image parsedMessage = null;
            try {
              parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
              parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image) e.getUnfinishedMessage();
              throw e.unwrapIOException();
            } finally {
              if (parsedMessage != null) {
                mergeFrom(parsedMessage);
              }
            }
            return this;
          }
          private int bitField0_;

          private int type_ ;
          /**
           * <pre>
           * The type of image element being submitted from the ImageType enum.
           * Refer to enum com.iabtechlab.adcom.v1.NativeImageAssetType for generic values.
           * REQUIRED for assetsurl or dcourl responses,
           * not required to embedded asset responses.
           * Implemented in 1.2
           * </pre>
           *
           * <code>optional int32 type = 4;</code>
           * @return Whether the type field is set.
           */
          @java.lang.Override
          public boolean hasType() {
            return ((bitField0_ & 0x00000001) != 0);
          }
          /**
           * <pre>
           * The type of image element being submitted from the ImageType enum.
           * Refer to enum com.iabtechlab.adcom.v1.NativeImageAssetType for generic values.
           * REQUIRED for assetsurl or dcourl responses,
           * not required to embedded asset responses.
           * Implemented in 1.2
           * </pre>
           *
           * <code>optional int32 type = 4;</code>
           * @return The type.
           */
          @java.lang.Override
          public int getType() {
            return type_;
          }
          /**
           * <pre>
           * The type of image element being submitted from the ImageType enum.
           * Refer to enum com.iabtechlab.adcom.v1.NativeImageAssetType for generic values.
           * REQUIRED for assetsurl or dcourl responses,
           * not required to embedded asset responses.
           * Implemented in 1.2
           * </pre>
           *
           * <code>optional int32 type = 4;</code>
           * @param value The type to set.
           * @return This builder for chaining.
           */
          public Builder setType(int value) {
            bitField0_ |= 0x00000001;
            type_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * The type of image element being submitted from the ImageType enum.
           * Refer to enum com.iabtechlab.adcom.v1.NativeImageAssetType for generic values.
           * REQUIRED for assetsurl or dcourl responses,
           * not required to embedded asset responses.
           * Implemented in 1.2
           * </pre>
           *
           * <code>optional int32 type = 4;</code>
           * @return This builder for chaining.
           */
          public Builder clearType() {
            bitField0_ = (bitField0_ & ~0x00000001);
            type_ = 0;
            onChanged();
            return this;
          }

          private java.lang.Object url_ = "";
          /**
           * <pre>
           * URL of the image asset.
           * REQUIRED by the OpenRTB Native specification.
           * </pre>
           *
           * <code>required string url = 1;</code>
           * @return Whether the url field is set.
           */
          public boolean hasUrl() {
            return ((bitField0_ & 0x00000002) != 0);
          }
          /**
           * <pre>
           * URL of the image asset.
           * REQUIRED by the OpenRTB Native specification.
           * </pre>
           *
           * <code>required string url = 1;</code>
           * @return The url.
           */
          public java.lang.String getUrl() {
            java.lang.Object ref = url_;
            if (!(ref instanceof java.lang.String)) {
              com.google.protobuf.ByteString bs =
                  (com.google.protobuf.ByteString) ref;
              java.lang.String s = bs.toStringUtf8();
              if (bs.isValidUtf8()) {
                url_ = s;
              }
              return s;
            } else {
              return (java.lang.String) ref;
            }
          }
          /**
           * <pre>
           * URL of the image asset.
           * REQUIRED by the OpenRTB Native specification.
           * </pre>
           *
           * <code>required string url = 1;</code>
           * @return The bytes for url.
           */
          public com.google.protobuf.ByteString
              getUrlBytes() {
            java.lang.Object ref = url_;
            if (ref instanceof String) {
              com.google.protobuf.ByteString b = 
                  com.google.protobuf.ByteString.copyFromUtf8(
                      (java.lang.String) ref);
              url_ = b;
              return b;
            } else {
              return (com.google.protobuf.ByteString) ref;
            }
          }
          /**
           * <pre>
           * URL of the image asset.
           * REQUIRED by the OpenRTB Native specification.
           * </pre>
           *
           * <code>required string url = 1;</code>
           * @param value The url to set.
           * @return This builder for chaining.
           */
          public Builder setUrl(
              java.lang.String value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
            url_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * URL of the image asset.
           * REQUIRED by the OpenRTB Native specification.
           * </pre>
           *
           * <code>required string url = 1;</code>
           * @return This builder for chaining.
           */
          public Builder clearUrl() {
            bitField0_ = (bitField0_ & ~0x00000002);
            url_ = getDefaultInstance().getUrl();
            onChanged();
            return this;
          }
          /**
           * <pre>
           * URL of the image asset.
           * REQUIRED by the OpenRTB Native specification.
           * </pre>
           *
           * <code>required string url = 1;</code>
           * @param value The bytes for url to set.
           * @return This builder for chaining.
           */
          public Builder setUrlBytes(
              com.google.protobuf.ByteString value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000002;
            url_ = value;
            onChanged();
            return this;
          }

          private int w_ ;
          /**
           * <pre>
           * Width of the image in pixels.
           * RECOMMENDED in 1.0, 1.1, or in 1.2 for embedded asset responses.
           * REQUIRED in 1.2 for assetsurl or dcourl if multiple assets
           * of the same type submitted.
           * </pre>
           *
           * <code>optional int32 w = 2;</code>
           * @return Whether the w field is set.
           */
          @java.lang.Override
          public boolean hasW() {
            return ((bitField0_ & 0x00000004) != 0);
          }
          /**
           * <pre>
           * Width of the image in pixels.
           * RECOMMENDED in 1.0, 1.1, or in 1.2 for embedded asset responses.
           * REQUIRED in 1.2 for assetsurl or dcourl if multiple assets
           * of the same type submitted.
           * </pre>
           *
           * <code>optional int32 w = 2;</code>
           * @return The w.
           */
          @java.lang.Override
          public int getW() {
            return w_;
          }
          /**
           * <pre>
           * Width of the image in pixels.
           * RECOMMENDED in 1.0, 1.1, or in 1.2 for embedded asset responses.
           * REQUIRED in 1.2 for assetsurl or dcourl if multiple assets
           * of the same type submitted.
           * </pre>
           *
           * <code>optional int32 w = 2;</code>
           * @param value The w to set.
           * @return This builder for chaining.
           */
          public Builder setW(int value) {
            bitField0_ |= 0x00000004;
            w_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Width of the image in pixels.
           * RECOMMENDED in 1.0, 1.1, or in 1.2 for embedded asset responses.
           * REQUIRED in 1.2 for assetsurl or dcourl if multiple assets
           * of the same type submitted.
           * </pre>
           *
           * <code>optional int32 w = 2;</code>
           * @return This builder for chaining.
           */
          public Builder clearW() {
            bitField0_ = (bitField0_ & ~0x00000004);
            w_ = 0;
            onChanged();
            return this;
          }

          private int h_ ;
          /**
           * <pre>
           * Height of the image in pixels.
           * RECOMMENDED in 1.0, 1.1, or in 1.2 for embedded asset responses.
           * REQUIRED in 1.2 for assetsurl or dcourl if multiple assets
           * of the same type submitted.
           * </pre>
           *
           * <code>optional int32 h = 3;</code>
           * @return Whether the h field is set.
           */
          @java.lang.Override
          public boolean hasH() {
            return ((bitField0_ & 0x00000008) != 0);
          }
          /**
           * <pre>
           * Height of the image in pixels.
           * RECOMMENDED in 1.0, 1.1, or in 1.2 for embedded asset responses.
           * REQUIRED in 1.2 for assetsurl or dcourl if multiple assets
           * of the same type submitted.
           * </pre>
           *
           * <code>optional int32 h = 3;</code>
           * @return The h.
           */
          @java.lang.Override
          public int getH() {
            return h_;
          }
          /**
           * <pre>
           * Height of the image in pixels.
           * RECOMMENDED in 1.0, 1.1, or in 1.2 for embedded asset responses.
           * REQUIRED in 1.2 for assetsurl or dcourl if multiple assets
           * of the same type submitted.
           * </pre>
           *
           * <code>optional int32 h = 3;</code>
           * @param value The h to set.
           * @return This builder for chaining.
           */
          public Builder setH(int value) {
            bitField0_ |= 0x00000008;
            h_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * Height of the image in pixels.
           * RECOMMENDED in 1.0, 1.1, or in 1.2 for embedded asset responses.
           * REQUIRED in 1.2 for assetsurl or dcourl if multiple assets
           * of the same type submitted.
           * </pre>
           *
           * <code>optional int32 h = 3;</code>
           * @return This builder for chaining.
           */
          public Builder clearH() {
            bitField0_ = (bitField0_ & ~0x00000008);
            h_ = 0;
            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:com.iabtechlab.openrtb.v2.NativeResponse.Asset.Image)
        }

        // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.NativeResponse.Asset.Image)
        private static final com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image DEFAULT_INSTANCE;
        static {
          DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image();
        }

        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image getDefaultInstance() {
          return DEFAULT_INSTANCE;
        }

        @java.lang.Deprecated public static final com.google.protobuf.Parser<Image>
            PARSER = new com.google.protobuf.AbstractParser<Image>() {
          @java.lang.Override
          public Image parsePartialFrom(
              com.google.protobuf.CodedInputStream input,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.protobuf.InvalidProtocolBufferException {
            return new Image(input, extensionRegistry);
          }
        };

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

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

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image getDefaultInstanceForType() {
          return DEFAULT_INSTANCE;
        }

      }

      public interface DataOrBuilder extends
          // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.NativeResponse.Asset.Data)
          com.google.protobuf.GeneratedMessageV3.
              ExtendableMessageOrBuilder<Data> {

        /**
         * <pre>
         * The type of data element being submitted from the com.iabtechlab.adcom.v1.NativeDataAssetType enum.
         * Refer to enum com.iabtechlab.adcom.v1.NativeDataAssetType for generic values.
         * REQUIRED in 1.2 for assetsurl or dcourl responses.
         * Implemented in 1.2.
         * </pre>
         *
         * <code>optional int32 type = 3;</code>
         * @return Whether the type field is set.
         */
        boolean hasType();
        /**
         * <pre>
         * The type of data element being submitted from the com.iabtechlab.adcom.v1.NativeDataAssetType enum.
         * Refer to enum com.iabtechlab.adcom.v1.NativeDataAssetType for generic values.
         * REQUIRED in 1.2 for assetsurl or dcourl responses.
         * Implemented in 1.2.
         * </pre>
         *
         * <code>optional int32 type = 3;</code>
         * @return The type.
         */
        int getType();

        /**
         * <pre>
         * The length of the data element being submitted. Where applicable, must
         * comply with the recommended maximum lengths in the com.iabtechlab.adcom.v1.NativeDataAssetType enum.
         * REQUIRED in 1.2 for assetsurl or dcourl responses.
         * Implemented in 1.2.
         * </pre>
         *
         * <code>optional int32 len = 4;</code>
         * @return Whether the len field is set.
         */
        boolean hasLen();
        /**
         * <pre>
         * The length of the data element being submitted. Where applicable, must
         * comply with the recommended maximum lengths in the com.iabtechlab.adcom.v1.NativeDataAssetType enum.
         * REQUIRED in 1.2 for assetsurl or dcourl responses.
         * Implemented in 1.2.
         * </pre>
         *
         * <code>optional int32 len = 4;</code>
         * @return The len.
         */
        int getLen();

        /**
         * <pre>
         * The optional formatted string name of the data type to be displayed.
         * DEPRECATED in 1.2.
         * </pre>
         *
         * <code>optional string label = 1;</code>
         * @return Whether the label field is set.
         */
        boolean hasLabel();
        /**
         * <pre>
         * The optional formatted string name of the data type to be displayed.
         * DEPRECATED in 1.2.
         * </pre>
         *
         * <code>optional string label = 1;</code>
         * @return The label.
         */
        java.lang.String getLabel();
        /**
         * <pre>
         * The optional formatted string name of the data type to be displayed.
         * DEPRECATED in 1.2.
         * </pre>
         *
         * <code>optional string label = 1;</code>
         * @return The bytes for label.
         */
        com.google.protobuf.ByteString
            getLabelBytes();

        /**
         * <pre>
         * The formatted string of data to be displayed. Can contain a formatted
         * value such as "5 stars" or "$10" or "3.4 stars out of 5".
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>required string value = 2;</code>
         * @return Whether the value field is set.
         */
        boolean hasValue();
        /**
         * <pre>
         * The formatted string of data to be displayed. Can contain a formatted
         * value such as "5 stars" or "$10" or "3.4 stars out of 5".
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>required string value = 2;</code>
         * @return The value.
         */
        java.lang.String getValue();
        /**
         * <pre>
         * The formatted string of data to be displayed. Can contain a formatted
         * value such as "5 stars" or "$10" or "3.4 stars out of 5".
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>required string value = 2;</code>
         * @return The bytes for value.
         */
        com.google.protobuf.ByteString
            getValueBytes();
      }
      /**
       * <pre>
       * OpenRTB Native 1.0: Corresponds to the Data Object in the request, with
       * the value filled in. The Data Object is to be used for all miscellaneous
       * elements of the native unit such as Brand Name, Ratings, Review Count,
       * Stars, Downloads, etc. It is also generic for future of native elements
       * not contemplated at the time of the writing of this document.
       * </pre>
       *
       * Protobuf type {@code com.iabtechlab.openrtb.v2.NativeResponse.Asset.Data}
       */
      public static final class Data extends
          com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
            Data> implements
          // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.NativeResponse.Asset.Data)
          DataOrBuilder {
      private static final long serialVersionUID = 0L;
        // Use Data.newBuilder() to construct.
        private Data(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data, ?> builder) {
          super(builder);
        }
        private Data() {
          label_ = "";
          value_ = "";
        }

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

        @java.lang.Override
        public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
          return this.unknownFields;
        }
        private Data(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          this();
          if (extensionRegistry == null) {
            throw new java.lang.NullPointerException();
          }
          int mutable_bitField0_ = 0;
          com.google.protobuf.UnknownFieldSet.Builder unknownFields =
              com.google.protobuf.UnknownFieldSet.newBuilder();
          try {
            boolean done = false;
            while (!done) {
              int tag = input.readTag();
              switch (tag) {
                case 0:
                  done = true;
                  break;
                case 10: {
                  com.google.protobuf.ByteString bs = input.readBytes();
                  bitField0_ |= 0x00000004;
                  label_ = bs;
                  break;
                }
                case 18: {
                  com.google.protobuf.ByteString bs = input.readBytes();
                  bitField0_ |= 0x00000008;
                  value_ = bs;
                  break;
                }
                case 24: {
                  bitField0_ |= 0x00000001;
                  type_ = input.readInt32();
                  break;
                }
                case 32: {
                  bitField0_ |= 0x00000002;
                  len_ = input.readInt32();
                  break;
                }
                default: {
                  if (!parseUnknownField(
                      input, unknownFields, extensionRegistry, tag)) {
                    done = true;
                  }
                  break;
                }
              }
            }
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            throw e.setUnfinishedMessage(this);
          } catch (java.io.IOException e) {
            throw new com.google.protobuf.InvalidProtocolBufferException(
                e).setUnfinishedMessage(this);
          } finally {
            this.unknownFields = unknownFields.build();
            makeExtensionsImmutable();
          }
        }
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_Data_descriptor;
        }

        @java.lang.Override
        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_Data_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data.class, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data.Builder.class);
        }

        private int bitField0_;
        public static final int TYPE_FIELD_NUMBER = 3;
        private int type_;
        /**
         * <pre>
         * The type of data element being submitted from the com.iabtechlab.adcom.v1.NativeDataAssetType enum.
         * Refer to enum com.iabtechlab.adcom.v1.NativeDataAssetType for generic values.
         * REQUIRED in 1.2 for assetsurl or dcourl responses.
         * Implemented in 1.2.
         * </pre>
         *
         * <code>optional int32 type = 3;</code>
         * @return Whether the type field is set.
         */
        @java.lang.Override
        public boolean hasType() {
          return ((bitField0_ & 0x00000001) != 0);
        }
        /**
         * <pre>
         * The type of data element being submitted from the com.iabtechlab.adcom.v1.NativeDataAssetType enum.
         * Refer to enum com.iabtechlab.adcom.v1.NativeDataAssetType for generic values.
         * REQUIRED in 1.2 for assetsurl or dcourl responses.
         * Implemented in 1.2.
         * </pre>
         *
         * <code>optional int32 type = 3;</code>
         * @return The type.
         */
        @java.lang.Override
        public int getType() {
          return type_;
        }

        public static final int LEN_FIELD_NUMBER = 4;
        private int len_;
        /**
         * <pre>
         * The length of the data element being submitted. Where applicable, must
         * comply with the recommended maximum lengths in the com.iabtechlab.adcom.v1.NativeDataAssetType enum.
         * REQUIRED in 1.2 for assetsurl or dcourl responses.
         * Implemented in 1.2.
         * </pre>
         *
         * <code>optional int32 len = 4;</code>
         * @return Whether the len field is set.
         */
        @java.lang.Override
        public boolean hasLen() {
          return ((bitField0_ & 0x00000002) != 0);
        }
        /**
         * <pre>
         * The length of the data element being submitted. Where applicable, must
         * comply with the recommended maximum lengths in the com.iabtechlab.adcom.v1.NativeDataAssetType enum.
         * REQUIRED in 1.2 for assetsurl or dcourl responses.
         * Implemented in 1.2.
         * </pre>
         *
         * <code>optional int32 len = 4;</code>
         * @return The len.
         */
        @java.lang.Override
        public int getLen() {
          return len_;
        }

        public static final int LABEL_FIELD_NUMBER = 1;
        private volatile java.lang.Object label_;
        /**
         * <pre>
         * The optional formatted string name of the data type to be displayed.
         * DEPRECATED in 1.2.
         * </pre>
         *
         * <code>optional string label = 1;</code>
         * @return Whether the label field is set.
         */
        @java.lang.Override
        public boolean hasLabel() {
          return ((bitField0_ & 0x00000004) != 0);
        }
        /**
         * <pre>
         * The optional formatted string name of the data type to be displayed.
         * DEPRECATED in 1.2.
         * </pre>
         *
         * <code>optional string label = 1;</code>
         * @return The label.
         */
        @java.lang.Override
        public java.lang.String getLabel() {
          java.lang.Object ref = label_;
          if (ref instanceof java.lang.String) {
            return (java.lang.String) ref;
          } else {
            com.google.protobuf.ByteString bs = 
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              label_ = s;
            }
            return s;
          }
        }
        /**
         * <pre>
         * The optional formatted string name of the data type to be displayed.
         * DEPRECATED in 1.2.
         * </pre>
         *
         * <code>optional string label = 1;</code>
         * @return The bytes for label.
         */
        @java.lang.Override
        public com.google.protobuf.ByteString
            getLabelBytes() {
          java.lang.Object ref = label_;
          if (ref instanceof java.lang.String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            label_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }

        public static final int VALUE_FIELD_NUMBER = 2;
        private volatile java.lang.Object value_;
        /**
         * <pre>
         * The formatted string of data to be displayed. Can contain a formatted
         * value such as "5 stars" or "$10" or "3.4 stars out of 5".
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>required string value = 2;</code>
         * @return Whether the value field is set.
         */
        @java.lang.Override
        public boolean hasValue() {
          return ((bitField0_ & 0x00000008) != 0);
        }
        /**
         * <pre>
         * The formatted string of data to be displayed. Can contain a formatted
         * value such as "5 stars" or "$10" or "3.4 stars out of 5".
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>required string value = 2;</code>
         * @return The value.
         */
        @java.lang.Override
        public java.lang.String getValue() {
          java.lang.Object ref = value_;
          if (ref instanceof java.lang.String) {
            return (java.lang.String) ref;
          } else {
            com.google.protobuf.ByteString bs = 
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              value_ = s;
            }
            return s;
          }
        }
        /**
         * <pre>
         * The formatted string of data to be displayed. Can contain a formatted
         * value such as "5 stars" or "$10" or "3.4 stars out of 5".
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>required string value = 2;</code>
         * @return The bytes for value.
         */
        @java.lang.Override
        public com.google.protobuf.ByteString
            getValueBytes() {
          java.lang.Object ref = value_;
          if (ref instanceof java.lang.String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            value_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }

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

          if (!hasValue()) {
            memoizedIsInitialized = 0;
            return false;
          }
          if (!extensionsAreInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
          memoizedIsInitialized = 1;
          return true;
        }

        @java.lang.Override
        public void writeTo(com.google.protobuf.CodedOutputStream output)
                            throws java.io.IOException {
          com.google.protobuf.GeneratedMessageV3
            .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data>.ExtensionWriter
              extensionWriter = newExtensionWriter();
          if (((bitField0_ & 0x00000004) != 0)) {
            com.google.protobuf.GeneratedMessageV3.writeString(output, 1, label_);
          }
          if (((bitField0_ & 0x00000008) != 0)) {
            com.google.protobuf.GeneratedMessageV3.writeString(output, 2, value_);
          }
          if (((bitField0_ & 0x00000001) != 0)) {
            output.writeInt32(3, type_);
          }
          if (((bitField0_ & 0x00000002) != 0)) {
            output.writeInt32(4, len_);
          }
          extensionWriter.writeUntil(10000, output);
          unknownFields.writeTo(output);
        }

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

          size = 0;
          if (((bitField0_ & 0x00000004) != 0)) {
            size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, label_);
          }
          if (((bitField0_ & 0x00000008) != 0)) {
            size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, value_);
          }
          if (((bitField0_ & 0x00000001) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(3, type_);
          }
          if (((bitField0_ & 0x00000002) != 0)) {
            size += com.google.protobuf.CodedOutputStream
              .computeInt32Size(4, len_);
          }
          size += extensionsSerializedSize();
          size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data)) {
            return super.equals(obj);
          }
          com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data other = (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data) obj;

          if (hasType() != other.hasType()) return false;
          if (hasType()) {
            if (getType()
                != other.getType()) return false;
          }
          if (hasLen() != other.hasLen()) return false;
          if (hasLen()) {
            if (getLen()
                != other.getLen()) return false;
          }
          if (hasLabel() != other.hasLabel()) return false;
          if (hasLabel()) {
            if (!getLabel()
                .equals(other.getLabel())) return false;
          }
          if (hasValue() != other.hasValue()) return false;
          if (hasValue()) {
            if (!getValue()
                .equals(other.getValue())) return false;
          }
          if (!unknownFields.equals(other.unknownFields)) return false;
          if (!getExtensionFields().equals(other.getExtensionFields()))
            return false;
          return true;
        }

        @java.lang.Override
        public int hashCode() {
          if (memoizedHashCode != 0) {
            return memoizedHashCode;
          }
          int hash = 41;
          hash = (19 * hash) + getDescriptor().hashCode();
          if (hasType()) {
            hash = (37 * hash) + TYPE_FIELD_NUMBER;
            hash = (53 * hash) + getType();
          }
          if (hasLen()) {
            hash = (37 * hash) + LEN_FIELD_NUMBER;
            hash = (53 * hash) + getLen();
          }
          if (hasLabel()) {
            hash = (37 * hash) + LABEL_FIELD_NUMBER;
            hash = (53 * hash) + getLabel().hashCode();
          }
          if (hasValue()) {
            hash = (37 * hash) + VALUE_FIELD_NUMBER;
            hash = (53 * hash) + getValue().hashCode();
          }
          hash = hashFields(hash, getExtensionFields());
          hash = (29 * hash) + unknownFields.hashCode();
          memoizedHashCode = hash;
          return hash;
        }

        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data parseFrom(
            java.nio.ByteBuffer data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data parseFrom(
            java.nio.ByteBuffer data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data parseFrom(
            com.google.protobuf.ByteString data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data parseFrom(
            com.google.protobuf.ByteString data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data parseFrom(byte[] data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data parseFrom(
            byte[] data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data parseFrom(java.io.InputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data 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.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data parseDelimitedFrom(java.io.InputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseDelimitedWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data 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.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data parseFrom(
            com.google.protobuf.CodedInputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data 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.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data 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>
         * OpenRTB Native 1.0: Corresponds to the Data Object in the request, with
         * the value filled in. The Data Object is to be used for all miscellaneous
         * elements of the native unit such as Brand Name, Ratings, Review Count,
         * Stars, Downloads, etc. It is also generic for future of native elements
         * not contemplated at the time of the writing of this document.
         * </pre>
         *
         * Protobuf type {@code com.iabtechlab.openrtb.v2.NativeResponse.Asset.Data}
         */
        public static final class Builder extends
            com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
              com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data, Builder> implements
            // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.NativeResponse.Asset.Data)
            com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.DataOrBuilder {
          public static final com.google.protobuf.Descriptors.Descriptor
              getDescriptor() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_Data_descriptor;
          }

          @java.lang.Override
          protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
              internalGetFieldAccessorTable() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_Data_fieldAccessorTable
                .ensureFieldAccessorsInitialized(
                    com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data.class, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data.Builder.class);
          }

          // Construct using com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data.newBuilder()
          private Builder() {
            maybeForceBuilderInitialization();
          }

          private Builder(
              com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
            super(parent);
            maybeForceBuilderInitialization();
          }
          private void maybeForceBuilderInitialization() {
            if (com.google.protobuf.GeneratedMessageV3
                    .alwaysUseFieldBuilders) {
            }
          }
          @java.lang.Override
          public Builder clear() {
            super.clear();
            type_ = 0;
            bitField0_ = (bitField0_ & ~0x00000001);
            len_ = 0;
            bitField0_ = (bitField0_ & ~0x00000002);
            label_ = "";
            bitField0_ = (bitField0_ & ~0x00000004);
            value_ = "";
            bitField0_ = (bitField0_ & ~0x00000008);
            return this;
          }

          @java.lang.Override
          public com.google.protobuf.Descriptors.Descriptor
              getDescriptorForType() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_Data_descriptor;
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data getDefaultInstanceForType() {
            return com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data.getDefaultInstance();
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data build() {
            com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data result = buildPartial();
            if (!result.isInitialized()) {
              throw newUninitializedMessageException(result);
            }
            return result;
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data buildPartial() {
            com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data result = new com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data(this);
            int from_bitField0_ = bitField0_;
            int to_bitField0_ = 0;
            if (((from_bitField0_ & 0x00000001) != 0)) {
              result.type_ = type_;
              to_bitField0_ |= 0x00000001;
            }
            if (((from_bitField0_ & 0x00000002) != 0)) {
              result.len_ = len_;
              to_bitField0_ |= 0x00000002;
            }
            if (((from_bitField0_ & 0x00000004) != 0)) {
              to_bitField0_ |= 0x00000004;
            }
            result.label_ = label_;
            if (((from_bitField0_ & 0x00000008) != 0)) {
              to_bitField0_ |= 0x00000008;
            }
            result.value_ = value_;
            result.bitField0_ = to_bitField0_;
            onBuilt();
            return result;
          }

          @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 <Type> Builder setExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data, Type> extension,
              Type value) {
            return super.setExtension(extension, value);
          }
          @java.lang.Override
          public <Type> Builder setExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data, java.util.List<Type>> extension,
              int index, Type value) {
            return super.setExtension(extension, index, value);
          }
          @java.lang.Override
          public <Type> Builder addExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data, java.util.List<Type>> extension,
              Type value) {
            return super.addExtension(extension, value);
          }
          @java.lang.Override
          public <Type> Builder clearExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data, ?> extension) {
            return super.clearExtension(extension);
          }
          @java.lang.Override
          public Builder mergeFrom(com.google.protobuf.Message other) {
            if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data) {
              return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data)other);
            } else {
              super.mergeFrom(other);
              return this;
            }
          }

          public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data other) {
            if (other == com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data.getDefaultInstance()) return this;
            if (other.hasType()) {
              setType(other.getType());
            }
            if (other.hasLen()) {
              setLen(other.getLen());
            }
            if (other.hasLabel()) {
              bitField0_ |= 0x00000004;
              label_ = other.label_;
              onChanged();
            }
            if (other.hasValue()) {
              bitField0_ |= 0x00000008;
              value_ = other.value_;
              onChanged();
            }
            this.mergeExtensionFields(other);
            this.mergeUnknownFields(other.unknownFields);
            onChanged();
            return this;
          }

          @java.lang.Override
          public final boolean isInitialized() {
            if (!hasValue()) {
              return false;
            }
            if (!extensionsAreInitialized()) {
              return false;
            }
            return true;
          }

          @java.lang.Override
          public Builder mergeFrom(
              com.google.protobuf.CodedInputStream input,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data parsedMessage = null;
            try {
              parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
              parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data) e.getUnfinishedMessage();
              throw e.unwrapIOException();
            } finally {
              if (parsedMessage != null) {
                mergeFrom(parsedMessage);
              }
            }
            return this;
          }
          private int bitField0_;

          private int type_ ;
          /**
           * <pre>
           * The type of data element being submitted from the com.iabtechlab.adcom.v1.NativeDataAssetType enum.
           * Refer to enum com.iabtechlab.adcom.v1.NativeDataAssetType for generic values.
           * REQUIRED in 1.2 for assetsurl or dcourl responses.
           * Implemented in 1.2.
           * </pre>
           *
           * <code>optional int32 type = 3;</code>
           * @return Whether the type field is set.
           */
          @java.lang.Override
          public boolean hasType() {
            return ((bitField0_ & 0x00000001) != 0);
          }
          /**
           * <pre>
           * The type of data element being submitted from the com.iabtechlab.adcom.v1.NativeDataAssetType enum.
           * Refer to enum com.iabtechlab.adcom.v1.NativeDataAssetType for generic values.
           * REQUIRED in 1.2 for assetsurl or dcourl responses.
           * Implemented in 1.2.
           * </pre>
           *
           * <code>optional int32 type = 3;</code>
           * @return The type.
           */
          @java.lang.Override
          public int getType() {
            return type_;
          }
          /**
           * <pre>
           * The type of data element being submitted from the com.iabtechlab.adcom.v1.NativeDataAssetType enum.
           * Refer to enum com.iabtechlab.adcom.v1.NativeDataAssetType for generic values.
           * REQUIRED in 1.2 for assetsurl or dcourl responses.
           * Implemented in 1.2.
           * </pre>
           *
           * <code>optional int32 type = 3;</code>
           * @param value The type to set.
           * @return This builder for chaining.
           */
          public Builder setType(int value) {
            bitField0_ |= 0x00000001;
            type_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * The type of data element being submitted from the com.iabtechlab.adcom.v1.NativeDataAssetType enum.
           * Refer to enum com.iabtechlab.adcom.v1.NativeDataAssetType for generic values.
           * REQUIRED in 1.2 for assetsurl or dcourl responses.
           * Implemented in 1.2.
           * </pre>
           *
           * <code>optional int32 type = 3;</code>
           * @return This builder for chaining.
           */
          public Builder clearType() {
            bitField0_ = (bitField0_ & ~0x00000001);
            type_ = 0;
            onChanged();
            return this;
          }

          private int len_ ;
          /**
           * <pre>
           * The length of the data element being submitted. Where applicable, must
           * comply with the recommended maximum lengths in the com.iabtechlab.adcom.v1.NativeDataAssetType enum.
           * REQUIRED in 1.2 for assetsurl or dcourl responses.
           * Implemented in 1.2.
           * </pre>
           *
           * <code>optional int32 len = 4;</code>
           * @return Whether the len field is set.
           */
          @java.lang.Override
          public boolean hasLen() {
            return ((bitField0_ & 0x00000002) != 0);
          }
          /**
           * <pre>
           * The length of the data element being submitted. Where applicable, must
           * comply with the recommended maximum lengths in the com.iabtechlab.adcom.v1.NativeDataAssetType enum.
           * REQUIRED in 1.2 for assetsurl or dcourl responses.
           * Implemented in 1.2.
           * </pre>
           *
           * <code>optional int32 len = 4;</code>
           * @return The len.
           */
          @java.lang.Override
          public int getLen() {
            return len_;
          }
          /**
           * <pre>
           * The length of the data element being submitted. Where applicable, must
           * comply with the recommended maximum lengths in the com.iabtechlab.adcom.v1.NativeDataAssetType enum.
           * REQUIRED in 1.2 for assetsurl or dcourl responses.
           * Implemented in 1.2.
           * </pre>
           *
           * <code>optional int32 len = 4;</code>
           * @param value The len to set.
           * @return This builder for chaining.
           */
          public Builder setLen(int value) {
            bitField0_ |= 0x00000002;
            len_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * The length of the data element being submitted. Where applicable, must
           * comply with the recommended maximum lengths in the com.iabtechlab.adcom.v1.NativeDataAssetType enum.
           * REQUIRED in 1.2 for assetsurl or dcourl responses.
           * Implemented in 1.2.
           * </pre>
           *
           * <code>optional int32 len = 4;</code>
           * @return This builder for chaining.
           */
          public Builder clearLen() {
            bitField0_ = (bitField0_ & ~0x00000002);
            len_ = 0;
            onChanged();
            return this;
          }

          private java.lang.Object label_ = "";
          /**
           * <pre>
           * The optional formatted string name of the data type to be displayed.
           * DEPRECATED in 1.2.
           * </pre>
           *
           * <code>optional string label = 1;</code>
           * @return Whether the label field is set.
           */
          public boolean hasLabel() {
            return ((bitField0_ & 0x00000004) != 0);
          }
          /**
           * <pre>
           * The optional formatted string name of the data type to be displayed.
           * DEPRECATED in 1.2.
           * </pre>
           *
           * <code>optional string label = 1;</code>
           * @return The label.
           */
          public java.lang.String getLabel() {
            java.lang.Object ref = label_;
            if (!(ref instanceof java.lang.String)) {
              com.google.protobuf.ByteString bs =
                  (com.google.protobuf.ByteString) ref;
              java.lang.String s = bs.toStringUtf8();
              if (bs.isValidUtf8()) {
                label_ = s;
              }
              return s;
            } else {
              return (java.lang.String) ref;
            }
          }
          /**
           * <pre>
           * The optional formatted string name of the data type to be displayed.
           * DEPRECATED in 1.2.
           * </pre>
           *
           * <code>optional string label = 1;</code>
           * @return The bytes for label.
           */
          public com.google.protobuf.ByteString
              getLabelBytes() {
            java.lang.Object ref = label_;
            if (ref instanceof String) {
              com.google.protobuf.ByteString b = 
                  com.google.protobuf.ByteString.copyFromUtf8(
                      (java.lang.String) ref);
              label_ = b;
              return b;
            } else {
              return (com.google.protobuf.ByteString) ref;
            }
          }
          /**
           * <pre>
           * The optional formatted string name of the data type to be displayed.
           * DEPRECATED in 1.2.
           * </pre>
           *
           * <code>optional string label = 1;</code>
           * @param value The label to set.
           * @return This builder for chaining.
           */
          public Builder setLabel(
              java.lang.String value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
            label_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * The optional formatted string name of the data type to be displayed.
           * DEPRECATED in 1.2.
           * </pre>
           *
           * <code>optional string label = 1;</code>
           * @return This builder for chaining.
           */
          public Builder clearLabel() {
            bitField0_ = (bitField0_ & ~0x00000004);
            label_ = getDefaultInstance().getLabel();
            onChanged();
            return this;
          }
          /**
           * <pre>
           * The optional formatted string name of the data type to be displayed.
           * DEPRECATED in 1.2.
           * </pre>
           *
           * <code>optional string label = 1;</code>
           * @param value The bytes for label to set.
           * @return This builder for chaining.
           */
          public Builder setLabelBytes(
              com.google.protobuf.ByteString value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
            label_ = value;
            onChanged();
            return this;
          }

          private java.lang.Object value_ = "";
          /**
           * <pre>
           * The formatted string of data to be displayed. Can contain a formatted
           * value such as "5 stars" or "$10" or "3.4 stars out of 5".
           * REQUIRED by the OpenRTB Native specification.
           * </pre>
           *
           * <code>required string value = 2;</code>
           * @return Whether the value field is set.
           */
          public boolean hasValue() {
            return ((bitField0_ & 0x00000008) != 0);
          }
          /**
           * <pre>
           * The formatted string of data to be displayed. Can contain a formatted
           * value such as "5 stars" or "$10" or "3.4 stars out of 5".
           * REQUIRED by the OpenRTB Native specification.
           * </pre>
           *
           * <code>required string value = 2;</code>
           * @return The value.
           */
          public java.lang.String getValue() {
            java.lang.Object ref = value_;
            if (!(ref instanceof java.lang.String)) {
              com.google.protobuf.ByteString bs =
                  (com.google.protobuf.ByteString) ref;
              java.lang.String s = bs.toStringUtf8();
              if (bs.isValidUtf8()) {
                value_ = s;
              }
              return s;
            } else {
              return (java.lang.String) ref;
            }
          }
          /**
           * <pre>
           * The formatted string of data to be displayed. Can contain a formatted
           * value such as "5 stars" or "$10" or "3.4 stars out of 5".
           * REQUIRED by the OpenRTB Native specification.
           * </pre>
           *
           * <code>required string value = 2;</code>
           * @return The bytes for value.
           */
          public com.google.protobuf.ByteString
              getValueBytes() {
            java.lang.Object ref = value_;
            if (ref instanceof String) {
              com.google.protobuf.ByteString b = 
                  com.google.protobuf.ByteString.copyFromUtf8(
                      (java.lang.String) ref);
              value_ = b;
              return b;
            } else {
              return (com.google.protobuf.ByteString) ref;
            }
          }
          /**
           * <pre>
           * The formatted string of data to be displayed. Can contain a formatted
           * value such as "5 stars" or "$10" or "3.4 stars out of 5".
           * REQUIRED by the OpenRTB Native specification.
           * </pre>
           *
           * <code>required string value = 2;</code>
           * @param value The value to set.
           * @return This builder for chaining.
           */
          public Builder setValue(
              java.lang.String value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
            value_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * The formatted string of data to be displayed. Can contain a formatted
           * value such as "5 stars" or "$10" or "3.4 stars out of 5".
           * REQUIRED by the OpenRTB Native specification.
           * </pre>
           *
           * <code>required string value = 2;</code>
           * @return This builder for chaining.
           */
          public Builder clearValue() {
            bitField0_ = (bitField0_ & ~0x00000008);
            value_ = getDefaultInstance().getValue();
            onChanged();
            return this;
          }
          /**
           * <pre>
           * The formatted string of data to be displayed. Can contain a formatted
           * value such as "5 stars" or "$10" or "3.4 stars out of 5".
           * REQUIRED by the OpenRTB Native specification.
           * </pre>
           *
           * <code>required string value = 2;</code>
           * @param value The bytes for value to set.
           * @return This builder for chaining.
           */
          public Builder setValueBytes(
              com.google.protobuf.ByteString value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
            value_ = value;
            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:com.iabtechlab.openrtb.v2.NativeResponse.Asset.Data)
        }

        // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.NativeResponse.Asset.Data)
        private static final com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data DEFAULT_INSTANCE;
        static {
          DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data();
        }

        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data getDefaultInstance() {
          return DEFAULT_INSTANCE;
        }

        @java.lang.Deprecated public static final com.google.protobuf.Parser<Data>
            PARSER = new com.google.protobuf.AbstractParser<Data>() {
          @java.lang.Override
          public Data parsePartialFrom(
              com.google.protobuf.CodedInputStream input,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.protobuf.InvalidProtocolBufferException {
            return new Data(input, extensionRegistry);
          }
        };

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

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

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data getDefaultInstanceForType() {
          return DEFAULT_INSTANCE;
        }

      }

      public interface VideoOrBuilder extends
          // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.NativeResponse.Asset.Video)
          com.google.protobuf.GeneratedMessageV3.
              ExtendableMessageOrBuilder<Video> {

        /**
         * <pre>
         * VAST xml.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>required string vasttag = 1;</code>
         * @return Whether the vasttag field is set.
         */
        boolean hasVasttag();
        /**
         * <pre>
         * VAST xml.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>required string vasttag = 1;</code>
         * @return The vasttag.
         */
        java.lang.String getVasttag();
        /**
         * <pre>
         * VAST xml.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>required string vasttag = 1;</code>
         * @return The bytes for vasttag.
         */
        com.google.protobuf.ByteString
            getVasttagBytes();
      }
      /**
       * <pre>
       * OpenRTB Native 1.0: Corresponds to the Video Object in the request,
       * yet containing a value of a conforming VAST tag as a value.
       * </pre>
       *
       * Protobuf type {@code com.iabtechlab.openrtb.v2.NativeResponse.Asset.Video}
       */
      public static final class Video extends
          com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
            Video> implements
          // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.NativeResponse.Asset.Video)
          VideoOrBuilder {
      private static final long serialVersionUID = 0L;
        // Use Video.newBuilder() to construct.
        private Video(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video, ?> builder) {
          super(builder);
        }
        private Video() {
          vasttag_ = "";
        }

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

        @java.lang.Override
        public final com.google.protobuf.UnknownFieldSet
        getUnknownFields() {
          return this.unknownFields;
        }
        private Video(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          this();
          if (extensionRegistry == null) {
            throw new java.lang.NullPointerException();
          }
          int mutable_bitField0_ = 0;
          com.google.protobuf.UnknownFieldSet.Builder unknownFields =
              com.google.protobuf.UnknownFieldSet.newBuilder();
          try {
            boolean done = false;
            while (!done) {
              int tag = input.readTag();
              switch (tag) {
                case 0:
                  done = true;
                  break;
                case 10: {
                  com.google.protobuf.ByteString bs = input.readBytes();
                  bitField0_ |= 0x00000001;
                  vasttag_ = bs;
                  break;
                }
                default: {
                  if (!parseUnknownField(
                      input, unknownFields, extensionRegistry, tag)) {
                    done = true;
                  }
                  break;
                }
              }
            }
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            throw e.setUnfinishedMessage(this);
          } catch (java.io.IOException e) {
            throw new com.google.protobuf.InvalidProtocolBufferException(
                e).setUnfinishedMessage(this);
          } finally {
            this.unknownFields = unknownFields.build();
            makeExtensionsImmutable();
          }
        }
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_Video_descriptor;
        }

        @java.lang.Override
        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_Video_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video.class, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video.Builder.class);
        }

        private int bitField0_;
        public static final int VASTTAG_FIELD_NUMBER = 1;
        private volatile java.lang.Object vasttag_;
        /**
         * <pre>
         * VAST xml.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>required string vasttag = 1;</code>
         * @return Whether the vasttag field is set.
         */
        @java.lang.Override
        public boolean hasVasttag() {
          return ((bitField0_ & 0x00000001) != 0);
        }
        /**
         * <pre>
         * VAST xml.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>required string vasttag = 1;</code>
         * @return The vasttag.
         */
        @java.lang.Override
        public java.lang.String getVasttag() {
          java.lang.Object ref = vasttag_;
          if (ref instanceof java.lang.String) {
            return (java.lang.String) ref;
          } else {
            com.google.protobuf.ByteString bs = 
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              vasttag_ = s;
            }
            return s;
          }
        }
        /**
         * <pre>
         * VAST xml.
         * REQUIRED by the OpenRTB Native specification.
         * </pre>
         *
         * <code>required string vasttag = 1;</code>
         * @return The bytes for vasttag.
         */
        @java.lang.Override
        public com.google.protobuf.ByteString
            getVasttagBytes() {
          java.lang.Object ref = vasttag_;
          if (ref instanceof java.lang.String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            vasttag_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }

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

          if (!hasVasttag()) {
            memoizedIsInitialized = 0;
            return false;
          }
          if (!extensionsAreInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
          memoizedIsInitialized = 1;
          return true;
        }

        @java.lang.Override
        public void writeTo(com.google.protobuf.CodedOutputStream output)
                            throws java.io.IOException {
          com.google.protobuf.GeneratedMessageV3
            .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video>.ExtensionWriter
              extensionWriter = newExtensionWriter();
          if (((bitField0_ & 0x00000001) != 0)) {
            com.google.protobuf.GeneratedMessageV3.writeString(output, 1, vasttag_);
          }
          extensionWriter.writeUntil(10000, output);
          unknownFields.writeTo(output);
        }

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

          size = 0;
          if (((bitField0_ & 0x00000001) != 0)) {
            size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, vasttag_);
          }
          size += extensionsSerializedSize();
          size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video)) {
            return super.equals(obj);
          }
          com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video other = (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video) obj;

          if (hasVasttag() != other.hasVasttag()) return false;
          if (hasVasttag()) {
            if (!getVasttag()
                .equals(other.getVasttag())) return false;
          }
          if (!unknownFields.equals(other.unknownFields)) return false;
          if (!getExtensionFields().equals(other.getExtensionFields()))
            return false;
          return true;
        }

        @java.lang.Override
        public int hashCode() {
          if (memoizedHashCode != 0) {
            return memoizedHashCode;
          }
          int hash = 41;
          hash = (19 * hash) + getDescriptor().hashCode();
          if (hasVasttag()) {
            hash = (37 * hash) + VASTTAG_FIELD_NUMBER;
            hash = (53 * hash) + getVasttag().hashCode();
          }
          hash = hashFields(hash, getExtensionFields());
          hash = (29 * hash) + unknownFields.hashCode();
          memoizedHashCode = hash;
          return hash;
        }

        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video parseFrom(
            java.nio.ByteBuffer data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video parseFrom(
            java.nio.ByteBuffer data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video parseFrom(
            com.google.protobuf.ByteString data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video parseFrom(
            com.google.protobuf.ByteString data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video parseFrom(byte[] data)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video parseFrom(
            byte[] data,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return PARSER.parseFrom(data, extensionRegistry);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video parseFrom(java.io.InputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video 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.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video parseDelimitedFrom(java.io.InputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseDelimitedWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video 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.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video parseFrom(
            com.google.protobuf.CodedInputStream input)
            throws java.io.IOException {
          return com.google.protobuf.GeneratedMessageV3
              .parseWithIOException(PARSER, input);
        }
        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video 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.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video 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>
         * OpenRTB Native 1.0: Corresponds to the Video Object in the request,
         * yet containing a value of a conforming VAST tag as a value.
         * </pre>
         *
         * Protobuf type {@code com.iabtechlab.openrtb.v2.NativeResponse.Asset.Video}
         */
        public static final class Builder extends
            com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
              com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video, Builder> implements
            // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.NativeResponse.Asset.Video)
            com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.VideoOrBuilder {
          public static final com.google.protobuf.Descriptors.Descriptor
              getDescriptor() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_Video_descriptor;
          }

          @java.lang.Override
          protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
              internalGetFieldAccessorTable() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_Video_fieldAccessorTable
                .ensureFieldAccessorsInitialized(
                    com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video.class, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video.Builder.class);
          }

          // Construct using com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video.newBuilder()
          private Builder() {
            maybeForceBuilderInitialization();
          }

          private Builder(
              com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
            super(parent);
            maybeForceBuilderInitialization();
          }
          private void maybeForceBuilderInitialization() {
            if (com.google.protobuf.GeneratedMessageV3
                    .alwaysUseFieldBuilders) {
            }
          }
          @java.lang.Override
          public Builder clear() {
            super.clear();
            vasttag_ = "";
            bitField0_ = (bitField0_ & ~0x00000001);
            return this;
          }

          @java.lang.Override
          public com.google.protobuf.Descriptors.Descriptor
              getDescriptorForType() {
            return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_Video_descriptor;
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video getDefaultInstanceForType() {
            return com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video.getDefaultInstance();
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video build() {
            com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video result = buildPartial();
            if (!result.isInitialized()) {
              throw newUninitializedMessageException(result);
            }
            return result;
          }

          @java.lang.Override
          public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video buildPartial() {
            com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video result = new com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video(this);
            int from_bitField0_ = bitField0_;
            int to_bitField0_ = 0;
            if (((from_bitField0_ & 0x00000001) != 0)) {
              to_bitField0_ |= 0x00000001;
            }
            result.vasttag_ = vasttag_;
            result.bitField0_ = to_bitField0_;
            onBuilt();
            return result;
          }

          @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 <Type> Builder setExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video, Type> extension,
              Type value) {
            return super.setExtension(extension, value);
          }
          @java.lang.Override
          public <Type> Builder setExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video, java.util.List<Type>> extension,
              int index, Type value) {
            return super.setExtension(extension, index, value);
          }
          @java.lang.Override
          public <Type> Builder addExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video, java.util.List<Type>> extension,
              Type value) {
            return super.addExtension(extension, value);
          }
          @java.lang.Override
          public <Type> Builder clearExtension(
              com.google.protobuf.GeneratedMessage.GeneratedExtension<
                  com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video, ?> extension) {
            return super.clearExtension(extension);
          }
          @java.lang.Override
          public Builder mergeFrom(com.google.protobuf.Message other) {
            if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video) {
              return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video)other);
            } else {
              super.mergeFrom(other);
              return this;
            }
          }

          public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video other) {
            if (other == com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video.getDefaultInstance()) return this;
            if (other.hasVasttag()) {
              bitField0_ |= 0x00000001;
              vasttag_ = other.vasttag_;
              onChanged();
            }
            this.mergeExtensionFields(other);
            this.mergeUnknownFields(other.unknownFields);
            onChanged();
            return this;
          }

          @java.lang.Override
          public final boolean isInitialized() {
            if (!hasVasttag()) {
              return false;
            }
            if (!extensionsAreInitialized()) {
              return false;
            }
            return true;
          }

          @java.lang.Override
          public Builder mergeFrom(
              com.google.protobuf.CodedInputStream input,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws java.io.IOException {
            com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video parsedMessage = null;
            try {
              parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
            } catch (com.google.protobuf.InvalidProtocolBufferException e) {
              parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video) e.getUnfinishedMessage();
              throw e.unwrapIOException();
            } finally {
              if (parsedMessage != null) {
                mergeFrom(parsedMessage);
              }
            }
            return this;
          }
          private int bitField0_;

          private java.lang.Object vasttag_ = "";
          /**
           * <pre>
           * VAST xml.
           * REQUIRED by the OpenRTB Native specification.
           * </pre>
           *
           * <code>required string vasttag = 1;</code>
           * @return Whether the vasttag field is set.
           */
          public boolean hasVasttag() {
            return ((bitField0_ & 0x00000001) != 0);
          }
          /**
           * <pre>
           * VAST xml.
           * REQUIRED by the OpenRTB Native specification.
           * </pre>
           *
           * <code>required string vasttag = 1;</code>
           * @return The vasttag.
           */
          public java.lang.String getVasttag() {
            java.lang.Object ref = vasttag_;
            if (!(ref instanceof java.lang.String)) {
              com.google.protobuf.ByteString bs =
                  (com.google.protobuf.ByteString) ref;
              java.lang.String s = bs.toStringUtf8();
              if (bs.isValidUtf8()) {
                vasttag_ = s;
              }
              return s;
            } else {
              return (java.lang.String) ref;
            }
          }
          /**
           * <pre>
           * VAST xml.
           * REQUIRED by the OpenRTB Native specification.
           * </pre>
           *
           * <code>required string vasttag = 1;</code>
           * @return The bytes for vasttag.
           */
          public com.google.protobuf.ByteString
              getVasttagBytes() {
            java.lang.Object ref = vasttag_;
            if (ref instanceof String) {
              com.google.protobuf.ByteString b = 
                  com.google.protobuf.ByteString.copyFromUtf8(
                      (java.lang.String) ref);
              vasttag_ = b;
              return b;
            } else {
              return (com.google.protobuf.ByteString) ref;
            }
          }
          /**
           * <pre>
           * VAST xml.
           * REQUIRED by the OpenRTB Native specification.
           * </pre>
           *
           * <code>required string vasttag = 1;</code>
           * @param value The vasttag to set.
           * @return This builder for chaining.
           */
          public Builder setVasttag(
              java.lang.String value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
            vasttag_ = value;
            onChanged();
            return this;
          }
          /**
           * <pre>
           * VAST xml.
           * REQUIRED by the OpenRTB Native specification.
           * </pre>
           *
           * <code>required string vasttag = 1;</code>
           * @return This builder for chaining.
           */
          public Builder clearVasttag() {
            bitField0_ = (bitField0_ & ~0x00000001);
            vasttag_ = getDefaultInstance().getVasttag();
            onChanged();
            return this;
          }
          /**
           * <pre>
           * VAST xml.
           * REQUIRED by the OpenRTB Native specification.
           * </pre>
           *
           * <code>required string vasttag = 1;</code>
           * @param value The bytes for vasttag to set.
           * @return This builder for chaining.
           */
          public Builder setVasttagBytes(
              com.google.protobuf.ByteString value) {
            if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
            vasttag_ = value;
            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:com.iabtechlab.openrtb.v2.NativeResponse.Asset.Video)
        }

        // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.NativeResponse.Asset.Video)
        private static final com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video DEFAULT_INSTANCE;
        static {
          DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video();
        }

        public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video getDefaultInstance() {
          return DEFAULT_INSTANCE;
        }

        @java.lang.Deprecated public static final com.google.protobuf.Parser<Video>
            PARSER = new com.google.protobuf.AbstractParser<Video>() {
          @java.lang.Override
          public Video parsePartialFrom(
              com.google.protobuf.CodedInputStream input,
              com.google.protobuf.ExtensionRegistryLite extensionRegistry)
              throws com.google.protobuf.InvalidProtocolBufferException {
            return new Video(input, extensionRegistry);
          }
        };

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

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

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video getDefaultInstanceForType() {
          return DEFAULT_INSTANCE;
        }

      }

      private int bitField0_;
      private int assetOneofCase_ = 0;
      private java.lang.Object assetOneof_;
      public enum AssetOneofCase
          implements com.google.protobuf.Internal.EnumLite,
              com.google.protobuf.AbstractMessage.InternalOneOfEnum {
        TITLE(3),
        IMG(4),
        VIDEO(5),
        DATA(6),
        ASSETONEOF_NOT_SET(0);
        private final int value;
        private AssetOneofCase(int value) {
          this.value = value;
        }
        /**
         * @param value The number of the enum to look for.
         * @return The enum associated with the given number.
         * @deprecated Use {@link #forNumber(int)} instead.
         */
        @java.lang.Deprecated
        public static AssetOneofCase valueOf(int value) {
          return forNumber(value);
        }

        public static AssetOneofCase forNumber(int value) {
          switch (value) {
            case 3: return TITLE;
            case 4: return IMG;
            case 5: return VIDEO;
            case 6: return DATA;
            case 0: return ASSETONEOF_NOT_SET;
            default: return null;
          }
        }
        public int getNumber() {
          return this.value;
        }
      };

      public AssetOneofCase
      getAssetOneofCase() {
        return AssetOneofCase.forNumber(
            assetOneofCase_);
      }

      public static final int ID_FIELD_NUMBER = 1;
      private int id_;
      /**
       * <pre>
       * Unique asset ID, assigned by exchange, must match one of the asset IDs
       * in request.
       * REQUIRED in 1.0, or in 1.2 if embedded asset is being used.
       * </pre>
       *
       * <code>required int32 id = 1;</code>
       * @return Whether the id field is set.
       */
      @java.lang.Override
      public boolean hasId() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <pre>
       * Unique asset ID, assigned by exchange, must match one of the asset IDs
       * in request.
       * REQUIRED in 1.0, or in 1.2 if embedded asset is being used.
       * </pre>
       *
       * <code>required int32 id = 1;</code>
       * @return The id.
       */
      @java.lang.Override
      public int getId() {
        return id_;
      }

      public static final int REQUIRED_FIELD_NUMBER = 2;
      private boolean required_;
      /**
       * <pre>
       * Set to 1 if asset is required. (bidder requires it to be displayed).
       * </pre>
       *
       * <code>optional bool required = 2 [default = false];</code>
       * @return Whether the required field is set.
       */
      @java.lang.Override
      public boolean hasRequired() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <pre>
       * Set to 1 if asset is required. (bidder requires it to be displayed).
       * </pre>
       *
       * <code>optional bool required = 2 [default = false];</code>
       * @return The required.
       */
      @java.lang.Override
      public boolean getRequired() {
        return required_;
      }

      public static final int TITLE_FIELD_NUMBER = 3;
      /**
       * <pre>
       * Title object for title assets.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Title title = 3;</code>
       * @return Whether the title field is set.
       */
      @java.lang.Override
      public boolean hasTitle() {
        return assetOneofCase_ == 3;
      }
      /**
       * <pre>
       * Title object for title assets.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Title title = 3;</code>
       * @return The title.
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title getTitle() {
        if (assetOneofCase_ == 3) {
           return (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title) assetOneof_;
        }
        return com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title.getDefaultInstance();
      }
      /**
       * <pre>
       * Title object for title assets.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Title title = 3;</code>
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.TitleOrBuilder getTitleOrBuilder() {
        if (assetOneofCase_ == 3) {
           return (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title) assetOneof_;
        }
        return com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title.getDefaultInstance();
      }

      public static final int IMG_FIELD_NUMBER = 4;
      /**
       * <pre>
       * Image object for image assets.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Image img = 4;</code>
       * @return Whether the img field is set.
       */
      @java.lang.Override
      public boolean hasImg() {
        return assetOneofCase_ == 4;
      }
      /**
       * <pre>
       * Image object for image assets.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Image img = 4;</code>
       * @return The img.
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image getImg() {
        if (assetOneofCase_ == 4) {
           return (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image) assetOneof_;
        }
        return com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image.getDefaultInstance();
      }
      /**
       * <pre>
       * Image object for image assets.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Image img = 4;</code>
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.ImageOrBuilder getImgOrBuilder() {
        if (assetOneofCase_ == 4) {
           return (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image) assetOneof_;
        }
        return com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image.getDefaultInstance();
      }

      public static final int VIDEO_FIELD_NUMBER = 5;
      /**
       * <pre>
       * Video object for video assets.
       * Note that in-stream video ads are not part of Native.
       * Native ads may contain a video as the ad creative itself.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Video video = 5;</code>
       * @return Whether the video field is set.
       */
      @java.lang.Override
      public boolean hasVideo() {
        return assetOneofCase_ == 5;
      }
      /**
       * <pre>
       * Video object for video assets.
       * Note that in-stream video ads are not part of Native.
       * Native ads may contain a video as the ad creative itself.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Video video = 5;</code>
       * @return The video.
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video getVideo() {
        if (assetOneofCase_ == 5) {
           return (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video) assetOneof_;
        }
        return com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video.getDefaultInstance();
      }
      /**
       * <pre>
       * Video object for video assets.
       * Note that in-stream video ads are not part of Native.
       * Native ads may contain a video as the ad creative itself.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Video video = 5;</code>
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.VideoOrBuilder getVideoOrBuilder() {
        if (assetOneofCase_ == 5) {
           return (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video) assetOneof_;
        }
        return com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video.getDefaultInstance();
      }

      public static final int DATA_FIELD_NUMBER = 6;
      /**
       * <pre>
       * Data object for ratings, prices etc.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Data data = 6;</code>
       * @return Whether the data field is set.
       */
      @java.lang.Override
      public boolean hasData() {
        return assetOneofCase_ == 6;
      }
      /**
       * <pre>
       * Data object for ratings, prices etc.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Data data = 6;</code>
       * @return The data.
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data getData() {
        if (assetOneofCase_ == 6) {
           return (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data) assetOneof_;
        }
        return com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data.getDefaultInstance();
      }
      /**
       * <pre>
       * Data object for ratings, prices etc.
       * </pre>
       *
       * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Data data = 6;</code>
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.DataOrBuilder getDataOrBuilder() {
        if (assetOneofCase_ == 6) {
           return (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data) assetOneof_;
        }
        return com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data.getDefaultInstance();
      }

      public static final int LINK_FIELD_NUMBER = 7;
      private com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link link_;
      /**
       * <pre>
       * Link object for call to actions.
       * This link object applies if the asset item is activated (clicked).
       * If there is no link object on the asset, the parent link object on the
       * bid response apply.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.NativeResponse.Link link = 7;</code>
       * @return Whether the link field is set.
       */
      @java.lang.Override
      public boolean hasLink() {
        return ((bitField0_ & 0x00000040) != 0);
      }
      /**
       * <pre>
       * Link object for call to actions.
       * This link object applies if the asset item is activated (clicked).
       * If there is no link object on the asset, the parent link object on the
       * bid response apply.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.NativeResponse.Link link = 7;</code>
       * @return The link.
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link getLink() {
        return link_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link.getDefaultInstance() : link_;
      }
      /**
       * <pre>
       * Link object for call to actions.
       * This link object applies if the asset item is activated (clicked).
       * If there is no link object on the asset, the parent link object on the
       * bid response apply.
       * </pre>
       *
       * <code>optional .com.iabtechlab.openrtb.v2.NativeResponse.Link link = 7;</code>
       */
      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.LinkOrBuilder getLinkOrBuilder() {
        return link_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link.getDefaultInstance() : link_;
      }

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

        if (!hasId()) {
          memoizedIsInitialized = 0;
          return false;
        }
        if (hasTitle()) {
          if (!getTitle().isInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
        }
        if (hasImg()) {
          if (!getImg().isInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
        }
        if (hasVideo()) {
          if (!getVideo().isInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
        }
        if (hasData()) {
          if (!getData().isInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
        }
        if (hasLink()) {
          if (!getLink().isInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
        }
        if (!extensionsAreInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
        memoizedIsInitialized = 1;
        return true;
      }

      @java.lang.Override
      public void writeTo(com.google.protobuf.CodedOutputStream output)
                          throws java.io.IOException {
        com.google.protobuf.GeneratedMessageV3
          .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset>.ExtensionWriter
            extensionWriter = newExtensionWriter();
        if (((bitField0_ & 0x00000001) != 0)) {
          output.writeInt32(1, id_);
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          output.writeBool(2, required_);
        }
        if (assetOneofCase_ == 3) {
          output.writeMessage(3, (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title) assetOneof_);
        }
        if (assetOneofCase_ == 4) {
          output.writeMessage(4, (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image) assetOneof_);
        }
        if (assetOneofCase_ == 5) {
          output.writeMessage(5, (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video) assetOneof_);
        }
        if (assetOneofCase_ == 6) {
          output.writeMessage(6, (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data) assetOneof_);
        }
        if (((bitField0_ & 0x00000040) != 0)) {
          output.writeMessage(7, getLink());
        }
        extensionWriter.writeUntil(10000, output);
        unknownFields.writeTo(output);
      }

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

        size = 0;
        if (((bitField0_ & 0x00000001) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeInt32Size(1, id_);
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeBoolSize(2, required_);
        }
        if (assetOneofCase_ == 3) {
          size += com.google.protobuf.CodedOutputStream
            .computeMessageSize(3, (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title) assetOneof_);
        }
        if (assetOneofCase_ == 4) {
          size += com.google.protobuf.CodedOutputStream
            .computeMessageSize(4, (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image) assetOneof_);
        }
        if (assetOneofCase_ == 5) {
          size += com.google.protobuf.CodedOutputStream
            .computeMessageSize(5, (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video) assetOneof_);
        }
        if (assetOneofCase_ == 6) {
          size += com.google.protobuf.CodedOutputStream
            .computeMessageSize(6, (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data) assetOneof_);
        }
        if (((bitField0_ & 0x00000040) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeMessageSize(7, getLink());
        }
        size += extensionsSerializedSize();
        size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset)) {
          return super.equals(obj);
        }
        com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset other = (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset) obj;

        if (hasId() != other.hasId()) return false;
        if (hasId()) {
          if (getId()
              != other.getId()) return false;
        }
        if (hasRequired() != other.hasRequired()) return false;
        if (hasRequired()) {
          if (getRequired()
              != other.getRequired()) return false;
        }
        if (hasLink() != other.hasLink()) return false;
        if (hasLink()) {
          if (!getLink()
              .equals(other.getLink())) return false;
        }
        if (!getAssetOneofCase().equals(other.getAssetOneofCase())) return false;
        switch (assetOneofCase_) {
          case 3:
            if (!getTitle()
                .equals(other.getTitle())) return false;
            break;
          case 4:
            if (!getImg()
                .equals(other.getImg())) return false;
            break;
          case 5:
            if (!getVideo()
                .equals(other.getVideo())) return false;
            break;
          case 6:
            if (!getData()
                .equals(other.getData())) return false;
            break;
          case 0:
          default:
        }
        if (!unknownFields.equals(other.unknownFields)) return false;
        if (!getExtensionFields().equals(other.getExtensionFields()))
          return false;
        return true;
      }

      @java.lang.Override
      public int hashCode() {
        if (memoizedHashCode != 0) {
          return memoizedHashCode;
        }
        int hash = 41;
        hash = (19 * hash) + getDescriptor().hashCode();
        if (hasId()) {
          hash = (37 * hash) + ID_FIELD_NUMBER;
          hash = (53 * hash) + getId();
        }
        if (hasRequired()) {
          hash = (37 * hash) + REQUIRED_FIELD_NUMBER;
          hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
              getRequired());
        }
        if (hasLink()) {
          hash = (37 * hash) + LINK_FIELD_NUMBER;
          hash = (53 * hash) + getLink().hashCode();
        }
        switch (assetOneofCase_) {
          case 3:
            hash = (37 * hash) + TITLE_FIELD_NUMBER;
            hash = (53 * hash) + getTitle().hashCode();
            break;
          case 4:
            hash = (37 * hash) + IMG_FIELD_NUMBER;
            hash = (53 * hash) + getImg().hashCode();
            break;
          case 5:
            hash = (37 * hash) + VIDEO_FIELD_NUMBER;
            hash = (53 * hash) + getVideo().hashCode();
            break;
          case 6:
            hash = (37 * hash) + DATA_FIELD_NUMBER;
            hash = (53 * hash) + getData().hashCode();
            break;
          case 0:
          default:
        }
        hash = hashFields(hash, getExtensionFields());
        hash = (29 * hash) + unknownFields.hashCode();
        memoizedHashCode = hash;
        return hash;
      }

      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset parseFrom(
          java.nio.ByteBuffer data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset parseFrom(
          java.nio.ByteBuffer data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset parseFrom(
          com.google.protobuf.ByteString data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset parseFrom(
          com.google.protobuf.ByteString data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset parseFrom(byte[] data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset parseFrom(
          byte[] data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset parseFrom(java.io.InputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset 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.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset parseDelimitedFrom(java.io.InputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseDelimitedWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset 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.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset parseFrom(
          com.google.protobuf.CodedInputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset 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.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset 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>
       * OpenRTB Native 1.0: Corresponds to the Asset Object in the request.
       * The main container object for each asset requested or supported by Exchange
       * on behalf of the rendering client. Any object that is required is to be
       * flagged as such. Only one of the {title,img,video,data} objects should be
       * present in each object. All others should be null/absent. The id is to be
       * unique within the Asset array so that the response can be aligned.
       * </pre>
       *
       * Protobuf type {@code com.iabtechlab.openrtb.v2.NativeResponse.Asset}
       */
      public static final class Builder extends
          com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
            com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset, Builder> implements
          // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.NativeResponse.Asset)
          com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.AssetOrBuilder {
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_descriptor;
        }

        @java.lang.Override
        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.class, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Builder.class);
        }

        // Construct using com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.newBuilder()
        private Builder() {
          maybeForceBuilderInitialization();
        }

        private Builder(
            com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
          super(parent);
          maybeForceBuilderInitialization();
        }
        private void maybeForceBuilderInitialization() {
          if (com.google.protobuf.GeneratedMessageV3
                  .alwaysUseFieldBuilders) {
            getLinkFieldBuilder();
          }
        }
        @java.lang.Override
        public Builder clear() {
          super.clear();
          id_ = 0;
          bitField0_ = (bitField0_ & ~0x00000001);
          required_ = false;
          bitField0_ = (bitField0_ & ~0x00000002);
          if (linkBuilder_ == null) {
            link_ = null;
          } else {
            linkBuilder_.clear();
          }
          bitField0_ = (bitField0_ & ~0x00000040);
          assetOneofCase_ = 0;
          assetOneof_ = null;
          return this;
        }

        @java.lang.Override
        public com.google.protobuf.Descriptors.Descriptor
            getDescriptorForType() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_descriptor;
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset getDefaultInstanceForType() {
          return com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.getDefaultInstance();
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset build() {
          com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset result = buildPartial();
          if (!result.isInitialized()) {
            throw newUninitializedMessageException(result);
          }
          return result;
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset buildPartial() {
          com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset result = new com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset(this);
          int from_bitField0_ = bitField0_;
          int to_bitField0_ = 0;
          if (((from_bitField0_ & 0x00000001) != 0)) {
            result.id_ = id_;
            to_bitField0_ |= 0x00000001;
          }
          if (((from_bitField0_ & 0x00000002) != 0)) {
            result.required_ = required_;
            to_bitField0_ |= 0x00000002;
          }
          if (assetOneofCase_ == 3) {
            if (titleBuilder_ == null) {
              result.assetOneof_ = assetOneof_;
            } else {
              result.assetOneof_ = titleBuilder_.build();
            }
          }
          if (assetOneofCase_ == 4) {
            if (imgBuilder_ == null) {
              result.assetOneof_ = assetOneof_;
            } else {
              result.assetOneof_ = imgBuilder_.build();
            }
          }
          if (assetOneofCase_ == 5) {
            if (videoBuilder_ == null) {
              result.assetOneof_ = assetOneof_;
            } else {
              result.assetOneof_ = videoBuilder_.build();
            }
          }
          if (assetOneofCase_ == 6) {
            if (dataBuilder_ == null) {
              result.assetOneof_ = assetOneof_;
            } else {
              result.assetOneof_ = dataBuilder_.build();
            }
          }
          if (((from_bitField0_ & 0x00000040) != 0)) {
            if (linkBuilder_ == null) {
              result.link_ = link_;
            } else {
              result.link_ = linkBuilder_.build();
            }
            to_bitField0_ |= 0x00000040;
          }
          result.bitField0_ = to_bitField0_;
          result.assetOneofCase_ = assetOneofCase_;
          onBuilt();
          return result;
        }

        @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 <Type> Builder setExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset, Type> extension,
            Type value) {
          return super.setExtension(extension, value);
        }
        @java.lang.Override
        public <Type> Builder setExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset, java.util.List<Type>> extension,
            int index, Type value) {
          return super.setExtension(extension, index, value);
        }
        @java.lang.Override
        public <Type> Builder addExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset, java.util.List<Type>> extension,
            Type value) {
          return super.addExtension(extension, value);
        }
        @java.lang.Override
        public <Type> Builder clearExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset, ?> extension) {
          return super.clearExtension(extension);
        }
        @java.lang.Override
        public Builder mergeFrom(com.google.protobuf.Message other) {
          if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset) {
            return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset)other);
          } else {
            super.mergeFrom(other);
            return this;
          }
        }

        public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset other) {
          if (other == com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.getDefaultInstance()) return this;
          if (other.hasId()) {
            setId(other.getId());
          }
          if (other.hasRequired()) {
            setRequired(other.getRequired());
          }
          if (other.hasLink()) {
            mergeLink(other.getLink());
          }
          switch (other.getAssetOneofCase()) {
            case TITLE: {
              mergeTitle(other.getTitle());
              break;
            }
            case IMG: {
              mergeImg(other.getImg());
              break;
            }
            case VIDEO: {
              mergeVideo(other.getVideo());
              break;
            }
            case DATA: {
              mergeData(other.getData());
              break;
            }
            case ASSETONEOF_NOT_SET: {
              break;
            }
          }
          this.mergeExtensionFields(other);
          this.mergeUnknownFields(other.unknownFields);
          onChanged();
          return this;
        }

        @java.lang.Override
        public final boolean isInitialized() {
          if (!hasId()) {
            return false;
          }
          if (hasTitle()) {
            if (!getTitle().isInitialized()) {
              return false;
            }
          }
          if (hasImg()) {
            if (!getImg().isInitialized()) {
              return false;
            }
          }
          if (hasVideo()) {
            if (!getVideo().isInitialized()) {
              return false;
            }
          }
          if (hasData()) {
            if (!getData().isInitialized()) {
              return false;
            }
          }
          if (hasLink()) {
            if (!getLink().isInitialized()) {
              return false;
            }
          }
          if (!extensionsAreInitialized()) {
            return false;
          }
          return true;
        }

        @java.lang.Override
        public Builder mergeFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws java.io.IOException {
          com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset parsedMessage = null;
          try {
            parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset) e.getUnfinishedMessage();
            throw e.unwrapIOException();
          } finally {
            if (parsedMessage != null) {
              mergeFrom(parsedMessage);
            }
          }
          return this;
        }
        private int assetOneofCase_ = 0;
        private java.lang.Object assetOneof_;
        public AssetOneofCase
            getAssetOneofCase() {
          return AssetOneofCase.forNumber(
              assetOneofCase_);
        }

        public Builder clearAssetOneof() {
          assetOneofCase_ = 0;
          assetOneof_ = null;
          onChanged();
          return this;
        }

        private int bitField0_;

        private int id_ ;
        /**
         * <pre>
         * Unique asset ID, assigned by exchange, must match one of the asset IDs
         * in request.
         * REQUIRED in 1.0, or in 1.2 if embedded asset is being used.
         * </pre>
         *
         * <code>required int32 id = 1;</code>
         * @return Whether the id field is set.
         */
        @java.lang.Override
        public boolean hasId() {
          return ((bitField0_ & 0x00000001) != 0);
        }
        /**
         * <pre>
         * Unique asset ID, assigned by exchange, must match one of the asset IDs
         * in request.
         * REQUIRED in 1.0, or in 1.2 if embedded asset is being used.
         * </pre>
         *
         * <code>required int32 id = 1;</code>
         * @return The id.
         */
        @java.lang.Override
        public int getId() {
          return id_;
        }
        /**
         * <pre>
         * Unique asset ID, assigned by exchange, must match one of the asset IDs
         * in request.
         * REQUIRED in 1.0, or in 1.2 if embedded asset is being used.
         * </pre>
         *
         * <code>required int32 id = 1;</code>
         * @param value The id to set.
         * @return This builder for chaining.
         */
        public Builder setId(int value) {
          bitField0_ |= 0x00000001;
          id_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Unique asset ID, assigned by exchange, must match one of the asset IDs
         * in request.
         * REQUIRED in 1.0, or in 1.2 if embedded asset is being used.
         * </pre>
         *
         * <code>required int32 id = 1;</code>
         * @return This builder for chaining.
         */
        public Builder clearId() {
          bitField0_ = (bitField0_ & ~0x00000001);
          id_ = 0;
          onChanged();
          return this;
        }

        private boolean required_ ;
        /**
         * <pre>
         * Set to 1 if asset is required. (bidder requires it to be displayed).
         * </pre>
         *
         * <code>optional bool required = 2 [default = false];</code>
         * @return Whether the required field is set.
         */
        @java.lang.Override
        public boolean hasRequired() {
          return ((bitField0_ & 0x00000002) != 0);
        }
        /**
         * <pre>
         * Set to 1 if asset is required. (bidder requires it to be displayed).
         * </pre>
         *
         * <code>optional bool required = 2 [default = false];</code>
         * @return The required.
         */
        @java.lang.Override
        public boolean getRequired() {
          return required_;
        }
        /**
         * <pre>
         * Set to 1 if asset is required. (bidder requires it to be displayed).
         * </pre>
         *
         * <code>optional bool required = 2 [default = false];</code>
         * @param value The required to set.
         * @return This builder for chaining.
         */
        public Builder setRequired(boolean value) {
          bitField0_ |= 0x00000002;
          required_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Set to 1 if asset is required. (bidder requires it to be displayed).
         * </pre>
         *
         * <code>optional bool required = 2 [default = false];</code>
         * @return This builder for chaining.
         */
        public Builder clearRequired() {
          bitField0_ = (bitField0_ & ~0x00000002);
          required_ = false;
          onChanged();
          return this;
        }

        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title.Builder, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.TitleOrBuilder> titleBuilder_;
        /**
         * <pre>
         * Title object for title assets.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Title title = 3;</code>
         * @return Whether the title field is set.
         */
        @java.lang.Override
        public boolean hasTitle() {
          return assetOneofCase_ == 3;
        }
        /**
         * <pre>
         * Title object for title assets.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Title title = 3;</code>
         * @return The title.
         */
        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title getTitle() {
          if (titleBuilder_ == null) {
            if (assetOneofCase_ == 3) {
              return (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title) assetOneof_;
            }
            return com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title.getDefaultInstance();
          } else {
            if (assetOneofCase_ == 3) {
              return titleBuilder_.getMessage();
            }
            return com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title.getDefaultInstance();
          }
        }
        /**
         * <pre>
         * Title object for title assets.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Title title = 3;</code>
         */
        public Builder setTitle(com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title value) {
          if (titleBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            assetOneof_ = value;
            onChanged();
          } else {
            titleBuilder_.setMessage(value);
          }
          assetOneofCase_ = 3;
          return this;
        }
        /**
         * <pre>
         * Title object for title assets.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Title title = 3;</code>
         */
        public Builder setTitle(
            com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title.Builder builderForValue) {
          if (titleBuilder_ == null) {
            assetOneof_ = builderForValue.build();
            onChanged();
          } else {
            titleBuilder_.setMessage(builderForValue.build());
          }
          assetOneofCase_ = 3;
          return this;
        }
        /**
         * <pre>
         * Title object for title assets.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Title title = 3;</code>
         */
        public Builder mergeTitle(com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title value) {
          if (titleBuilder_ == null) {
            if (assetOneofCase_ == 3 &&
                assetOneof_ != com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title.getDefaultInstance()) {
              assetOneof_ = com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title.newBuilder((com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title) assetOneof_)
                  .mergeFrom(value).buildPartial();
            } else {
              assetOneof_ = value;
            }
            onChanged();
          } else {
            if (assetOneofCase_ == 3) {
              titleBuilder_.mergeFrom(value);
            }
            titleBuilder_.setMessage(value);
          }
          assetOneofCase_ = 3;
          return this;
        }
        /**
         * <pre>
         * Title object for title assets.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Title title = 3;</code>
         */
        public Builder clearTitle() {
          if (titleBuilder_ == null) {
            if (assetOneofCase_ == 3) {
              assetOneofCase_ = 0;
              assetOneof_ = null;
              onChanged();
            }
          } else {
            if (assetOneofCase_ == 3) {
              assetOneofCase_ = 0;
              assetOneof_ = null;
            }
            titleBuilder_.clear();
          }
          return this;
        }
        /**
         * <pre>
         * Title object for title assets.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Title title = 3;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title.Builder getTitleBuilder() {
          return getTitleFieldBuilder().getBuilder();
        }
        /**
         * <pre>
         * Title object for title assets.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Title title = 3;</code>
         */
        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.TitleOrBuilder getTitleOrBuilder() {
          if ((assetOneofCase_ == 3) && (titleBuilder_ != null)) {
            return titleBuilder_.getMessageOrBuilder();
          } else {
            if (assetOneofCase_ == 3) {
              return (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title) assetOneof_;
            }
            return com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title.getDefaultInstance();
          }
        }
        /**
         * <pre>
         * Title object for title assets.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Title title = 3;</code>
         */
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title.Builder, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.TitleOrBuilder> 
            getTitleFieldBuilder() {
          if (titleBuilder_ == null) {
            if (!(assetOneofCase_ == 3)) {
              assetOneof_ = com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title.getDefaultInstance();
            }
            titleBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
                com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title.Builder, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.TitleOrBuilder>(
                    (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Title) assetOneof_,
                    getParentForChildren(),
                    isClean());
            assetOneof_ = null;
          }
          assetOneofCase_ = 3;
          onChanged();;
          return titleBuilder_;
        }

        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image.Builder, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.ImageOrBuilder> imgBuilder_;
        /**
         * <pre>
         * Image object for image assets.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Image img = 4;</code>
         * @return Whether the img field is set.
         */
        @java.lang.Override
        public boolean hasImg() {
          return assetOneofCase_ == 4;
        }
        /**
         * <pre>
         * Image object for image assets.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Image img = 4;</code>
         * @return The img.
         */
        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image getImg() {
          if (imgBuilder_ == null) {
            if (assetOneofCase_ == 4) {
              return (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image) assetOneof_;
            }
            return com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image.getDefaultInstance();
          } else {
            if (assetOneofCase_ == 4) {
              return imgBuilder_.getMessage();
            }
            return com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image.getDefaultInstance();
          }
        }
        /**
         * <pre>
         * Image object for image assets.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Image img = 4;</code>
         */
        public Builder setImg(com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image value) {
          if (imgBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            assetOneof_ = value;
            onChanged();
          } else {
            imgBuilder_.setMessage(value);
          }
          assetOneofCase_ = 4;
          return this;
        }
        /**
         * <pre>
         * Image object for image assets.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Image img = 4;</code>
         */
        public Builder setImg(
            com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image.Builder builderForValue) {
          if (imgBuilder_ == null) {
            assetOneof_ = builderForValue.build();
            onChanged();
          } else {
            imgBuilder_.setMessage(builderForValue.build());
          }
          assetOneofCase_ = 4;
          return this;
        }
        /**
         * <pre>
         * Image object for image assets.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Image img = 4;</code>
         */
        public Builder mergeImg(com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image value) {
          if (imgBuilder_ == null) {
            if (assetOneofCase_ == 4 &&
                assetOneof_ != com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image.getDefaultInstance()) {
              assetOneof_ = com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image.newBuilder((com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image) assetOneof_)
                  .mergeFrom(value).buildPartial();
            } else {
              assetOneof_ = value;
            }
            onChanged();
          } else {
            if (assetOneofCase_ == 4) {
              imgBuilder_.mergeFrom(value);
            }
            imgBuilder_.setMessage(value);
          }
          assetOneofCase_ = 4;
          return this;
        }
        /**
         * <pre>
         * Image object for image assets.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Image img = 4;</code>
         */
        public Builder clearImg() {
          if (imgBuilder_ == null) {
            if (assetOneofCase_ == 4) {
              assetOneofCase_ = 0;
              assetOneof_ = null;
              onChanged();
            }
          } else {
            if (assetOneofCase_ == 4) {
              assetOneofCase_ = 0;
              assetOneof_ = null;
            }
            imgBuilder_.clear();
          }
          return this;
        }
        /**
         * <pre>
         * Image object for image assets.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Image img = 4;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image.Builder getImgBuilder() {
          return getImgFieldBuilder().getBuilder();
        }
        /**
         * <pre>
         * Image object for image assets.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Image img = 4;</code>
         */
        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.ImageOrBuilder getImgOrBuilder() {
          if ((assetOneofCase_ == 4) && (imgBuilder_ != null)) {
            return imgBuilder_.getMessageOrBuilder();
          } else {
            if (assetOneofCase_ == 4) {
              return (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image) assetOneof_;
            }
            return com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image.getDefaultInstance();
          }
        }
        /**
         * <pre>
         * Image object for image assets.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Image img = 4;</code>
         */
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image.Builder, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.ImageOrBuilder> 
            getImgFieldBuilder() {
          if (imgBuilder_ == null) {
            if (!(assetOneofCase_ == 4)) {
              assetOneof_ = com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image.getDefaultInstance();
            }
            imgBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
                com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image.Builder, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.ImageOrBuilder>(
                    (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Image) assetOneof_,
                    getParentForChildren(),
                    isClean());
            assetOneof_ = null;
          }
          assetOneofCase_ = 4;
          onChanged();;
          return imgBuilder_;
        }

        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video.Builder, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.VideoOrBuilder> videoBuilder_;
        /**
         * <pre>
         * Video object for video assets.
         * Note that in-stream video ads are not part of Native.
         * Native ads may contain a video as the ad creative itself.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Video video = 5;</code>
         * @return Whether the video field is set.
         */
        @java.lang.Override
        public boolean hasVideo() {
          return assetOneofCase_ == 5;
        }
        /**
         * <pre>
         * Video object for video assets.
         * Note that in-stream video ads are not part of Native.
         * Native ads may contain a video as the ad creative itself.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Video video = 5;</code>
         * @return The video.
         */
        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video getVideo() {
          if (videoBuilder_ == null) {
            if (assetOneofCase_ == 5) {
              return (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video) assetOneof_;
            }
            return com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video.getDefaultInstance();
          } else {
            if (assetOneofCase_ == 5) {
              return videoBuilder_.getMessage();
            }
            return com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video.getDefaultInstance();
          }
        }
        /**
         * <pre>
         * Video object for video assets.
         * Note that in-stream video ads are not part of Native.
         * Native ads may contain a video as the ad creative itself.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Video video = 5;</code>
         */
        public Builder setVideo(com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video value) {
          if (videoBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            assetOneof_ = value;
            onChanged();
          } else {
            videoBuilder_.setMessage(value);
          }
          assetOneofCase_ = 5;
          return this;
        }
        /**
         * <pre>
         * Video object for video assets.
         * Note that in-stream video ads are not part of Native.
         * Native ads may contain a video as the ad creative itself.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Video video = 5;</code>
         */
        public Builder setVideo(
            com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video.Builder builderForValue) {
          if (videoBuilder_ == null) {
            assetOneof_ = builderForValue.build();
            onChanged();
          } else {
            videoBuilder_.setMessage(builderForValue.build());
          }
          assetOneofCase_ = 5;
          return this;
        }
        /**
         * <pre>
         * Video object for video assets.
         * Note that in-stream video ads are not part of Native.
         * Native ads may contain a video as the ad creative itself.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Video video = 5;</code>
         */
        public Builder mergeVideo(com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video value) {
          if (videoBuilder_ == null) {
            if (assetOneofCase_ == 5 &&
                assetOneof_ != com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video.getDefaultInstance()) {
              assetOneof_ = com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video.newBuilder((com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video) assetOneof_)
                  .mergeFrom(value).buildPartial();
            } else {
              assetOneof_ = value;
            }
            onChanged();
          } else {
            if (assetOneofCase_ == 5) {
              videoBuilder_.mergeFrom(value);
            }
            videoBuilder_.setMessage(value);
          }
          assetOneofCase_ = 5;
          return this;
        }
        /**
         * <pre>
         * Video object for video assets.
         * Note that in-stream video ads are not part of Native.
         * Native ads may contain a video as the ad creative itself.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Video video = 5;</code>
         */
        public Builder clearVideo() {
          if (videoBuilder_ == null) {
            if (assetOneofCase_ == 5) {
              assetOneofCase_ = 0;
              assetOneof_ = null;
              onChanged();
            }
          } else {
            if (assetOneofCase_ == 5) {
              assetOneofCase_ = 0;
              assetOneof_ = null;
            }
            videoBuilder_.clear();
          }
          return this;
        }
        /**
         * <pre>
         * Video object for video assets.
         * Note that in-stream video ads are not part of Native.
         * Native ads may contain a video as the ad creative itself.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Video video = 5;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video.Builder getVideoBuilder() {
          return getVideoFieldBuilder().getBuilder();
        }
        /**
         * <pre>
         * Video object for video assets.
         * Note that in-stream video ads are not part of Native.
         * Native ads may contain a video as the ad creative itself.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Video video = 5;</code>
         */
        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.VideoOrBuilder getVideoOrBuilder() {
          if ((assetOneofCase_ == 5) && (videoBuilder_ != null)) {
            return videoBuilder_.getMessageOrBuilder();
          } else {
            if (assetOneofCase_ == 5) {
              return (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video) assetOneof_;
            }
            return com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video.getDefaultInstance();
          }
        }
        /**
         * <pre>
         * Video object for video assets.
         * Note that in-stream video ads are not part of Native.
         * Native ads may contain a video as the ad creative itself.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Video video = 5;</code>
         */
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video.Builder, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.VideoOrBuilder> 
            getVideoFieldBuilder() {
          if (videoBuilder_ == null) {
            if (!(assetOneofCase_ == 5)) {
              assetOneof_ = com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video.getDefaultInstance();
            }
            videoBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
                com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video.Builder, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.VideoOrBuilder>(
                    (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Video) assetOneof_,
                    getParentForChildren(),
                    isClean());
            assetOneof_ = null;
          }
          assetOneofCase_ = 5;
          onChanged();;
          return videoBuilder_;
        }

        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data.Builder, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.DataOrBuilder> dataBuilder_;
        /**
         * <pre>
         * Data object for ratings, prices etc.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Data data = 6;</code>
         * @return Whether the data field is set.
         */
        @java.lang.Override
        public boolean hasData() {
          return assetOneofCase_ == 6;
        }
        /**
         * <pre>
         * Data object for ratings, prices etc.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Data data = 6;</code>
         * @return The data.
         */
        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data getData() {
          if (dataBuilder_ == null) {
            if (assetOneofCase_ == 6) {
              return (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data) assetOneof_;
            }
            return com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data.getDefaultInstance();
          } else {
            if (assetOneofCase_ == 6) {
              return dataBuilder_.getMessage();
            }
            return com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data.getDefaultInstance();
          }
        }
        /**
         * <pre>
         * Data object for ratings, prices etc.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Data data = 6;</code>
         */
        public Builder setData(com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data value) {
          if (dataBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            assetOneof_ = value;
            onChanged();
          } else {
            dataBuilder_.setMessage(value);
          }
          assetOneofCase_ = 6;
          return this;
        }
        /**
         * <pre>
         * Data object for ratings, prices etc.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Data data = 6;</code>
         */
        public Builder setData(
            com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data.Builder builderForValue) {
          if (dataBuilder_ == null) {
            assetOneof_ = builderForValue.build();
            onChanged();
          } else {
            dataBuilder_.setMessage(builderForValue.build());
          }
          assetOneofCase_ = 6;
          return this;
        }
        /**
         * <pre>
         * Data object for ratings, prices etc.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Data data = 6;</code>
         */
        public Builder mergeData(com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data value) {
          if (dataBuilder_ == null) {
            if (assetOneofCase_ == 6 &&
                assetOneof_ != com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data.getDefaultInstance()) {
              assetOneof_ = com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data.newBuilder((com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data) assetOneof_)
                  .mergeFrom(value).buildPartial();
            } else {
              assetOneof_ = value;
            }
            onChanged();
          } else {
            if (assetOneofCase_ == 6) {
              dataBuilder_.mergeFrom(value);
            }
            dataBuilder_.setMessage(value);
          }
          assetOneofCase_ = 6;
          return this;
        }
        /**
         * <pre>
         * Data object for ratings, prices etc.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Data data = 6;</code>
         */
        public Builder clearData() {
          if (dataBuilder_ == null) {
            if (assetOneofCase_ == 6) {
              assetOneofCase_ = 0;
              assetOneof_ = null;
              onChanged();
            }
          } else {
            if (assetOneofCase_ == 6) {
              assetOneofCase_ = 0;
              assetOneof_ = null;
            }
            dataBuilder_.clear();
          }
          return this;
        }
        /**
         * <pre>
         * Data object for ratings, prices etc.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Data data = 6;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data.Builder getDataBuilder() {
          return getDataFieldBuilder().getBuilder();
        }
        /**
         * <pre>
         * Data object for ratings, prices etc.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Data data = 6;</code>
         */
        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.DataOrBuilder getDataOrBuilder() {
          if ((assetOneofCase_ == 6) && (dataBuilder_ != null)) {
            return dataBuilder_.getMessageOrBuilder();
          } else {
            if (assetOneofCase_ == 6) {
              return (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data) assetOneof_;
            }
            return com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data.getDefaultInstance();
          }
        }
        /**
         * <pre>
         * Data object for ratings, prices etc.
         * </pre>
         *
         * <code>.com.iabtechlab.openrtb.v2.NativeResponse.Asset.Data data = 6;</code>
         */
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data.Builder, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.DataOrBuilder> 
            getDataFieldBuilder() {
          if (dataBuilder_ == null) {
            if (!(assetOneofCase_ == 6)) {
              assetOneof_ = com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data.getDefaultInstance();
            }
            dataBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
                com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data.Builder, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.DataOrBuilder>(
                    (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Data) assetOneof_,
                    getParentForChildren(),
                    isClean());
            assetOneof_ = null;
          }
          assetOneofCase_ = 6;
          onChanged();;
          return dataBuilder_;
        }

        private com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link link_;
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link.Builder, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.LinkOrBuilder> linkBuilder_;
        /**
         * <pre>
         * Link object for call to actions.
         * This link object applies if the asset item is activated (clicked).
         * If there is no link object on the asset, the parent link object on the
         * bid response apply.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.NativeResponse.Link link = 7;</code>
         * @return Whether the link field is set.
         */
        public boolean hasLink() {
          return ((bitField0_ & 0x00000040) != 0);
        }
        /**
         * <pre>
         * Link object for call to actions.
         * This link object applies if the asset item is activated (clicked).
         * If there is no link object on the asset, the parent link object on the
         * bid response apply.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.NativeResponse.Link link = 7;</code>
         * @return The link.
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link getLink() {
          if (linkBuilder_ == null) {
            return link_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link.getDefaultInstance() : link_;
          } else {
            return linkBuilder_.getMessage();
          }
        }
        /**
         * <pre>
         * Link object for call to actions.
         * This link object applies if the asset item is activated (clicked).
         * If there is no link object on the asset, the parent link object on the
         * bid response apply.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.NativeResponse.Link link = 7;</code>
         */
        public Builder setLink(com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link value) {
          if (linkBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            link_ = value;
            onChanged();
          } else {
            linkBuilder_.setMessage(value);
          }
          bitField0_ |= 0x00000040;
          return this;
        }
        /**
         * <pre>
         * Link object for call to actions.
         * This link object applies if the asset item is activated (clicked).
         * If there is no link object on the asset, the parent link object on the
         * bid response apply.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.NativeResponse.Link link = 7;</code>
         */
        public Builder setLink(
            com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link.Builder builderForValue) {
          if (linkBuilder_ == null) {
            link_ = builderForValue.build();
            onChanged();
          } else {
            linkBuilder_.setMessage(builderForValue.build());
          }
          bitField0_ |= 0x00000040;
          return this;
        }
        /**
         * <pre>
         * Link object for call to actions.
         * This link object applies if the asset item is activated (clicked).
         * If there is no link object on the asset, the parent link object on the
         * bid response apply.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.NativeResponse.Link link = 7;</code>
         */
        public Builder mergeLink(com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link value) {
          if (linkBuilder_ == null) {
            if (((bitField0_ & 0x00000040) != 0) &&
                link_ != null &&
                link_ != com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link.getDefaultInstance()) {
              link_ =
                com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link.newBuilder(link_).mergeFrom(value).buildPartial();
            } else {
              link_ = value;
            }
            onChanged();
          } else {
            linkBuilder_.mergeFrom(value);
          }
          bitField0_ |= 0x00000040;
          return this;
        }
        /**
         * <pre>
         * Link object for call to actions.
         * This link object applies if the asset item is activated (clicked).
         * If there is no link object on the asset, the parent link object on the
         * bid response apply.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.NativeResponse.Link link = 7;</code>
         */
        public Builder clearLink() {
          if (linkBuilder_ == null) {
            link_ = null;
            onChanged();
          } else {
            linkBuilder_.clear();
          }
          bitField0_ = (bitField0_ & ~0x00000040);
          return this;
        }
        /**
         * <pre>
         * Link object for call to actions.
         * This link object applies if the asset item is activated (clicked).
         * If there is no link object on the asset, the parent link object on the
         * bid response apply.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.NativeResponse.Link link = 7;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link.Builder getLinkBuilder() {
          bitField0_ |= 0x00000040;
          onChanged();
          return getLinkFieldBuilder().getBuilder();
        }
        /**
         * <pre>
         * Link object for call to actions.
         * This link object applies if the asset item is activated (clicked).
         * If there is no link object on the asset, the parent link object on the
         * bid response apply.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.NativeResponse.Link link = 7;</code>
         */
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.LinkOrBuilder getLinkOrBuilder() {
          if (linkBuilder_ != null) {
            return linkBuilder_.getMessageOrBuilder();
          } else {
            return link_ == null ?
                com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link.getDefaultInstance() : link_;
          }
        }
        /**
         * <pre>
         * Link object for call to actions.
         * This link object applies if the asset item is activated (clicked).
         * If there is no link object on the asset, the parent link object on the
         * bid response apply.
         * </pre>
         *
         * <code>optional .com.iabtechlab.openrtb.v2.NativeResponse.Link link = 7;</code>
         */
        private com.google.protobuf.SingleFieldBuilderV3<
            com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link.Builder, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.LinkOrBuilder> 
            getLinkFieldBuilder() {
          if (linkBuilder_ == null) {
            linkBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
                com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link.Builder, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.LinkOrBuilder>(
                    getLink(),
                    getParentForChildren(),
                    isClean());
            link_ = null;
          }
          return linkBuilder_;
        }
        @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:com.iabtechlab.openrtb.v2.NativeResponse.Asset)
      }

      // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.NativeResponse.Asset)
      private static final com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset DEFAULT_INSTANCE;
      static {
        DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset();
      }

      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset getDefaultInstance() {
        return DEFAULT_INSTANCE;
      }

      @java.lang.Deprecated public static final com.google.protobuf.Parser<Asset>
          PARSER = new com.google.protobuf.AbstractParser<Asset>() {
        @java.lang.Override
        public Asset parsePartialFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return new Asset(input, extensionRegistry);
        }
      };

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

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

      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset getDefaultInstanceForType() {
        return DEFAULT_INSTANCE;
      }

    }

    public interface EventTrackerOrBuilder extends
        // @@protoc_insertion_point(interface_extends:com.iabtechlab.openrtb.v2.NativeResponse.EventTracker)
        com.google.protobuf.GeneratedMessageV3.
            ExtendableMessageOrBuilder<EventTracker> {

      /**
       * <pre>
       * Type of event to track.
       * Refer to enum com.iabtechlab.adcom.v1.EventType for generic values.
       * REQUIRED if embedded asset is being used.
       * </pre>
       *
       * <code>optional int32 event = 1;</code>
       * @return Whether the event field is set.
       */
      boolean hasEvent();
      /**
       * <pre>
       * Type of event to track.
       * Refer to enum com.iabtechlab.adcom.v1.EventType for generic values.
       * REQUIRED if embedded asset is being used.
       * </pre>
       *
       * <code>optional int32 event = 1;</code>
       * @return The event.
       */
      int getEvent();

      /**
       * <pre>
       * Type of tracking requested.
       * Refer to enum com.iabtechlab.adcom.v1.enums.EventTrackingMethod for generic values.
       * REQUIRED if embedded asset is being used.
       * </pre>
       *
       * <code>required int32 method = 2;</code>
       * @return Whether the method field is set.
       */
      boolean hasMethod();
      /**
       * <pre>
       * Type of tracking requested.
       * Refer to enum com.iabtechlab.adcom.v1.enums.EventTrackingMethod for generic values.
       * REQUIRED if embedded asset is being used.
       * </pre>
       *
       * <code>required int32 method = 2;</code>
       * @return The method.
       */
      int getMethod();

      /**
       * <pre>
       * The URL of the image or js.
       * REQUIRED for image or js, optional for custom.
       * </pre>
       *
       * <code>optional string url = 3;</code>
       * @return Whether the url field is set.
       */
      boolean hasUrl();
      /**
       * <pre>
       * The URL of the image or js.
       * REQUIRED for image or js, optional for custom.
       * </pre>
       *
       * <code>optional string url = 3;</code>
       * @return The url.
       */
      java.lang.String getUrl();
      /**
       * <pre>
       * The URL of the image or js.
       * REQUIRED for image or js, optional for custom.
       * </pre>
       *
       * <code>optional string url = 3;</code>
       * @return The bytes for url.
       */
      com.google.protobuf.ByteString
          getUrlBytes();
    }
    /**
     * <pre>
     * OpenRTB Native 1.2: The event trackers response is an array of objects and
     * specifies the types of events the bidder wishes to track and the
     * URLs/information to track them. Bidder must only respond with methods
     * indicated as available in the request. Note that most javascript trackers
     * expect to be loaded at impression time, so it's not generally recommended
     * for the buyer to respond with javascript trackers on other events, but the
     * appropriateness of this is up to each buyer.
     * </pre>
     *
     * Protobuf type {@code com.iabtechlab.openrtb.v2.NativeResponse.EventTracker}
     */
    public static final class EventTracker extends
        com.google.protobuf.GeneratedMessageV3.ExtendableMessage<
          EventTracker> implements
        // @@protoc_insertion_point(message_implements:com.iabtechlab.openrtb.v2.NativeResponse.EventTracker)
        EventTrackerOrBuilder {
    private static final long serialVersionUID = 0L;
      // Use EventTracker.newBuilder() to construct.
      private EventTracker(com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker, ?> builder) {
        super(builder);
      }
      private EventTracker() {
        url_ = "";
      }

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

      @java.lang.Override
      public final com.google.protobuf.UnknownFieldSet
      getUnknownFields() {
        return this.unknownFields;
      }
      private EventTracker(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        this();
        if (extensionRegistry == null) {
          throw new java.lang.NullPointerException();
        }
        int mutable_bitField0_ = 0;
        com.google.protobuf.UnknownFieldSet.Builder unknownFields =
            com.google.protobuf.UnknownFieldSet.newBuilder();
        try {
          boolean done = false;
          while (!done) {
            int tag = input.readTag();
            switch (tag) {
              case 0:
                done = true;
                break;
              case 8: {
                bitField0_ |= 0x00000001;
                event_ = input.readInt32();
                break;
              }
              case 16: {
                bitField0_ |= 0x00000002;
                method_ = input.readInt32();
                break;
              }
              case 26: {
                com.google.protobuf.ByteString bs = input.readBytes();
                bitField0_ |= 0x00000004;
                url_ = bs;
                break;
              }
              default: {
                if (!parseUnknownField(
                    input, unknownFields, extensionRegistry, tag)) {
                  done = true;
                }
                break;
              }
            }
          }
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          throw e.setUnfinishedMessage(this);
        } catch (java.io.IOException e) {
          throw new com.google.protobuf.InvalidProtocolBufferException(
              e).setUnfinishedMessage(this);
        } finally {
          this.unknownFields = unknownFields.build();
          makeExtensionsImmutable();
        }
      }
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeResponse_EventTracker_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeResponse_EventTracker_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker.class, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker.Builder.class);
      }

      private int bitField0_;
      public static final int EVENT_FIELD_NUMBER = 1;
      private int event_;
      /**
       * <pre>
       * Type of event to track.
       * Refer to enum com.iabtechlab.adcom.v1.EventType for generic values.
       * REQUIRED if embedded asset is being used.
       * </pre>
       *
       * <code>optional int32 event = 1;</code>
       * @return Whether the event field is set.
       */
      @java.lang.Override
      public boolean hasEvent() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <pre>
       * Type of event to track.
       * Refer to enum com.iabtechlab.adcom.v1.EventType for generic values.
       * REQUIRED if embedded asset is being used.
       * </pre>
       *
       * <code>optional int32 event = 1;</code>
       * @return The event.
       */
      @java.lang.Override
      public int getEvent() {
        return event_;
      }

      public static final int METHOD_FIELD_NUMBER = 2;
      private int method_;
      /**
       * <pre>
       * Type of tracking requested.
       * Refer to enum com.iabtechlab.adcom.v1.enums.EventTrackingMethod for generic values.
       * REQUIRED if embedded asset is being used.
       * </pre>
       *
       * <code>required int32 method = 2;</code>
       * @return Whether the method field is set.
       */
      @java.lang.Override
      public boolean hasMethod() {
        return ((bitField0_ & 0x00000002) != 0);
      }
      /**
       * <pre>
       * Type of tracking requested.
       * Refer to enum com.iabtechlab.adcom.v1.enums.EventTrackingMethod for generic values.
       * REQUIRED if embedded asset is being used.
       * </pre>
       *
       * <code>required int32 method = 2;</code>
       * @return The method.
       */
      @java.lang.Override
      public int getMethod() {
        return method_;
      }

      public static final int URL_FIELD_NUMBER = 3;
      private volatile java.lang.Object url_;
      /**
       * <pre>
       * The URL of the image or js.
       * REQUIRED for image or js, optional for custom.
       * </pre>
       *
       * <code>optional string url = 3;</code>
       * @return Whether the url field is set.
       */
      @java.lang.Override
      public boolean hasUrl() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <pre>
       * The URL of the image or js.
       * REQUIRED for image or js, optional for custom.
       * </pre>
       *
       * <code>optional string url = 3;</code>
       * @return The url.
       */
      @java.lang.Override
      public java.lang.String getUrl() {
        java.lang.Object ref = url_;
        if (ref instanceof java.lang.String) {
          return (java.lang.String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            url_ = s;
          }
          return s;
        }
      }
      /**
       * <pre>
       * The URL of the image or js.
       * REQUIRED for image or js, optional for custom.
       * </pre>
       *
       * <code>optional string url = 3;</code>
       * @return The bytes for url.
       */
      @java.lang.Override
      public com.google.protobuf.ByteString
          getUrlBytes() {
        java.lang.Object ref = url_;
        if (ref instanceof java.lang.String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          url_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }

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

        if (!hasMethod()) {
          memoizedIsInitialized = 0;
          return false;
        }
        if (!extensionsAreInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
        memoizedIsInitialized = 1;
        return true;
      }

      @java.lang.Override
      public void writeTo(com.google.protobuf.CodedOutputStream output)
                          throws java.io.IOException {
        com.google.protobuf.GeneratedMessageV3
          .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker>.ExtensionWriter
            extensionWriter = newExtensionWriter();
        if (((bitField0_ & 0x00000001) != 0)) {
          output.writeInt32(1, event_);
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          output.writeInt32(2, method_);
        }
        if (((bitField0_ & 0x00000004) != 0)) {
          com.google.protobuf.GeneratedMessageV3.writeString(output, 3, url_);
        }
        extensionWriter.writeUntil(10000, output);
        unknownFields.writeTo(output);
      }

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

        size = 0;
        if (((bitField0_ & 0x00000001) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeInt32Size(1, event_);
        }
        if (((bitField0_ & 0x00000002) != 0)) {
          size += com.google.protobuf.CodedOutputStream
            .computeInt32Size(2, method_);
        }
        if (((bitField0_ & 0x00000004) != 0)) {
          size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, url_);
        }
        size += extensionsSerializedSize();
        size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker)) {
          return super.equals(obj);
        }
        com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker other = (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker) obj;

        if (hasEvent() != other.hasEvent()) return false;
        if (hasEvent()) {
          if (getEvent()
              != other.getEvent()) return false;
        }
        if (hasMethod() != other.hasMethod()) return false;
        if (hasMethod()) {
          if (getMethod()
              != other.getMethod()) return false;
        }
        if (hasUrl() != other.hasUrl()) return false;
        if (hasUrl()) {
          if (!getUrl()
              .equals(other.getUrl())) return false;
        }
        if (!unknownFields.equals(other.unknownFields)) return false;
        if (!getExtensionFields().equals(other.getExtensionFields()))
          return false;
        return true;
      }

      @java.lang.Override
      public int hashCode() {
        if (memoizedHashCode != 0) {
          return memoizedHashCode;
        }
        int hash = 41;
        hash = (19 * hash) + getDescriptor().hashCode();
        if (hasEvent()) {
          hash = (37 * hash) + EVENT_FIELD_NUMBER;
          hash = (53 * hash) + getEvent();
        }
        if (hasMethod()) {
          hash = (37 * hash) + METHOD_FIELD_NUMBER;
          hash = (53 * hash) + getMethod();
        }
        if (hasUrl()) {
          hash = (37 * hash) + URL_FIELD_NUMBER;
          hash = (53 * hash) + getUrl().hashCode();
        }
        hash = hashFields(hash, getExtensionFields());
        hash = (29 * hash) + unknownFields.hashCode();
        memoizedHashCode = hash;
        return hash;
      }

      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker parseFrom(
          java.nio.ByteBuffer data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker parseFrom(
          java.nio.ByteBuffer data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker parseFrom(
          com.google.protobuf.ByteString data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker parseFrom(
          com.google.protobuf.ByteString data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker parseFrom(byte[] data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker parseFrom(
          byte[] data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return PARSER.parseFrom(data, extensionRegistry);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker parseFrom(java.io.InputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker 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.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker parseDelimitedFrom(java.io.InputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseDelimitedWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker 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.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker parseFrom(
          com.google.protobuf.CodedInputStream input)
          throws java.io.IOException {
        return com.google.protobuf.GeneratedMessageV3
            .parseWithIOException(PARSER, input);
      }
      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker 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.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker 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>
       * OpenRTB Native 1.2: The event trackers response is an array of objects and
       * specifies the types of events the bidder wishes to track and the
       * URLs/information to track them. Bidder must only respond with methods
       * indicated as available in the request. Note that most javascript trackers
       * expect to be loaded at impression time, so it's not generally recommended
       * for the buyer to respond with javascript trackers on other events, but the
       * appropriateness of this is up to each buyer.
       * </pre>
       *
       * Protobuf type {@code com.iabtechlab.openrtb.v2.NativeResponse.EventTracker}
       */
      public static final class Builder extends
          com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
            com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker, Builder> implements
          // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.NativeResponse.EventTracker)
          com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTrackerOrBuilder {
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeResponse_EventTracker_descriptor;
        }

        @java.lang.Override
        protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
            internalGetFieldAccessorTable() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeResponse_EventTracker_fieldAccessorTable
              .ensureFieldAccessorsInitialized(
                  com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker.class, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker.Builder.class);
        }

        // Construct using com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker.newBuilder()
        private Builder() {
          maybeForceBuilderInitialization();
        }

        private Builder(
            com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
          super(parent);
          maybeForceBuilderInitialization();
        }
        private void maybeForceBuilderInitialization() {
          if (com.google.protobuf.GeneratedMessageV3
                  .alwaysUseFieldBuilders) {
          }
        }
        @java.lang.Override
        public Builder clear() {
          super.clear();
          event_ = 0;
          bitField0_ = (bitField0_ & ~0x00000001);
          method_ = 0;
          bitField0_ = (bitField0_ & ~0x00000002);
          url_ = "";
          bitField0_ = (bitField0_ & ~0x00000004);
          return this;
        }

        @java.lang.Override
        public com.google.protobuf.Descriptors.Descriptor
            getDescriptorForType() {
          return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeResponse_EventTracker_descriptor;
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker getDefaultInstanceForType() {
          return com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker.getDefaultInstance();
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker build() {
          com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker result = buildPartial();
          if (!result.isInitialized()) {
            throw newUninitializedMessageException(result);
          }
          return result;
        }

        @java.lang.Override
        public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker buildPartial() {
          com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker result = new com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker(this);
          int from_bitField0_ = bitField0_;
          int to_bitField0_ = 0;
          if (((from_bitField0_ & 0x00000001) != 0)) {
            result.event_ = event_;
            to_bitField0_ |= 0x00000001;
          }
          if (((from_bitField0_ & 0x00000002) != 0)) {
            result.method_ = method_;
            to_bitField0_ |= 0x00000002;
          }
          if (((from_bitField0_ & 0x00000004) != 0)) {
            to_bitField0_ |= 0x00000004;
          }
          result.url_ = url_;
          result.bitField0_ = to_bitField0_;
          onBuilt();
          return result;
        }

        @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 <Type> Builder setExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker, Type> extension,
            Type value) {
          return super.setExtension(extension, value);
        }
        @java.lang.Override
        public <Type> Builder setExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker, java.util.List<Type>> extension,
            int index, Type value) {
          return super.setExtension(extension, index, value);
        }
        @java.lang.Override
        public <Type> Builder addExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker, java.util.List<Type>> extension,
            Type value) {
          return super.addExtension(extension, value);
        }
        @java.lang.Override
        public <Type> Builder clearExtension(
            com.google.protobuf.GeneratedMessage.GeneratedExtension<
                com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker, ?> extension) {
          return super.clearExtension(extension);
        }
        @java.lang.Override
        public Builder mergeFrom(com.google.protobuf.Message other) {
          if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker) {
            return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker)other);
          } else {
            super.mergeFrom(other);
            return this;
          }
        }

        public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker other) {
          if (other == com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker.getDefaultInstance()) return this;
          if (other.hasEvent()) {
            setEvent(other.getEvent());
          }
          if (other.hasMethod()) {
            setMethod(other.getMethod());
          }
          if (other.hasUrl()) {
            bitField0_ |= 0x00000004;
            url_ = other.url_;
            onChanged();
          }
          this.mergeExtensionFields(other);
          this.mergeUnknownFields(other.unknownFields);
          onChanged();
          return this;
        }

        @java.lang.Override
        public final boolean isInitialized() {
          if (!hasMethod()) {
            return false;
          }
          if (!extensionsAreInitialized()) {
            return false;
          }
          return true;
        }

        @java.lang.Override
        public Builder mergeFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws java.io.IOException {
          com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker parsedMessage = null;
          try {
            parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
          } catch (com.google.protobuf.InvalidProtocolBufferException e) {
            parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker) e.getUnfinishedMessage();
            throw e.unwrapIOException();
          } finally {
            if (parsedMessage != null) {
              mergeFrom(parsedMessage);
            }
          }
          return this;
        }
        private int bitField0_;

        private int event_ ;
        /**
         * <pre>
         * Type of event to track.
         * Refer to enum com.iabtechlab.adcom.v1.EventType for generic values.
         * REQUIRED if embedded asset is being used.
         * </pre>
         *
         * <code>optional int32 event = 1;</code>
         * @return Whether the event field is set.
         */
        @java.lang.Override
        public boolean hasEvent() {
          return ((bitField0_ & 0x00000001) != 0);
        }
        /**
         * <pre>
         * Type of event to track.
         * Refer to enum com.iabtechlab.adcom.v1.EventType for generic values.
         * REQUIRED if embedded asset is being used.
         * </pre>
         *
         * <code>optional int32 event = 1;</code>
         * @return The event.
         */
        @java.lang.Override
        public int getEvent() {
          return event_;
        }
        /**
         * <pre>
         * Type of event to track.
         * Refer to enum com.iabtechlab.adcom.v1.EventType for generic values.
         * REQUIRED if embedded asset is being used.
         * </pre>
         *
         * <code>optional int32 event = 1;</code>
         * @param value The event to set.
         * @return This builder for chaining.
         */
        public Builder setEvent(int value) {
          bitField0_ |= 0x00000001;
          event_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Type of event to track.
         * Refer to enum com.iabtechlab.adcom.v1.EventType for generic values.
         * REQUIRED if embedded asset is being used.
         * </pre>
         *
         * <code>optional int32 event = 1;</code>
         * @return This builder for chaining.
         */
        public Builder clearEvent() {
          bitField0_ = (bitField0_ & ~0x00000001);
          event_ = 0;
          onChanged();
          return this;
        }

        private int method_ ;
        /**
         * <pre>
         * Type of tracking requested.
         * Refer to enum com.iabtechlab.adcom.v1.enums.EventTrackingMethod for generic values.
         * REQUIRED if embedded asset is being used.
         * </pre>
         *
         * <code>required int32 method = 2;</code>
         * @return Whether the method field is set.
         */
        @java.lang.Override
        public boolean hasMethod() {
          return ((bitField0_ & 0x00000002) != 0);
        }
        /**
         * <pre>
         * Type of tracking requested.
         * Refer to enum com.iabtechlab.adcom.v1.enums.EventTrackingMethod for generic values.
         * REQUIRED if embedded asset is being used.
         * </pre>
         *
         * <code>required int32 method = 2;</code>
         * @return The method.
         */
        @java.lang.Override
        public int getMethod() {
          return method_;
        }
        /**
         * <pre>
         * Type of tracking requested.
         * Refer to enum com.iabtechlab.adcom.v1.enums.EventTrackingMethod for generic values.
         * REQUIRED if embedded asset is being used.
         * </pre>
         *
         * <code>required int32 method = 2;</code>
         * @param value The method to set.
         * @return This builder for chaining.
         */
        public Builder setMethod(int value) {
          bitField0_ |= 0x00000002;
          method_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * Type of tracking requested.
         * Refer to enum com.iabtechlab.adcom.v1.enums.EventTrackingMethod for generic values.
         * REQUIRED if embedded asset is being used.
         * </pre>
         *
         * <code>required int32 method = 2;</code>
         * @return This builder for chaining.
         */
        public Builder clearMethod() {
          bitField0_ = (bitField0_ & ~0x00000002);
          method_ = 0;
          onChanged();
          return this;
        }

        private java.lang.Object url_ = "";
        /**
         * <pre>
         * The URL of the image or js.
         * REQUIRED for image or js, optional for custom.
         * </pre>
         *
         * <code>optional string url = 3;</code>
         * @return Whether the url field is set.
         */
        public boolean hasUrl() {
          return ((bitField0_ & 0x00000004) != 0);
        }
        /**
         * <pre>
         * The URL of the image or js.
         * REQUIRED for image or js, optional for custom.
         * </pre>
         *
         * <code>optional string url = 3;</code>
         * @return The url.
         */
        public java.lang.String getUrl() {
          java.lang.Object ref = url_;
          if (!(ref instanceof java.lang.String)) {
            com.google.protobuf.ByteString bs =
                (com.google.protobuf.ByteString) ref;
            java.lang.String s = bs.toStringUtf8();
            if (bs.isValidUtf8()) {
              url_ = s;
            }
            return s;
          } else {
            return (java.lang.String) ref;
          }
        }
        /**
         * <pre>
         * The URL of the image or js.
         * REQUIRED for image or js, optional for custom.
         * </pre>
         *
         * <code>optional string url = 3;</code>
         * @return The bytes for url.
         */
        public com.google.protobuf.ByteString
            getUrlBytes() {
          java.lang.Object ref = url_;
          if (ref instanceof String) {
            com.google.protobuf.ByteString b = 
                com.google.protobuf.ByteString.copyFromUtf8(
                    (java.lang.String) ref);
            url_ = b;
            return b;
          } else {
            return (com.google.protobuf.ByteString) ref;
          }
        }
        /**
         * <pre>
         * The URL of the image or js.
         * REQUIRED for image or js, optional for custom.
         * </pre>
         *
         * <code>optional string url = 3;</code>
         * @param value The url to set.
         * @return This builder for chaining.
         */
        public Builder setUrl(
            java.lang.String value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
          url_ = value;
          onChanged();
          return this;
        }
        /**
         * <pre>
         * The URL of the image or js.
         * REQUIRED for image or js, optional for custom.
         * </pre>
         *
         * <code>optional string url = 3;</code>
         * @return This builder for chaining.
         */
        public Builder clearUrl() {
          bitField0_ = (bitField0_ & ~0x00000004);
          url_ = getDefaultInstance().getUrl();
          onChanged();
          return this;
        }
        /**
         * <pre>
         * The URL of the image or js.
         * REQUIRED for image or js, optional for custom.
         * </pre>
         *
         * <code>optional string url = 3;</code>
         * @param value The bytes for url to set.
         * @return This builder for chaining.
         */
        public Builder setUrlBytes(
            com.google.protobuf.ByteString value) {
          if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
          url_ = value;
          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:com.iabtechlab.openrtb.v2.NativeResponse.EventTracker)
      }

      // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.NativeResponse.EventTracker)
      private static final com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker DEFAULT_INSTANCE;
      static {
        DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker();
      }

      public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker getDefaultInstance() {
        return DEFAULT_INSTANCE;
      }

      @java.lang.Deprecated public static final com.google.protobuf.Parser<EventTracker>
          PARSER = new com.google.protobuf.AbstractParser<EventTracker>() {
        @java.lang.Override
        public EventTracker parsePartialFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws com.google.protobuf.InvalidProtocolBufferException {
          return new EventTracker(input, extensionRegistry);
        }
      };

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

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

      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker getDefaultInstanceForType() {
        return DEFAULT_INSTANCE;
      }

    }

    private int bitField0_;
    public static final int VER_FIELD_NUMBER = 1;
    private volatile java.lang.Object ver_;
    /**
     * <pre>
     * Version of the Native Markup version in use.
     * RECOMMENDED in 1.2
     * </pre>
     *
     * <code>optional string ver = 1;</code>
     * @return Whether the ver field is set.
     */
    @java.lang.Override
    public boolean hasVer() {
      return ((bitField0_ & 0x00000001) != 0);
    }
    /**
     * <pre>
     * Version of the Native Markup version in use.
     * RECOMMENDED in 1.2
     * </pre>
     *
     * <code>optional string ver = 1;</code>
     * @return The ver.
     */
    @java.lang.Override
    public java.lang.String getVer() {
      java.lang.Object ref = ver_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          ver_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * Version of the Native Markup version in use.
     * RECOMMENDED in 1.2
     * </pre>
     *
     * <code>optional string ver = 1;</code>
     * @return The bytes for ver.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getVerBytes() {
      java.lang.Object ref = ver_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        ver_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int ASSETS_FIELD_NUMBER = 2;
    private java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset> assets_;
    /**
     * <pre>
     * List of native ad's assets.
     * RECOMMENDED in 1.0, 1.1, or in 1.2 as a fallback if assetsurl is provided.
     * REQUIRED in 1.2, if not assetsurl is provided.
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.Asset assets = 2;</code>
     */
    @java.lang.Override
    public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset> getAssetsList() {
      return assets_;
    }
    /**
     * <pre>
     * List of native ad's assets.
     * RECOMMENDED in 1.0, 1.1, or in 1.2 as a fallback if assetsurl is provided.
     * REQUIRED in 1.2, if not assetsurl is provided.
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.Asset assets = 2;</code>
     */
    @java.lang.Override
    public java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.AssetOrBuilder> 
        getAssetsOrBuilderList() {
      return assets_;
    }
    /**
     * <pre>
     * List of native ad's assets.
     * RECOMMENDED in 1.0, 1.1, or in 1.2 as a fallback if assetsurl is provided.
     * REQUIRED in 1.2, if not assetsurl is provided.
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.Asset assets = 2;</code>
     */
    @java.lang.Override
    public int getAssetsCount() {
      return assets_.size();
    }
    /**
     * <pre>
     * List of native ad's assets.
     * RECOMMENDED in 1.0, 1.1, or in 1.2 as a fallback if assetsurl is provided.
     * REQUIRED in 1.2, if not assetsurl is provided.
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.Asset assets = 2;</code>
     */
    @java.lang.Override
    public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset getAssets(int index) {
      return assets_.get(index);
    }
    /**
     * <pre>
     * List of native ad's assets.
     * RECOMMENDED in 1.0, 1.1, or in 1.2 as a fallback if assetsurl is provided.
     * REQUIRED in 1.2, if not assetsurl is provided.
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.Asset assets = 2;</code>
     */
    @java.lang.Override
    public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.AssetOrBuilder getAssetsOrBuilder(
        int index) {
      return assets_.get(index);
    }

    public static final int ASSETSURL_FIELD_NUMBER = 6;
    private volatile java.lang.Object assetsurl_;
    /**
     * <pre>
     * URL of alternate source for the assets object. The expected response is a
     * JSON object mirroring the asset object in the bid response, subject to
     * certain requirements as specified in the individual objects.
     * Where present, overrides the assets object in the response.
     * Implemented in 1.2
     * </pre>
     *
     * <code>optional string assetsurl = 6;</code>
     * @return Whether the assetsurl field is set.
     */
    @java.lang.Override
    public boolean hasAssetsurl() {
      return ((bitField0_ & 0x00000002) != 0);
    }
    /**
     * <pre>
     * URL of alternate source for the assets object. The expected response is a
     * JSON object mirroring the asset object in the bid response, subject to
     * certain requirements as specified in the individual objects.
     * Where present, overrides the assets object in the response.
     * Implemented in 1.2
     * </pre>
     *
     * <code>optional string assetsurl = 6;</code>
     * @return The assetsurl.
     */
    @java.lang.Override
    public java.lang.String getAssetsurl() {
      java.lang.Object ref = assetsurl_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          assetsurl_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * URL of alternate source for the assets object. The expected response is a
     * JSON object mirroring the asset object in the bid response, subject to
     * certain requirements as specified in the individual objects.
     * Where present, overrides the assets object in the response.
     * Implemented in 1.2
     * </pre>
     *
     * <code>optional string assetsurl = 6;</code>
     * @return The bytes for assetsurl.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getAssetsurlBytes() {
      java.lang.Object ref = assetsurl_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        assetsurl_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int DCOURL_FIELD_NUMBER = 7;
    private volatile java.lang.Object dcourl_;
    /**
     * <pre>
     * URL where a dynamic creative specification may be found for populating this
     * ad, per the Dynamic Content Ads Specification.
     * Note this is a beta option as the interpretation of the Dynamic Content Ads
     * Specification and how to assign those elementes into a native ad is outside
     * the scope of this spec and must be agreed offline between parties or as may
     * be specified in a future revision of the Dynamic Content Ads spec.
     * Where present, overrides the assets object in the response.
     * Implemented in 1.2
     * </pre>
     *
     * <code>optional string dcourl = 7;</code>
     * @return Whether the dcourl field is set.
     */
    @java.lang.Override
    public boolean hasDcourl() {
      return ((bitField0_ & 0x00000004) != 0);
    }
    /**
     * <pre>
     * URL where a dynamic creative specification may be found for populating this
     * ad, per the Dynamic Content Ads Specification.
     * Note this is a beta option as the interpretation of the Dynamic Content Ads
     * Specification and how to assign those elementes into a native ad is outside
     * the scope of this spec and must be agreed offline between parties or as may
     * be specified in a future revision of the Dynamic Content Ads spec.
     * Where present, overrides the assets object in the response.
     * Implemented in 1.2
     * </pre>
     *
     * <code>optional string dcourl = 7;</code>
     * @return The dcourl.
     */
    @java.lang.Override
    public java.lang.String getDcourl() {
      java.lang.Object ref = dcourl_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          dcourl_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * URL where a dynamic creative specification may be found for populating this
     * ad, per the Dynamic Content Ads Specification.
     * Note this is a beta option as the interpretation of the Dynamic Content Ads
     * Specification and how to assign those elementes into a native ad is outside
     * the scope of this spec and must be agreed offline between parties or as may
     * be specified in a future revision of the Dynamic Content Ads spec.
     * Where present, overrides the assets object in the response.
     * Implemented in 1.2
     * </pre>
     *
     * <code>optional string dcourl = 7;</code>
     * @return The bytes for dcourl.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getDcourlBytes() {
      java.lang.Object ref = dcourl_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        dcourl_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int LINK_FIELD_NUMBER = 3;
    private com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link link_;
    /**
     * <pre>
     * Destination Link. This is default link object for the ad.
     * Individual assets can also have a link object which applies if the asset is
     * activated (clicked). If the asset doesn't have a link object, the parent
     * link object applies.
     * See ResponseLink definition.
     * REQUIRED by the OpenRTB Native specification.
     * </pre>
     *
     * <code>required .com.iabtechlab.openrtb.v2.NativeResponse.Link link = 3;</code>
     * @return Whether the link field is set.
     */
    @java.lang.Override
    public boolean hasLink() {
      return ((bitField0_ & 0x00000008) != 0);
    }
    /**
     * <pre>
     * Destination Link. This is default link object for the ad.
     * Individual assets can also have a link object which applies if the asset is
     * activated (clicked). If the asset doesn't have a link object, the parent
     * link object applies.
     * See ResponseLink definition.
     * REQUIRED by the OpenRTB Native specification.
     * </pre>
     *
     * <code>required .com.iabtechlab.openrtb.v2.NativeResponse.Link link = 3;</code>
     * @return The link.
     */
    @java.lang.Override
    public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link getLink() {
      return link_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link.getDefaultInstance() : link_;
    }
    /**
     * <pre>
     * Destination Link. This is default link object for the ad.
     * Individual assets can also have a link object which applies if the asset is
     * activated (clicked). If the asset doesn't have a link object, the parent
     * link object applies.
     * See ResponseLink definition.
     * REQUIRED by the OpenRTB Native specification.
     * </pre>
     *
     * <code>required .com.iabtechlab.openrtb.v2.NativeResponse.Link link = 3;</code>
     */
    @java.lang.Override
    public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.LinkOrBuilder getLinkOrBuilder() {
      return link_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link.getDefaultInstance() : link_;
    }

    public static final int IMPTRACKERS_FIELD_NUMBER = 4;
    private com.google.protobuf.LazyStringList imptrackers_;
    /**
     * <pre>
     * Array of impression tracking URLs, expected to return a 1x1 image or
     * 204 response - typically only passed when using 3rd party trackers.
     * To be deprecated in 1.2 - Replaced with EventTracker.
     * </pre>
     *
     * <code>repeated string imptrackers = 4;</code>
     * @return A list containing the imptrackers.
     */
    public com.google.protobuf.ProtocolStringList
        getImptrackersList() {
      return imptrackers_;
    }
    /**
     * <pre>
     * Array of impression tracking URLs, expected to return a 1x1 image or
     * 204 response - typically only passed when using 3rd party trackers.
     * To be deprecated in 1.2 - Replaced with EventTracker.
     * </pre>
     *
     * <code>repeated string imptrackers = 4;</code>
     * @return The count of imptrackers.
     */
    public int getImptrackersCount() {
      return imptrackers_.size();
    }
    /**
     * <pre>
     * Array of impression tracking URLs, expected to return a 1x1 image or
     * 204 response - typically only passed when using 3rd party trackers.
     * To be deprecated in 1.2 - Replaced with EventTracker.
     * </pre>
     *
     * <code>repeated string imptrackers = 4;</code>
     * @param index The index of the element to return.
     * @return The imptrackers at the given index.
     */
    public java.lang.String getImptrackers(int index) {
      return imptrackers_.get(index);
    }
    /**
     * <pre>
     * Array of impression tracking URLs, expected to return a 1x1 image or
     * 204 response - typically only passed when using 3rd party trackers.
     * To be deprecated in 1.2 - Replaced with EventTracker.
     * </pre>
     *
     * <code>repeated string imptrackers = 4;</code>
     * @param index The index of the value to return.
     * @return The bytes of the imptrackers at the given index.
     */
    public com.google.protobuf.ByteString
        getImptrackersBytes(int index) {
      return imptrackers_.getByteString(index);
    }

    public static final int JSTRACKER_FIELD_NUMBER = 5;
    private volatile java.lang.Object jstracker_;
    /**
     * <pre>
     * Optional javascript impression tracker. Contains &lt;script&gt; tags to be
     * executed at impression time where it can be supported.
     * To be deprecated in 1.2 - Replaced with EventTracker.
     * </pre>
     *
     * <code>optional string jstracker = 5;</code>
     * @return Whether the jstracker field is set.
     */
    @java.lang.Override
    public boolean hasJstracker() {
      return ((bitField0_ & 0x00000010) != 0);
    }
    /**
     * <pre>
     * Optional javascript impression tracker. Contains &lt;script&gt; tags to be
     * executed at impression time where it can be supported.
     * To be deprecated in 1.2 - Replaced with EventTracker.
     * </pre>
     *
     * <code>optional string jstracker = 5;</code>
     * @return The jstracker.
     */
    @java.lang.Override
    public java.lang.String getJstracker() {
      java.lang.Object ref = jstracker_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          jstracker_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * Optional javascript impression tracker. Contains &lt;script&gt; tags to be
     * executed at impression time where it can be supported.
     * To be deprecated in 1.2 - Replaced with EventTracker.
     * </pre>
     *
     * <code>optional string jstracker = 5;</code>
     * @return The bytes for jstracker.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getJstrackerBytes() {
      java.lang.Object ref = jstracker_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        jstracker_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

    public static final int EVENTTRACKERS_FIELD_NUMBER = 8;
    private java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker> eventtrackers_;
    /**
     * <pre>
     * Array of response event trackers to run with the ad, in response to the
     * declared supported methods in the NativeRequest. Replaces imptrackers and
     * jstrackers.
     * Implemented in 1.2
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.EventTracker eventtrackers = 8;</code>
     */
    @java.lang.Override
    public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker> getEventtrackersList() {
      return eventtrackers_;
    }
    /**
     * <pre>
     * Array of response event trackers to run with the ad, in response to the
     * declared supported methods in the NativeRequest. Replaces imptrackers and
     * jstrackers.
     * Implemented in 1.2
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.EventTracker eventtrackers = 8;</code>
     */
    @java.lang.Override
    public java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTrackerOrBuilder> 
        getEventtrackersOrBuilderList() {
      return eventtrackers_;
    }
    /**
     * <pre>
     * Array of response event trackers to run with the ad, in response to the
     * declared supported methods in the NativeRequest. Replaces imptrackers and
     * jstrackers.
     * Implemented in 1.2
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.EventTracker eventtrackers = 8;</code>
     */
    @java.lang.Override
    public int getEventtrackersCount() {
      return eventtrackers_.size();
    }
    /**
     * <pre>
     * Array of response event trackers to run with the ad, in response to the
     * declared supported methods in the NativeRequest. Replaces imptrackers and
     * jstrackers.
     * Implemented in 1.2
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.EventTracker eventtrackers = 8;</code>
     */
    @java.lang.Override
    public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker getEventtrackers(int index) {
      return eventtrackers_.get(index);
    }
    /**
     * <pre>
     * Array of response event trackers to run with the ad, in response to the
     * declared supported methods in the NativeRequest. Replaces imptrackers and
     * jstrackers.
     * Implemented in 1.2
     * </pre>
     *
     * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.EventTracker eventtrackers = 8;</code>
     */
    @java.lang.Override
    public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTrackerOrBuilder getEventtrackersOrBuilder(
        int index) {
      return eventtrackers_.get(index);
    }

    public static final int PRIVACY_FIELD_NUMBER = 9;
    private volatile java.lang.Object privacy_;
    /**
     * <pre>
     * If support was indicated in the request, URL of a page informing the user
     * about the buyer's targeting activity.
     * Implemented in 1.2
     * </pre>
     *
     * <code>optional string privacy = 9;</code>
     * @return Whether the privacy field is set.
     */
    @java.lang.Override
    public boolean hasPrivacy() {
      return ((bitField0_ & 0x00000020) != 0);
    }
    /**
     * <pre>
     * If support was indicated in the request, URL of a page informing the user
     * about the buyer's targeting activity.
     * Implemented in 1.2
     * </pre>
     *
     * <code>optional string privacy = 9;</code>
     * @return The privacy.
     */
    @java.lang.Override
    public java.lang.String getPrivacy() {
      java.lang.Object ref = privacy_;
      if (ref instanceof java.lang.String) {
        return (java.lang.String) ref;
      } else {
        com.google.protobuf.ByteString bs = 
            (com.google.protobuf.ByteString) ref;
        java.lang.String s = bs.toStringUtf8();
        if (bs.isValidUtf8()) {
          privacy_ = s;
        }
        return s;
      }
    }
    /**
     * <pre>
     * If support was indicated in the request, URL of a page informing the user
     * about the buyer's targeting activity.
     * Implemented in 1.2
     * </pre>
     *
     * <code>optional string privacy = 9;</code>
     * @return The bytes for privacy.
     */
    @java.lang.Override
    public com.google.protobuf.ByteString
        getPrivacyBytes() {
      java.lang.Object ref = privacy_;
      if (ref instanceof java.lang.String) {
        com.google.protobuf.ByteString b = 
            com.google.protobuf.ByteString.copyFromUtf8(
                (java.lang.String) ref);
        privacy_ = b;
        return b;
      } else {
        return (com.google.protobuf.ByteString) ref;
      }
    }

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

      if (!hasLink()) {
        memoizedIsInitialized = 0;
        return false;
      }
      for (int i = 0; i < getAssetsCount(); i++) {
        if (!getAssets(i).isInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
      }
      if (!getLink().isInitialized()) {
        memoizedIsInitialized = 0;
        return false;
      }
      for (int i = 0; i < getEventtrackersCount(); i++) {
        if (!getEventtrackers(i).isInitialized()) {
          memoizedIsInitialized = 0;
          return false;
        }
      }
      if (!extensionsAreInitialized()) {
        memoizedIsInitialized = 0;
        return false;
      }
      memoizedIsInitialized = 1;
      return true;
    }

    @java.lang.Override
    public void writeTo(com.google.protobuf.CodedOutputStream output)
                        throws java.io.IOException {
      com.google.protobuf.GeneratedMessageV3
        .ExtendableMessage<com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse>.ExtensionWriter
          extensionWriter = newExtensionWriter();
      if (((bitField0_ & 0x00000001) != 0)) {
        com.google.protobuf.GeneratedMessageV3.writeString(output, 1, ver_);
      }
      for (int i = 0; i < assets_.size(); i++) {
        output.writeMessage(2, assets_.get(i));
      }
      if (((bitField0_ & 0x00000008) != 0)) {
        output.writeMessage(3, getLink());
      }
      for (int i = 0; i < imptrackers_.size(); i++) {
        com.google.protobuf.GeneratedMessageV3.writeString(output, 4, imptrackers_.getRaw(i));
      }
      if (((bitField0_ & 0x00000010) != 0)) {
        com.google.protobuf.GeneratedMessageV3.writeString(output, 5, jstracker_);
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        com.google.protobuf.GeneratedMessageV3.writeString(output, 6, assetsurl_);
      }
      if (((bitField0_ & 0x00000004) != 0)) {
        com.google.protobuf.GeneratedMessageV3.writeString(output, 7, dcourl_);
      }
      for (int i = 0; i < eventtrackers_.size(); i++) {
        output.writeMessage(8, eventtrackers_.get(i));
      }
      if (((bitField0_ & 0x00000020) != 0)) {
        com.google.protobuf.GeneratedMessageV3.writeString(output, 9, privacy_);
      }
      extensionWriter.writeUntil(10000, output);
      unknownFields.writeTo(output);
    }

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

      size = 0;
      if (((bitField0_ & 0x00000001) != 0)) {
        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, ver_);
      }
      for (int i = 0; i < assets_.size(); i++) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(2, assets_.get(i));
      }
      if (((bitField0_ & 0x00000008) != 0)) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(3, getLink());
      }
      {
        int dataSize = 0;
        for (int i = 0; i < imptrackers_.size(); i++) {
          dataSize += computeStringSizeNoTag(imptrackers_.getRaw(i));
        }
        size += dataSize;
        size += 1 * getImptrackersList().size();
      }
      if (((bitField0_ & 0x00000010) != 0)) {
        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(5, jstracker_);
      }
      if (((bitField0_ & 0x00000002) != 0)) {
        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(6, assetsurl_);
      }
      if (((bitField0_ & 0x00000004) != 0)) {
        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(7, dcourl_);
      }
      for (int i = 0; i < eventtrackers_.size(); i++) {
        size += com.google.protobuf.CodedOutputStream
          .computeMessageSize(8, eventtrackers_.get(i));
      }
      if (((bitField0_ & 0x00000020) != 0)) {
        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(9, privacy_);
      }
      size += extensionsSerializedSize();
      size += unknownFields.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.iabtechlab.openrtb.v2.OpenRtb.NativeResponse)) {
        return super.equals(obj);
      }
      com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse other = (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse) obj;

      if (hasVer() != other.hasVer()) return false;
      if (hasVer()) {
        if (!getVer()
            .equals(other.getVer())) return false;
      }
      if (!getAssetsList()
          .equals(other.getAssetsList())) return false;
      if (hasAssetsurl() != other.hasAssetsurl()) return false;
      if (hasAssetsurl()) {
        if (!getAssetsurl()
            .equals(other.getAssetsurl())) return false;
      }
      if (hasDcourl() != other.hasDcourl()) return false;
      if (hasDcourl()) {
        if (!getDcourl()
            .equals(other.getDcourl())) return false;
      }
      if (hasLink() != other.hasLink()) return false;
      if (hasLink()) {
        if (!getLink()
            .equals(other.getLink())) return false;
      }
      if (!getImptrackersList()
          .equals(other.getImptrackersList())) return false;
      if (hasJstracker() != other.hasJstracker()) return false;
      if (hasJstracker()) {
        if (!getJstracker()
            .equals(other.getJstracker())) return false;
      }
      if (!getEventtrackersList()
          .equals(other.getEventtrackersList())) return false;
      if (hasPrivacy() != other.hasPrivacy()) return false;
      if (hasPrivacy()) {
        if (!getPrivacy()
            .equals(other.getPrivacy())) return false;
      }
      if (!unknownFields.equals(other.unknownFields)) return false;
      if (!getExtensionFields().equals(other.getExtensionFields()))
        return false;
      return true;
    }

    @java.lang.Override
    public int hashCode() {
      if (memoizedHashCode != 0) {
        return memoizedHashCode;
      }
      int hash = 41;
      hash = (19 * hash) + getDescriptor().hashCode();
      if (hasVer()) {
        hash = (37 * hash) + VER_FIELD_NUMBER;
        hash = (53 * hash) + getVer().hashCode();
      }
      if (getAssetsCount() > 0) {
        hash = (37 * hash) + ASSETS_FIELD_NUMBER;
        hash = (53 * hash) + getAssetsList().hashCode();
      }
      if (hasAssetsurl()) {
        hash = (37 * hash) + ASSETSURL_FIELD_NUMBER;
        hash = (53 * hash) + getAssetsurl().hashCode();
      }
      if (hasDcourl()) {
        hash = (37 * hash) + DCOURL_FIELD_NUMBER;
        hash = (53 * hash) + getDcourl().hashCode();
      }
      if (hasLink()) {
        hash = (37 * hash) + LINK_FIELD_NUMBER;
        hash = (53 * hash) + getLink().hashCode();
      }
      if (getImptrackersCount() > 0) {
        hash = (37 * hash) + IMPTRACKERS_FIELD_NUMBER;
        hash = (53 * hash) + getImptrackersList().hashCode();
      }
      if (hasJstracker()) {
        hash = (37 * hash) + JSTRACKER_FIELD_NUMBER;
        hash = (53 * hash) + getJstracker().hashCode();
      }
      if (getEventtrackersCount() > 0) {
        hash = (37 * hash) + EVENTTRACKERS_FIELD_NUMBER;
        hash = (53 * hash) + getEventtrackersList().hashCode();
      }
      if (hasPrivacy()) {
        hash = (37 * hash) + PRIVACY_FIELD_NUMBER;
        hash = (53 * hash) + getPrivacy().hashCode();
      }
      hash = hashFields(hash, getExtensionFields());
      hash = (29 * hash) + unknownFields.hashCode();
      memoizedHashCode = hash;
      return hash;
    }

    public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse parseFrom(
        java.nio.ByteBuffer data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse parseFrom(
        java.nio.ByteBuffer data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse parseFrom(
        com.google.protobuf.ByteString data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse parseFrom(
        com.google.protobuf.ByteString data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse parseFrom(byte[] data)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data);
    }
    public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse parseFrom(
        byte[] data,
        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
        throws com.google.protobuf.InvalidProtocolBufferException {
      return PARSER.parseFrom(data, extensionRegistry);
    }
    public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse parseFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse 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.iabtechlab.openrtb.v2.OpenRtb.NativeResponse parseDelimitedFrom(java.io.InputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseDelimitedWithIOException(PARSER, input);
    }
    public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse 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.iabtechlab.openrtb.v2.OpenRtb.NativeResponse parseFrom(
        com.google.protobuf.CodedInputStream input)
        throws java.io.IOException {
      return com.google.protobuf.GeneratedMessageV3
          .parseWithIOException(PARSER, input);
    }
    public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse 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.iabtechlab.openrtb.v2.OpenRtb.NativeResponse 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>
     * OpenRTB Native 1.0: The native response object is the top level JSON object
     * which identifies an native response.
     * Note: Prior to VERSION 1.1, the native response's root node was an object
     * with a single field "native" that would contain the object above as its
     * value.
     * In 1.2 The NativeResponse Object specified here is now the root object.
     * </pre>
     *
     * Protobuf type {@code com.iabtechlab.openrtb.v2.NativeResponse}
     */
    public static final class Builder extends
        com.google.protobuf.GeneratedMessageV3.ExtendableBuilder<
          com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse, Builder> implements
        // @@protoc_insertion_point(builder_implements:com.iabtechlab.openrtb.v2.NativeResponse)
        com.iabtechlab.openrtb.v2.OpenRtb.NativeResponseOrBuilder {
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeResponse_descriptor;
      }

      @java.lang.Override
      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
          internalGetFieldAccessorTable() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeResponse_fieldAccessorTable
            .ensureFieldAccessorsInitialized(
                com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.class, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Builder.class);
      }

      // Construct using com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.newBuilder()
      private Builder() {
        maybeForceBuilderInitialization();
      }

      private Builder(
          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
        super(parent);
        maybeForceBuilderInitialization();
      }
      private void maybeForceBuilderInitialization() {
        if (com.google.protobuf.GeneratedMessageV3
                .alwaysUseFieldBuilders) {
          getAssetsFieldBuilder();
          getLinkFieldBuilder();
          getEventtrackersFieldBuilder();
        }
      }
      @java.lang.Override
      public Builder clear() {
        super.clear();
        ver_ = "";
        bitField0_ = (bitField0_ & ~0x00000001);
        if (assetsBuilder_ == null) {
          assets_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000002);
        } else {
          assetsBuilder_.clear();
        }
        assetsurl_ = "";
        bitField0_ = (bitField0_ & ~0x00000004);
        dcourl_ = "";
        bitField0_ = (bitField0_ & ~0x00000008);
        if (linkBuilder_ == null) {
          link_ = null;
        } else {
          linkBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000010);
        imptrackers_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        bitField0_ = (bitField0_ & ~0x00000020);
        jstracker_ = "";
        bitField0_ = (bitField0_ & ~0x00000040);
        if (eventtrackersBuilder_ == null) {
          eventtrackers_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000080);
        } else {
          eventtrackersBuilder_.clear();
        }
        privacy_ = "";
        bitField0_ = (bitField0_ & ~0x00000100);
        return this;
      }

      @java.lang.Override
      public com.google.protobuf.Descriptors.Descriptor
          getDescriptorForType() {
        return com.iabtechlab.openrtb.v2.OpenRtb.internal_static_com_iabtechlab_openrtb_v2_NativeResponse_descriptor;
      }

      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse getDefaultInstanceForType() {
        return com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.getDefaultInstance();
      }

      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse build() {
        com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse result = buildPartial();
        if (!result.isInitialized()) {
          throw newUninitializedMessageException(result);
        }
        return result;
      }

      @java.lang.Override
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse buildPartial() {
        com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse result = new com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse(this);
        int from_bitField0_ = bitField0_;
        int to_bitField0_ = 0;
        if (((from_bitField0_ & 0x00000001) != 0)) {
          to_bitField0_ |= 0x00000001;
        }
        result.ver_ = ver_;
        if (assetsBuilder_ == null) {
          if (((bitField0_ & 0x00000002) != 0)) {
            assets_ = java.util.Collections.unmodifiableList(assets_);
            bitField0_ = (bitField0_ & ~0x00000002);
          }
          result.assets_ = assets_;
        } else {
          result.assets_ = assetsBuilder_.build();
        }
        if (((from_bitField0_ & 0x00000004) != 0)) {
          to_bitField0_ |= 0x00000002;
        }
        result.assetsurl_ = assetsurl_;
        if (((from_bitField0_ & 0x00000008) != 0)) {
          to_bitField0_ |= 0x00000004;
        }
        result.dcourl_ = dcourl_;
        if (((from_bitField0_ & 0x00000010) != 0)) {
          if (linkBuilder_ == null) {
            result.link_ = link_;
          } else {
            result.link_ = linkBuilder_.build();
          }
          to_bitField0_ |= 0x00000008;
        }
        if (((bitField0_ & 0x00000020) != 0)) {
          imptrackers_ = imptrackers_.getUnmodifiableView();
          bitField0_ = (bitField0_ & ~0x00000020);
        }
        result.imptrackers_ = imptrackers_;
        if (((from_bitField0_ & 0x00000040) != 0)) {
          to_bitField0_ |= 0x00000010;
        }
        result.jstracker_ = jstracker_;
        if (eventtrackersBuilder_ == null) {
          if (((bitField0_ & 0x00000080) != 0)) {
            eventtrackers_ = java.util.Collections.unmodifiableList(eventtrackers_);
            bitField0_ = (bitField0_ & ~0x00000080);
          }
          result.eventtrackers_ = eventtrackers_;
        } else {
          result.eventtrackers_ = eventtrackersBuilder_.build();
        }
        if (((from_bitField0_ & 0x00000100) != 0)) {
          to_bitField0_ |= 0x00000020;
        }
        result.privacy_ = privacy_;
        result.bitField0_ = to_bitField0_;
        onBuilt();
        return result;
      }

      @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 <Type> Builder setExtension(
          com.google.protobuf.GeneratedMessage.GeneratedExtension<
              com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse, Type> extension,
          Type value) {
        return super.setExtension(extension, value);
      }
      @java.lang.Override
      public <Type> Builder setExtension(
          com.google.protobuf.GeneratedMessage.GeneratedExtension<
              com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse, java.util.List<Type>> extension,
          int index, Type value) {
        return super.setExtension(extension, index, value);
      }
      @java.lang.Override
      public <Type> Builder addExtension(
          com.google.protobuf.GeneratedMessage.GeneratedExtension<
              com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse, java.util.List<Type>> extension,
          Type value) {
        return super.addExtension(extension, value);
      }
      @java.lang.Override
      public <Type> Builder clearExtension(
          com.google.protobuf.GeneratedMessage.GeneratedExtension<
              com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse, ?> extension) {
        return super.clearExtension(extension);
      }
      @java.lang.Override
      public Builder mergeFrom(com.google.protobuf.Message other) {
        if (other instanceof com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse) {
          return mergeFrom((com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse)other);
        } else {
          super.mergeFrom(other);
          return this;
        }
      }

      public Builder mergeFrom(com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse other) {
        if (other == com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.getDefaultInstance()) return this;
        if (other.hasVer()) {
          bitField0_ |= 0x00000001;
          ver_ = other.ver_;
          onChanged();
        }
        if (assetsBuilder_ == null) {
          if (!other.assets_.isEmpty()) {
            if (assets_.isEmpty()) {
              assets_ = other.assets_;
              bitField0_ = (bitField0_ & ~0x00000002);
            } else {
              ensureAssetsIsMutable();
              assets_.addAll(other.assets_);
            }
            onChanged();
          }
        } else {
          if (!other.assets_.isEmpty()) {
            if (assetsBuilder_.isEmpty()) {
              assetsBuilder_.dispose();
              assetsBuilder_ = null;
              assets_ = other.assets_;
              bitField0_ = (bitField0_ & ~0x00000002);
              assetsBuilder_ = 
                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
                   getAssetsFieldBuilder() : null;
            } else {
              assetsBuilder_.addAllMessages(other.assets_);
            }
          }
        }
        if (other.hasAssetsurl()) {
          bitField0_ |= 0x00000004;
          assetsurl_ = other.assetsurl_;
          onChanged();
        }
        if (other.hasDcourl()) {
          bitField0_ |= 0x00000008;
          dcourl_ = other.dcourl_;
          onChanged();
        }
        if (other.hasLink()) {
          mergeLink(other.getLink());
        }
        if (!other.imptrackers_.isEmpty()) {
          if (imptrackers_.isEmpty()) {
            imptrackers_ = other.imptrackers_;
            bitField0_ = (bitField0_ & ~0x00000020);
          } else {
            ensureImptrackersIsMutable();
            imptrackers_.addAll(other.imptrackers_);
          }
          onChanged();
        }
        if (other.hasJstracker()) {
          bitField0_ |= 0x00000040;
          jstracker_ = other.jstracker_;
          onChanged();
        }
        if (eventtrackersBuilder_ == null) {
          if (!other.eventtrackers_.isEmpty()) {
            if (eventtrackers_.isEmpty()) {
              eventtrackers_ = other.eventtrackers_;
              bitField0_ = (bitField0_ & ~0x00000080);
            } else {
              ensureEventtrackersIsMutable();
              eventtrackers_.addAll(other.eventtrackers_);
            }
            onChanged();
          }
        } else {
          if (!other.eventtrackers_.isEmpty()) {
            if (eventtrackersBuilder_.isEmpty()) {
              eventtrackersBuilder_.dispose();
              eventtrackersBuilder_ = null;
              eventtrackers_ = other.eventtrackers_;
              bitField0_ = (bitField0_ & ~0x00000080);
              eventtrackersBuilder_ = 
                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
                   getEventtrackersFieldBuilder() : null;
            } else {
              eventtrackersBuilder_.addAllMessages(other.eventtrackers_);
            }
          }
        }
        if (other.hasPrivacy()) {
          bitField0_ |= 0x00000100;
          privacy_ = other.privacy_;
          onChanged();
        }
        this.mergeExtensionFields(other);
        this.mergeUnknownFields(other.unknownFields);
        onChanged();
        return this;
      }

      @java.lang.Override
      public final boolean isInitialized() {
        if (!hasLink()) {
          return false;
        }
        for (int i = 0; i < getAssetsCount(); i++) {
          if (!getAssets(i).isInitialized()) {
            return false;
          }
        }
        if (!getLink().isInitialized()) {
          return false;
        }
        for (int i = 0; i < getEventtrackersCount(); i++) {
          if (!getEventtrackers(i).isInitialized()) {
            return false;
          }
        }
        if (!extensionsAreInitialized()) {
          return false;
        }
        return true;
      }

      @java.lang.Override
      public Builder mergeFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse parsedMessage = null;
        try {
          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
          parsedMessage = (com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse) e.getUnfinishedMessage();
          throw e.unwrapIOException();
        } finally {
          if (parsedMessage != null) {
            mergeFrom(parsedMessage);
          }
        }
        return this;
      }
      private int bitField0_;

      private java.lang.Object ver_ = "";
      /**
       * <pre>
       * Version of the Native Markup version in use.
       * RECOMMENDED in 1.2
       * </pre>
       *
       * <code>optional string ver = 1;</code>
       * @return Whether the ver field is set.
       */
      public boolean hasVer() {
        return ((bitField0_ & 0x00000001) != 0);
      }
      /**
       * <pre>
       * Version of the Native Markup version in use.
       * RECOMMENDED in 1.2
       * </pre>
       *
       * <code>optional string ver = 1;</code>
       * @return The ver.
       */
      public java.lang.String getVer() {
        java.lang.Object ref = ver_;
        if (!(ref instanceof java.lang.String)) {
          com.google.protobuf.ByteString bs =
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            ver_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * Version of the Native Markup version in use.
       * RECOMMENDED in 1.2
       * </pre>
       *
       * <code>optional string ver = 1;</code>
       * @return The bytes for ver.
       */
      public com.google.protobuf.ByteString
          getVerBytes() {
        java.lang.Object ref = ver_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          ver_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * Version of the Native Markup version in use.
       * RECOMMENDED in 1.2
       * </pre>
       *
       * <code>optional string ver = 1;</code>
       * @param value The ver to set.
       * @return This builder for chaining.
       */
      public Builder setVer(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
        ver_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Version of the Native Markup version in use.
       * RECOMMENDED in 1.2
       * </pre>
       *
       * <code>optional string ver = 1;</code>
       * @return This builder for chaining.
       */
      public Builder clearVer() {
        bitField0_ = (bitField0_ & ~0x00000001);
        ver_ = getDefaultInstance().getVer();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Version of the Native Markup version in use.
       * RECOMMENDED in 1.2
       * </pre>
       *
       * <code>optional string ver = 1;</code>
       * @param value The bytes for ver to set.
       * @return This builder for chaining.
       */
      public Builder setVerBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000001;
        ver_ = value;
        onChanged();
        return this;
      }

      private java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset> assets_ =
        java.util.Collections.emptyList();
      private void ensureAssetsIsMutable() {
        if (!((bitField0_ & 0x00000002) != 0)) {
          assets_ = new java.util.ArrayList<com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset>(assets_);
          bitField0_ |= 0x00000002;
         }
      }

      private com.google.protobuf.RepeatedFieldBuilderV3<
          com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Builder, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.AssetOrBuilder> assetsBuilder_;

      /**
       * <pre>
       * List of native ad's assets.
       * RECOMMENDED in 1.0, 1.1, or in 1.2 as a fallback if assetsurl is provided.
       * REQUIRED in 1.2, if not assetsurl is provided.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.Asset assets = 2;</code>
       */
      public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset> getAssetsList() {
        if (assetsBuilder_ == null) {
          return java.util.Collections.unmodifiableList(assets_);
        } else {
          return assetsBuilder_.getMessageList();
        }
      }
      /**
       * <pre>
       * List of native ad's assets.
       * RECOMMENDED in 1.0, 1.1, or in 1.2 as a fallback if assetsurl is provided.
       * REQUIRED in 1.2, if not assetsurl is provided.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.Asset assets = 2;</code>
       */
      public int getAssetsCount() {
        if (assetsBuilder_ == null) {
          return assets_.size();
        } else {
          return assetsBuilder_.getCount();
        }
      }
      /**
       * <pre>
       * List of native ad's assets.
       * RECOMMENDED in 1.0, 1.1, or in 1.2 as a fallback if assetsurl is provided.
       * REQUIRED in 1.2, if not assetsurl is provided.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.Asset assets = 2;</code>
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset getAssets(int index) {
        if (assetsBuilder_ == null) {
          return assets_.get(index);
        } else {
          return assetsBuilder_.getMessage(index);
        }
      }
      /**
       * <pre>
       * List of native ad's assets.
       * RECOMMENDED in 1.0, 1.1, or in 1.2 as a fallback if assetsurl is provided.
       * REQUIRED in 1.2, if not assetsurl is provided.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.Asset assets = 2;</code>
       */
      public Builder setAssets(
          int index, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset value) {
        if (assetsBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureAssetsIsMutable();
          assets_.set(index, value);
          onChanged();
        } else {
          assetsBuilder_.setMessage(index, value);
        }
        return this;
      }
      /**
       * <pre>
       * List of native ad's assets.
       * RECOMMENDED in 1.0, 1.1, or in 1.2 as a fallback if assetsurl is provided.
       * REQUIRED in 1.2, if not assetsurl is provided.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.Asset assets = 2;</code>
       */
      public Builder setAssets(
          int index, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Builder builderForValue) {
        if (assetsBuilder_ == null) {
          ensureAssetsIsMutable();
          assets_.set(index, builderForValue.build());
          onChanged();
        } else {
          assetsBuilder_.setMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * <pre>
       * List of native ad's assets.
       * RECOMMENDED in 1.0, 1.1, or in 1.2 as a fallback if assetsurl is provided.
       * REQUIRED in 1.2, if not assetsurl is provided.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.Asset assets = 2;</code>
       */
      public Builder addAssets(com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset value) {
        if (assetsBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureAssetsIsMutable();
          assets_.add(value);
          onChanged();
        } else {
          assetsBuilder_.addMessage(value);
        }
        return this;
      }
      /**
       * <pre>
       * List of native ad's assets.
       * RECOMMENDED in 1.0, 1.1, or in 1.2 as a fallback if assetsurl is provided.
       * REQUIRED in 1.2, if not assetsurl is provided.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.Asset assets = 2;</code>
       */
      public Builder addAssets(
          int index, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset value) {
        if (assetsBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureAssetsIsMutable();
          assets_.add(index, value);
          onChanged();
        } else {
          assetsBuilder_.addMessage(index, value);
        }
        return this;
      }
      /**
       * <pre>
       * List of native ad's assets.
       * RECOMMENDED in 1.0, 1.1, or in 1.2 as a fallback if assetsurl is provided.
       * REQUIRED in 1.2, if not assetsurl is provided.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.Asset assets = 2;</code>
       */
      public Builder addAssets(
          com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Builder builderForValue) {
        if (assetsBuilder_ == null) {
          ensureAssetsIsMutable();
          assets_.add(builderForValue.build());
          onChanged();
        } else {
          assetsBuilder_.addMessage(builderForValue.build());
        }
        return this;
      }
      /**
       * <pre>
       * List of native ad's assets.
       * RECOMMENDED in 1.0, 1.1, or in 1.2 as a fallback if assetsurl is provided.
       * REQUIRED in 1.2, if not assetsurl is provided.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.Asset assets = 2;</code>
       */
      public Builder addAssets(
          int index, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Builder builderForValue) {
        if (assetsBuilder_ == null) {
          ensureAssetsIsMutable();
          assets_.add(index, builderForValue.build());
          onChanged();
        } else {
          assetsBuilder_.addMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * <pre>
       * List of native ad's assets.
       * RECOMMENDED in 1.0, 1.1, or in 1.2 as a fallback if assetsurl is provided.
       * REQUIRED in 1.2, if not assetsurl is provided.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.Asset assets = 2;</code>
       */
      public Builder addAllAssets(
          java.lang.Iterable<? extends com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset> values) {
        if (assetsBuilder_ == null) {
          ensureAssetsIsMutable();
          com.google.protobuf.AbstractMessageLite.Builder.addAll(
              values, assets_);
          onChanged();
        } else {
          assetsBuilder_.addAllMessages(values);
        }
        return this;
      }
      /**
       * <pre>
       * List of native ad's assets.
       * RECOMMENDED in 1.0, 1.1, or in 1.2 as a fallback if assetsurl is provided.
       * REQUIRED in 1.2, if not assetsurl is provided.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.Asset assets = 2;</code>
       */
      public Builder clearAssets() {
        if (assetsBuilder_ == null) {
          assets_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000002);
          onChanged();
        } else {
          assetsBuilder_.clear();
        }
        return this;
      }
      /**
       * <pre>
       * List of native ad's assets.
       * RECOMMENDED in 1.0, 1.1, or in 1.2 as a fallback if assetsurl is provided.
       * REQUIRED in 1.2, if not assetsurl is provided.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.Asset assets = 2;</code>
       */
      public Builder removeAssets(int index) {
        if (assetsBuilder_ == null) {
          ensureAssetsIsMutable();
          assets_.remove(index);
          onChanged();
        } else {
          assetsBuilder_.remove(index);
        }
        return this;
      }
      /**
       * <pre>
       * List of native ad's assets.
       * RECOMMENDED in 1.0, 1.1, or in 1.2 as a fallback if assetsurl is provided.
       * REQUIRED in 1.2, if not assetsurl is provided.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.Asset assets = 2;</code>
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Builder getAssetsBuilder(
          int index) {
        return getAssetsFieldBuilder().getBuilder(index);
      }
      /**
       * <pre>
       * List of native ad's assets.
       * RECOMMENDED in 1.0, 1.1, or in 1.2 as a fallback if assetsurl is provided.
       * REQUIRED in 1.2, if not assetsurl is provided.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.Asset assets = 2;</code>
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.AssetOrBuilder getAssetsOrBuilder(
          int index) {
        if (assetsBuilder_ == null) {
          return assets_.get(index);  } else {
          return assetsBuilder_.getMessageOrBuilder(index);
        }
      }
      /**
       * <pre>
       * List of native ad's assets.
       * RECOMMENDED in 1.0, 1.1, or in 1.2 as a fallback if assetsurl is provided.
       * REQUIRED in 1.2, if not assetsurl is provided.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.Asset assets = 2;</code>
       */
      public java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.AssetOrBuilder> 
           getAssetsOrBuilderList() {
        if (assetsBuilder_ != null) {
          return assetsBuilder_.getMessageOrBuilderList();
        } else {
          return java.util.Collections.unmodifiableList(assets_);
        }
      }
      /**
       * <pre>
       * List of native ad's assets.
       * RECOMMENDED in 1.0, 1.1, or in 1.2 as a fallback if assetsurl is provided.
       * REQUIRED in 1.2, if not assetsurl is provided.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.Asset assets = 2;</code>
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Builder addAssetsBuilder() {
        return getAssetsFieldBuilder().addBuilder(
            com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.getDefaultInstance());
      }
      /**
       * <pre>
       * List of native ad's assets.
       * RECOMMENDED in 1.0, 1.1, or in 1.2 as a fallback if assetsurl is provided.
       * REQUIRED in 1.2, if not assetsurl is provided.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.Asset assets = 2;</code>
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Builder addAssetsBuilder(
          int index) {
        return getAssetsFieldBuilder().addBuilder(
            index, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.getDefaultInstance());
      }
      /**
       * <pre>
       * List of native ad's assets.
       * RECOMMENDED in 1.0, 1.1, or in 1.2 as a fallback if assetsurl is provided.
       * REQUIRED in 1.2, if not assetsurl is provided.
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.Asset assets = 2;</code>
       */
      public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Builder> 
           getAssetsBuilderList() {
        return getAssetsFieldBuilder().getBuilderList();
      }
      private com.google.protobuf.RepeatedFieldBuilderV3<
          com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Builder, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.AssetOrBuilder> 
          getAssetsFieldBuilder() {
        if (assetsBuilder_ == null) {
          assetsBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
              com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Asset.Builder, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.AssetOrBuilder>(
                  assets_,
                  ((bitField0_ & 0x00000002) != 0),
                  getParentForChildren(),
                  isClean());
          assets_ = null;
        }
        return assetsBuilder_;
      }

      private java.lang.Object assetsurl_ = "";
      /**
       * <pre>
       * URL of alternate source for the assets object. The expected response is a
       * JSON object mirroring the asset object in the bid response, subject to
       * certain requirements as specified in the individual objects.
       * Where present, overrides the assets object in the response.
       * Implemented in 1.2
       * </pre>
       *
       * <code>optional string assetsurl = 6;</code>
       * @return Whether the assetsurl field is set.
       */
      public boolean hasAssetsurl() {
        return ((bitField0_ & 0x00000004) != 0);
      }
      /**
       * <pre>
       * URL of alternate source for the assets object. The expected response is a
       * JSON object mirroring the asset object in the bid response, subject to
       * certain requirements as specified in the individual objects.
       * Where present, overrides the assets object in the response.
       * Implemented in 1.2
       * </pre>
       *
       * <code>optional string assetsurl = 6;</code>
       * @return The assetsurl.
       */
      public java.lang.String getAssetsurl() {
        java.lang.Object ref = assetsurl_;
        if (!(ref instanceof java.lang.String)) {
          com.google.protobuf.ByteString bs =
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            assetsurl_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * URL of alternate source for the assets object. The expected response is a
       * JSON object mirroring the asset object in the bid response, subject to
       * certain requirements as specified in the individual objects.
       * Where present, overrides the assets object in the response.
       * Implemented in 1.2
       * </pre>
       *
       * <code>optional string assetsurl = 6;</code>
       * @return The bytes for assetsurl.
       */
      public com.google.protobuf.ByteString
          getAssetsurlBytes() {
        java.lang.Object ref = assetsurl_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          assetsurl_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * URL of alternate source for the assets object. The expected response is a
       * JSON object mirroring the asset object in the bid response, subject to
       * certain requirements as specified in the individual objects.
       * Where present, overrides the assets object in the response.
       * Implemented in 1.2
       * </pre>
       *
       * <code>optional string assetsurl = 6;</code>
       * @param value The assetsurl to set.
       * @return This builder for chaining.
       */
      public Builder setAssetsurl(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        assetsurl_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * URL of alternate source for the assets object. The expected response is a
       * JSON object mirroring the asset object in the bid response, subject to
       * certain requirements as specified in the individual objects.
       * Where present, overrides the assets object in the response.
       * Implemented in 1.2
       * </pre>
       *
       * <code>optional string assetsurl = 6;</code>
       * @return This builder for chaining.
       */
      public Builder clearAssetsurl() {
        bitField0_ = (bitField0_ & ~0x00000004);
        assetsurl_ = getDefaultInstance().getAssetsurl();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * URL of alternate source for the assets object. The expected response is a
       * JSON object mirroring the asset object in the bid response, subject to
       * certain requirements as specified in the individual objects.
       * Where present, overrides the assets object in the response.
       * Implemented in 1.2
       * </pre>
       *
       * <code>optional string assetsurl = 6;</code>
       * @param value The bytes for assetsurl to set.
       * @return This builder for chaining.
       */
      public Builder setAssetsurlBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000004;
        assetsurl_ = value;
        onChanged();
        return this;
      }

      private java.lang.Object dcourl_ = "";
      /**
       * <pre>
       * URL where a dynamic creative specification may be found for populating this
       * ad, per the Dynamic Content Ads Specification.
       * Note this is a beta option as the interpretation of the Dynamic Content Ads
       * Specification and how to assign those elementes into a native ad is outside
       * the scope of this spec and must be agreed offline between parties or as may
       * be specified in a future revision of the Dynamic Content Ads spec.
       * Where present, overrides the assets object in the response.
       * Implemented in 1.2
       * </pre>
       *
       * <code>optional string dcourl = 7;</code>
       * @return Whether the dcourl field is set.
       */
      public boolean hasDcourl() {
        return ((bitField0_ & 0x00000008) != 0);
      }
      /**
       * <pre>
       * URL where a dynamic creative specification may be found for populating this
       * ad, per the Dynamic Content Ads Specification.
       * Note this is a beta option as the interpretation of the Dynamic Content Ads
       * Specification and how to assign those elementes into a native ad is outside
       * the scope of this spec and must be agreed offline between parties or as may
       * be specified in a future revision of the Dynamic Content Ads spec.
       * Where present, overrides the assets object in the response.
       * Implemented in 1.2
       * </pre>
       *
       * <code>optional string dcourl = 7;</code>
       * @return The dcourl.
       */
      public java.lang.String getDcourl() {
        java.lang.Object ref = dcourl_;
        if (!(ref instanceof java.lang.String)) {
          com.google.protobuf.ByteString bs =
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            dcourl_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * URL where a dynamic creative specification may be found for populating this
       * ad, per the Dynamic Content Ads Specification.
       * Note this is a beta option as the interpretation of the Dynamic Content Ads
       * Specification and how to assign those elementes into a native ad is outside
       * the scope of this spec and must be agreed offline between parties or as may
       * be specified in a future revision of the Dynamic Content Ads spec.
       * Where present, overrides the assets object in the response.
       * Implemented in 1.2
       * </pre>
       *
       * <code>optional string dcourl = 7;</code>
       * @return The bytes for dcourl.
       */
      public com.google.protobuf.ByteString
          getDcourlBytes() {
        java.lang.Object ref = dcourl_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          dcourl_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * URL where a dynamic creative specification may be found for populating this
       * ad, per the Dynamic Content Ads Specification.
       * Note this is a beta option as the interpretation of the Dynamic Content Ads
       * Specification and how to assign those elementes into a native ad is outside
       * the scope of this spec and must be agreed offline between parties or as may
       * be specified in a future revision of the Dynamic Content Ads spec.
       * Where present, overrides the assets object in the response.
       * Implemented in 1.2
       * </pre>
       *
       * <code>optional string dcourl = 7;</code>
       * @param value The dcourl to set.
       * @return This builder for chaining.
       */
      public Builder setDcourl(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
        dcourl_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * URL where a dynamic creative specification may be found for populating this
       * ad, per the Dynamic Content Ads Specification.
       * Note this is a beta option as the interpretation of the Dynamic Content Ads
       * Specification and how to assign those elementes into a native ad is outside
       * the scope of this spec and must be agreed offline between parties or as may
       * be specified in a future revision of the Dynamic Content Ads spec.
       * Where present, overrides the assets object in the response.
       * Implemented in 1.2
       * </pre>
       *
       * <code>optional string dcourl = 7;</code>
       * @return This builder for chaining.
       */
      public Builder clearDcourl() {
        bitField0_ = (bitField0_ & ~0x00000008);
        dcourl_ = getDefaultInstance().getDcourl();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * URL where a dynamic creative specification may be found for populating this
       * ad, per the Dynamic Content Ads Specification.
       * Note this is a beta option as the interpretation of the Dynamic Content Ads
       * Specification and how to assign those elementes into a native ad is outside
       * the scope of this spec and must be agreed offline between parties or as may
       * be specified in a future revision of the Dynamic Content Ads spec.
       * Where present, overrides the assets object in the response.
       * Implemented in 1.2
       * </pre>
       *
       * <code>optional string dcourl = 7;</code>
       * @param value The bytes for dcourl to set.
       * @return This builder for chaining.
       */
      public Builder setDcourlBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000008;
        dcourl_ = value;
        onChanged();
        return this;
      }

      private com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link link_;
      private com.google.protobuf.SingleFieldBuilderV3<
          com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link.Builder, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.LinkOrBuilder> linkBuilder_;
      /**
       * <pre>
       * Destination Link. This is default link object for the ad.
       * Individual assets can also have a link object which applies if the asset is
       * activated (clicked). If the asset doesn't have a link object, the parent
       * link object applies.
       * See ResponseLink definition.
       * REQUIRED by the OpenRTB Native specification.
       * </pre>
       *
       * <code>required .com.iabtechlab.openrtb.v2.NativeResponse.Link link = 3;</code>
       * @return Whether the link field is set.
       */
      public boolean hasLink() {
        return ((bitField0_ & 0x00000010) != 0);
      }
      /**
       * <pre>
       * Destination Link. This is default link object for the ad.
       * Individual assets can also have a link object which applies if the asset is
       * activated (clicked). If the asset doesn't have a link object, the parent
       * link object applies.
       * See ResponseLink definition.
       * REQUIRED by the OpenRTB Native specification.
       * </pre>
       *
       * <code>required .com.iabtechlab.openrtb.v2.NativeResponse.Link link = 3;</code>
       * @return The link.
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link getLink() {
        if (linkBuilder_ == null) {
          return link_ == null ? com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link.getDefaultInstance() : link_;
        } else {
          return linkBuilder_.getMessage();
        }
      }
      /**
       * <pre>
       * Destination Link. This is default link object for the ad.
       * Individual assets can also have a link object which applies if the asset is
       * activated (clicked). If the asset doesn't have a link object, the parent
       * link object applies.
       * See ResponseLink definition.
       * REQUIRED by the OpenRTB Native specification.
       * </pre>
       *
       * <code>required .com.iabtechlab.openrtb.v2.NativeResponse.Link link = 3;</code>
       */
      public Builder setLink(com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link value) {
        if (linkBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          link_ = value;
          onChanged();
        } else {
          linkBuilder_.setMessage(value);
        }
        bitField0_ |= 0x00000010;
        return this;
      }
      /**
       * <pre>
       * Destination Link. This is default link object for the ad.
       * Individual assets can also have a link object which applies if the asset is
       * activated (clicked). If the asset doesn't have a link object, the parent
       * link object applies.
       * See ResponseLink definition.
       * REQUIRED by the OpenRTB Native specification.
       * </pre>
       *
       * <code>required .com.iabtechlab.openrtb.v2.NativeResponse.Link link = 3;</code>
       */
      public Builder setLink(
          com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link.Builder builderForValue) {
        if (linkBuilder_ == null) {
          link_ = builderForValue.build();
          onChanged();
        } else {
          linkBuilder_.setMessage(builderForValue.build());
        }
        bitField0_ |= 0x00000010;
        return this;
      }
      /**
       * <pre>
       * Destination Link. This is default link object for the ad.
       * Individual assets can also have a link object which applies if the asset is
       * activated (clicked). If the asset doesn't have a link object, the parent
       * link object applies.
       * See ResponseLink definition.
       * REQUIRED by the OpenRTB Native specification.
       * </pre>
       *
       * <code>required .com.iabtechlab.openrtb.v2.NativeResponse.Link link = 3;</code>
       */
      public Builder mergeLink(com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link value) {
        if (linkBuilder_ == null) {
          if (((bitField0_ & 0x00000010) != 0) &&
              link_ != null &&
              link_ != com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link.getDefaultInstance()) {
            link_ =
              com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link.newBuilder(link_).mergeFrom(value).buildPartial();
          } else {
            link_ = value;
          }
          onChanged();
        } else {
          linkBuilder_.mergeFrom(value);
        }
        bitField0_ |= 0x00000010;
        return this;
      }
      /**
       * <pre>
       * Destination Link. This is default link object for the ad.
       * Individual assets can also have a link object which applies if the asset is
       * activated (clicked). If the asset doesn't have a link object, the parent
       * link object applies.
       * See ResponseLink definition.
       * REQUIRED by the OpenRTB Native specification.
       * </pre>
       *
       * <code>required .com.iabtechlab.openrtb.v2.NativeResponse.Link link = 3;</code>
       */
      public Builder clearLink() {
        if (linkBuilder_ == null) {
          link_ = null;
          onChanged();
        } else {
          linkBuilder_.clear();
        }
        bitField0_ = (bitField0_ & ~0x00000010);
        return this;
      }
      /**
       * <pre>
       * Destination Link. This is default link object for the ad.
       * Individual assets can also have a link object which applies if the asset is
       * activated (clicked). If the asset doesn't have a link object, the parent
       * link object applies.
       * See ResponseLink definition.
       * REQUIRED by the OpenRTB Native specification.
       * </pre>
       *
       * <code>required .com.iabtechlab.openrtb.v2.NativeResponse.Link link = 3;</code>
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link.Builder getLinkBuilder() {
        bitField0_ |= 0x00000010;
        onChanged();
        return getLinkFieldBuilder().getBuilder();
      }
      /**
       * <pre>
       * Destination Link. This is default link object for the ad.
       * Individual assets can also have a link object which applies if the asset is
       * activated (clicked). If the asset doesn't have a link object, the parent
       * link object applies.
       * See ResponseLink definition.
       * REQUIRED by the OpenRTB Native specification.
       * </pre>
       *
       * <code>required .com.iabtechlab.openrtb.v2.NativeResponse.Link link = 3;</code>
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.LinkOrBuilder getLinkOrBuilder() {
        if (linkBuilder_ != null) {
          return linkBuilder_.getMessageOrBuilder();
        } else {
          return link_ == null ?
              com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link.getDefaultInstance() : link_;
        }
      }
      /**
       * <pre>
       * Destination Link. This is default link object for the ad.
       * Individual assets can also have a link object which applies if the asset is
       * activated (clicked). If the asset doesn't have a link object, the parent
       * link object applies.
       * See ResponseLink definition.
       * REQUIRED by the OpenRTB Native specification.
       * </pre>
       *
       * <code>required .com.iabtechlab.openrtb.v2.NativeResponse.Link link = 3;</code>
       */
      private com.google.protobuf.SingleFieldBuilderV3<
          com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link.Builder, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.LinkOrBuilder> 
          getLinkFieldBuilder() {
        if (linkBuilder_ == null) {
          linkBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
              com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.Link.Builder, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.LinkOrBuilder>(
                  getLink(),
                  getParentForChildren(),
                  isClean());
          link_ = null;
        }
        return linkBuilder_;
      }

      private com.google.protobuf.LazyStringList imptrackers_ = com.google.protobuf.LazyStringArrayList.EMPTY;
      private void ensureImptrackersIsMutable() {
        if (!((bitField0_ & 0x00000020) != 0)) {
          imptrackers_ = new com.google.protobuf.LazyStringArrayList(imptrackers_);
          bitField0_ |= 0x00000020;
         }
      }
      /**
       * <pre>
       * Array of impression tracking URLs, expected to return a 1x1 image or
       * 204 response - typically only passed when using 3rd party trackers.
       * To be deprecated in 1.2 - Replaced with EventTracker.
       * </pre>
       *
       * <code>repeated string imptrackers = 4;</code>
       * @return A list containing the imptrackers.
       */
      public com.google.protobuf.ProtocolStringList
          getImptrackersList() {
        return imptrackers_.getUnmodifiableView();
      }
      /**
       * <pre>
       * Array of impression tracking URLs, expected to return a 1x1 image or
       * 204 response - typically only passed when using 3rd party trackers.
       * To be deprecated in 1.2 - Replaced with EventTracker.
       * </pre>
       *
       * <code>repeated string imptrackers = 4;</code>
       * @return The count of imptrackers.
       */
      public int getImptrackersCount() {
        return imptrackers_.size();
      }
      /**
       * <pre>
       * Array of impression tracking URLs, expected to return a 1x1 image or
       * 204 response - typically only passed when using 3rd party trackers.
       * To be deprecated in 1.2 - Replaced with EventTracker.
       * </pre>
       *
       * <code>repeated string imptrackers = 4;</code>
       * @param index The index of the element to return.
       * @return The imptrackers at the given index.
       */
      public java.lang.String getImptrackers(int index) {
        return imptrackers_.get(index);
      }
      /**
       * <pre>
       * Array of impression tracking URLs, expected to return a 1x1 image or
       * 204 response - typically only passed when using 3rd party trackers.
       * To be deprecated in 1.2 - Replaced with EventTracker.
       * </pre>
       *
       * <code>repeated string imptrackers = 4;</code>
       * @param index The index of the value to return.
       * @return The bytes of the imptrackers at the given index.
       */
      public com.google.protobuf.ByteString
          getImptrackersBytes(int index) {
        return imptrackers_.getByteString(index);
      }
      /**
       * <pre>
       * Array of impression tracking URLs, expected to return a 1x1 image or
       * 204 response - typically only passed when using 3rd party trackers.
       * To be deprecated in 1.2 - Replaced with EventTracker.
       * </pre>
       *
       * <code>repeated string imptrackers = 4;</code>
       * @param index The index to set the value at.
       * @param value The imptrackers to set.
       * @return This builder for chaining.
       */
      public Builder setImptrackers(
          int index, java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureImptrackersIsMutable();
        imptrackers_.set(index, value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Array of impression tracking URLs, expected to return a 1x1 image or
       * 204 response - typically only passed when using 3rd party trackers.
       * To be deprecated in 1.2 - Replaced with EventTracker.
       * </pre>
       *
       * <code>repeated string imptrackers = 4;</code>
       * @param value The imptrackers to add.
       * @return This builder for chaining.
       */
      public Builder addImptrackers(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureImptrackersIsMutable();
        imptrackers_.add(value);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Array of impression tracking URLs, expected to return a 1x1 image or
       * 204 response - typically only passed when using 3rd party trackers.
       * To be deprecated in 1.2 - Replaced with EventTracker.
       * </pre>
       *
       * <code>repeated string imptrackers = 4;</code>
       * @param values The imptrackers to add.
       * @return This builder for chaining.
       */
      public Builder addAllImptrackers(
          java.lang.Iterable<java.lang.String> values) {
        ensureImptrackersIsMutable();
        com.google.protobuf.AbstractMessageLite.Builder.addAll(
            values, imptrackers_);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Array of impression tracking URLs, expected to return a 1x1 image or
       * 204 response - typically only passed when using 3rd party trackers.
       * To be deprecated in 1.2 - Replaced with EventTracker.
       * </pre>
       *
       * <code>repeated string imptrackers = 4;</code>
       * @return This builder for chaining.
       */
      public Builder clearImptrackers() {
        imptrackers_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        bitField0_ = (bitField0_ & ~0x00000020);
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Array of impression tracking URLs, expected to return a 1x1 image or
       * 204 response - typically only passed when using 3rd party trackers.
       * To be deprecated in 1.2 - Replaced with EventTracker.
       * </pre>
       *
       * <code>repeated string imptrackers = 4;</code>
       * @param value The bytes of the imptrackers to add.
       * @return This builder for chaining.
       */
      public Builder addImptrackersBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  ensureImptrackersIsMutable();
        imptrackers_.add(value);
        onChanged();
        return this;
      }

      private java.lang.Object jstracker_ = "";
      /**
       * <pre>
       * Optional javascript impression tracker. Contains &lt;script&gt; tags to be
       * executed at impression time where it can be supported.
       * To be deprecated in 1.2 - Replaced with EventTracker.
       * </pre>
       *
       * <code>optional string jstracker = 5;</code>
       * @return Whether the jstracker field is set.
       */
      public boolean hasJstracker() {
        return ((bitField0_ & 0x00000040) != 0);
      }
      /**
       * <pre>
       * Optional javascript impression tracker. Contains &lt;script&gt; tags to be
       * executed at impression time where it can be supported.
       * To be deprecated in 1.2 - Replaced with EventTracker.
       * </pre>
       *
       * <code>optional string jstracker = 5;</code>
       * @return The jstracker.
       */
      public java.lang.String getJstracker() {
        java.lang.Object ref = jstracker_;
        if (!(ref instanceof java.lang.String)) {
          com.google.protobuf.ByteString bs =
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            jstracker_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * Optional javascript impression tracker. Contains &lt;script&gt; tags to be
       * executed at impression time where it can be supported.
       * To be deprecated in 1.2 - Replaced with EventTracker.
       * </pre>
       *
       * <code>optional string jstracker = 5;</code>
       * @return The bytes for jstracker.
       */
      public com.google.protobuf.ByteString
          getJstrackerBytes() {
        java.lang.Object ref = jstracker_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          jstracker_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * Optional javascript impression tracker. Contains &lt;script&gt; tags to be
       * executed at impression time where it can be supported.
       * To be deprecated in 1.2 - Replaced with EventTracker.
       * </pre>
       *
       * <code>optional string jstracker = 5;</code>
       * @param value The jstracker to set.
       * @return This builder for chaining.
       */
      public Builder setJstracker(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000040;
        jstracker_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Optional javascript impression tracker. Contains &lt;script&gt; tags to be
       * executed at impression time where it can be supported.
       * To be deprecated in 1.2 - Replaced with EventTracker.
       * </pre>
       *
       * <code>optional string jstracker = 5;</code>
       * @return This builder for chaining.
       */
      public Builder clearJstracker() {
        bitField0_ = (bitField0_ & ~0x00000040);
        jstracker_ = getDefaultInstance().getJstracker();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * Optional javascript impression tracker. Contains &lt;script&gt; tags to be
       * executed at impression time where it can be supported.
       * To be deprecated in 1.2 - Replaced with EventTracker.
       * </pre>
       *
       * <code>optional string jstracker = 5;</code>
       * @param value The bytes for jstracker to set.
       * @return This builder for chaining.
       */
      public Builder setJstrackerBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000040;
        jstracker_ = value;
        onChanged();
        return this;
      }

      private java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker> eventtrackers_ =
        java.util.Collections.emptyList();
      private void ensureEventtrackersIsMutable() {
        if (!((bitField0_ & 0x00000080) != 0)) {
          eventtrackers_ = new java.util.ArrayList<com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker>(eventtrackers_);
          bitField0_ |= 0x00000080;
         }
      }

      private com.google.protobuf.RepeatedFieldBuilderV3<
          com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker.Builder, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTrackerOrBuilder> eventtrackersBuilder_;

      /**
       * <pre>
       * Array of response event trackers to run with the ad, in response to the
       * declared supported methods in the NativeRequest. Replaces imptrackers and
       * jstrackers.
       * Implemented in 1.2
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.EventTracker eventtrackers = 8;</code>
       */
      public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker> getEventtrackersList() {
        if (eventtrackersBuilder_ == null) {
          return java.util.Collections.unmodifiableList(eventtrackers_);
        } else {
          return eventtrackersBuilder_.getMessageList();
        }
      }
      /**
       * <pre>
       * Array of response event trackers to run with the ad, in response to the
       * declared supported methods in the NativeRequest. Replaces imptrackers and
       * jstrackers.
       * Implemented in 1.2
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.EventTracker eventtrackers = 8;</code>
       */
      public int getEventtrackersCount() {
        if (eventtrackersBuilder_ == null) {
          return eventtrackers_.size();
        } else {
          return eventtrackersBuilder_.getCount();
        }
      }
      /**
       * <pre>
       * Array of response event trackers to run with the ad, in response to the
       * declared supported methods in the NativeRequest. Replaces imptrackers and
       * jstrackers.
       * Implemented in 1.2
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.EventTracker eventtrackers = 8;</code>
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker getEventtrackers(int index) {
        if (eventtrackersBuilder_ == null) {
          return eventtrackers_.get(index);
        } else {
          return eventtrackersBuilder_.getMessage(index);
        }
      }
      /**
       * <pre>
       * Array of response event trackers to run with the ad, in response to the
       * declared supported methods in the NativeRequest. Replaces imptrackers and
       * jstrackers.
       * Implemented in 1.2
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.EventTracker eventtrackers = 8;</code>
       */
      public Builder setEventtrackers(
          int index, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker value) {
        if (eventtrackersBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureEventtrackersIsMutable();
          eventtrackers_.set(index, value);
          onChanged();
        } else {
          eventtrackersBuilder_.setMessage(index, value);
        }
        return this;
      }
      /**
       * <pre>
       * Array of response event trackers to run with the ad, in response to the
       * declared supported methods in the NativeRequest. Replaces imptrackers and
       * jstrackers.
       * Implemented in 1.2
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.EventTracker eventtrackers = 8;</code>
       */
      public Builder setEventtrackers(
          int index, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker.Builder builderForValue) {
        if (eventtrackersBuilder_ == null) {
          ensureEventtrackersIsMutable();
          eventtrackers_.set(index, builderForValue.build());
          onChanged();
        } else {
          eventtrackersBuilder_.setMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * <pre>
       * Array of response event trackers to run with the ad, in response to the
       * declared supported methods in the NativeRequest. Replaces imptrackers and
       * jstrackers.
       * Implemented in 1.2
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.EventTracker eventtrackers = 8;</code>
       */
      public Builder addEventtrackers(com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker value) {
        if (eventtrackersBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureEventtrackersIsMutable();
          eventtrackers_.add(value);
          onChanged();
        } else {
          eventtrackersBuilder_.addMessage(value);
        }
        return this;
      }
      /**
       * <pre>
       * Array of response event trackers to run with the ad, in response to the
       * declared supported methods in the NativeRequest. Replaces imptrackers and
       * jstrackers.
       * Implemented in 1.2
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.EventTracker eventtrackers = 8;</code>
       */
      public Builder addEventtrackers(
          int index, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker value) {
        if (eventtrackersBuilder_ == null) {
          if (value == null) {
            throw new NullPointerException();
          }
          ensureEventtrackersIsMutable();
          eventtrackers_.add(index, value);
          onChanged();
        } else {
          eventtrackersBuilder_.addMessage(index, value);
        }
        return this;
      }
      /**
       * <pre>
       * Array of response event trackers to run with the ad, in response to the
       * declared supported methods in the NativeRequest. Replaces imptrackers and
       * jstrackers.
       * Implemented in 1.2
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.EventTracker eventtrackers = 8;</code>
       */
      public Builder addEventtrackers(
          com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker.Builder builderForValue) {
        if (eventtrackersBuilder_ == null) {
          ensureEventtrackersIsMutable();
          eventtrackers_.add(builderForValue.build());
          onChanged();
        } else {
          eventtrackersBuilder_.addMessage(builderForValue.build());
        }
        return this;
      }
      /**
       * <pre>
       * Array of response event trackers to run with the ad, in response to the
       * declared supported methods in the NativeRequest. Replaces imptrackers and
       * jstrackers.
       * Implemented in 1.2
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.EventTracker eventtrackers = 8;</code>
       */
      public Builder addEventtrackers(
          int index, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker.Builder builderForValue) {
        if (eventtrackersBuilder_ == null) {
          ensureEventtrackersIsMutable();
          eventtrackers_.add(index, builderForValue.build());
          onChanged();
        } else {
          eventtrackersBuilder_.addMessage(index, builderForValue.build());
        }
        return this;
      }
      /**
       * <pre>
       * Array of response event trackers to run with the ad, in response to the
       * declared supported methods in the NativeRequest. Replaces imptrackers and
       * jstrackers.
       * Implemented in 1.2
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.EventTracker eventtrackers = 8;</code>
       */
      public Builder addAllEventtrackers(
          java.lang.Iterable<? extends com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker> values) {
        if (eventtrackersBuilder_ == null) {
          ensureEventtrackersIsMutable();
          com.google.protobuf.AbstractMessageLite.Builder.addAll(
              values, eventtrackers_);
          onChanged();
        } else {
          eventtrackersBuilder_.addAllMessages(values);
        }
        return this;
      }
      /**
       * <pre>
       * Array of response event trackers to run with the ad, in response to the
       * declared supported methods in the NativeRequest. Replaces imptrackers and
       * jstrackers.
       * Implemented in 1.2
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.EventTracker eventtrackers = 8;</code>
       */
      public Builder clearEventtrackers() {
        if (eventtrackersBuilder_ == null) {
          eventtrackers_ = java.util.Collections.emptyList();
          bitField0_ = (bitField0_ & ~0x00000080);
          onChanged();
        } else {
          eventtrackersBuilder_.clear();
        }
        return this;
      }
      /**
       * <pre>
       * Array of response event trackers to run with the ad, in response to the
       * declared supported methods in the NativeRequest. Replaces imptrackers and
       * jstrackers.
       * Implemented in 1.2
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.EventTracker eventtrackers = 8;</code>
       */
      public Builder removeEventtrackers(int index) {
        if (eventtrackersBuilder_ == null) {
          ensureEventtrackersIsMutable();
          eventtrackers_.remove(index);
          onChanged();
        } else {
          eventtrackersBuilder_.remove(index);
        }
        return this;
      }
      /**
       * <pre>
       * Array of response event trackers to run with the ad, in response to the
       * declared supported methods in the NativeRequest. Replaces imptrackers and
       * jstrackers.
       * Implemented in 1.2
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.EventTracker eventtrackers = 8;</code>
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker.Builder getEventtrackersBuilder(
          int index) {
        return getEventtrackersFieldBuilder().getBuilder(index);
      }
      /**
       * <pre>
       * Array of response event trackers to run with the ad, in response to the
       * declared supported methods in the NativeRequest. Replaces imptrackers and
       * jstrackers.
       * Implemented in 1.2
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.EventTracker eventtrackers = 8;</code>
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTrackerOrBuilder getEventtrackersOrBuilder(
          int index) {
        if (eventtrackersBuilder_ == null) {
          return eventtrackers_.get(index);  } else {
          return eventtrackersBuilder_.getMessageOrBuilder(index);
        }
      }
      /**
       * <pre>
       * Array of response event trackers to run with the ad, in response to the
       * declared supported methods in the NativeRequest. Replaces imptrackers and
       * jstrackers.
       * Implemented in 1.2
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.EventTracker eventtrackers = 8;</code>
       */
      public java.util.List<? extends com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTrackerOrBuilder> 
           getEventtrackersOrBuilderList() {
        if (eventtrackersBuilder_ != null) {
          return eventtrackersBuilder_.getMessageOrBuilderList();
        } else {
          return java.util.Collections.unmodifiableList(eventtrackers_);
        }
      }
      /**
       * <pre>
       * Array of response event trackers to run with the ad, in response to the
       * declared supported methods in the NativeRequest. Replaces imptrackers and
       * jstrackers.
       * Implemented in 1.2
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.EventTracker eventtrackers = 8;</code>
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker.Builder addEventtrackersBuilder() {
        return getEventtrackersFieldBuilder().addBuilder(
            com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker.getDefaultInstance());
      }
      /**
       * <pre>
       * Array of response event trackers to run with the ad, in response to the
       * declared supported methods in the NativeRequest. Replaces imptrackers and
       * jstrackers.
       * Implemented in 1.2
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.EventTracker eventtrackers = 8;</code>
       */
      public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker.Builder addEventtrackersBuilder(
          int index) {
        return getEventtrackersFieldBuilder().addBuilder(
            index, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker.getDefaultInstance());
      }
      /**
       * <pre>
       * Array of response event trackers to run with the ad, in response to the
       * declared supported methods in the NativeRequest. Replaces imptrackers and
       * jstrackers.
       * Implemented in 1.2
       * </pre>
       *
       * <code>repeated .com.iabtechlab.openrtb.v2.NativeResponse.EventTracker eventtrackers = 8;</code>
       */
      public java.util.List<com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker.Builder> 
           getEventtrackersBuilderList() {
        return getEventtrackersFieldBuilder().getBuilderList();
      }
      private com.google.protobuf.RepeatedFieldBuilderV3<
          com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker.Builder, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTrackerOrBuilder> 
          getEventtrackersFieldBuilder() {
        if (eventtrackersBuilder_ == null) {
          eventtrackersBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
              com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTracker.Builder, com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse.EventTrackerOrBuilder>(
                  eventtrackers_,
                  ((bitField0_ & 0x00000080) != 0),
                  getParentForChildren(),
                  isClean());
          eventtrackers_ = null;
        }
        return eventtrackersBuilder_;
      }

      private java.lang.Object privacy_ = "";
      /**
       * <pre>
       * If support was indicated in the request, URL of a page informing the user
       * about the buyer's targeting activity.
       * Implemented in 1.2
       * </pre>
       *
       * <code>optional string privacy = 9;</code>
       * @return Whether the privacy field is set.
       */
      public boolean hasPrivacy() {
        return ((bitField0_ & 0x00000100) != 0);
      }
      /**
       * <pre>
       * If support was indicated in the request, URL of a page informing the user
       * about the buyer's targeting activity.
       * Implemented in 1.2
       * </pre>
       *
       * <code>optional string privacy = 9;</code>
       * @return The privacy.
       */
      public java.lang.String getPrivacy() {
        java.lang.Object ref = privacy_;
        if (!(ref instanceof java.lang.String)) {
          com.google.protobuf.ByteString bs =
              (com.google.protobuf.ByteString) ref;
          java.lang.String s = bs.toStringUtf8();
          if (bs.isValidUtf8()) {
            privacy_ = s;
          }
          return s;
        } else {
          return (java.lang.String) ref;
        }
      }
      /**
       * <pre>
       * If support was indicated in the request, URL of a page informing the user
       * about the buyer's targeting activity.
       * Implemented in 1.2
       * </pre>
       *
       * <code>optional string privacy = 9;</code>
       * @return The bytes for privacy.
       */
      public com.google.protobuf.ByteString
          getPrivacyBytes() {
        java.lang.Object ref = privacy_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8(
                  (java.lang.String) ref);
          privacy_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      /**
       * <pre>
       * If support was indicated in the request, URL of a page informing the user
       * about the buyer's targeting activity.
       * Implemented in 1.2
       * </pre>
       *
       * <code>optional string privacy = 9;</code>
       * @param value The privacy to set.
       * @return This builder for chaining.
       */
      public Builder setPrivacy(
          java.lang.String value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000100;
        privacy_ = value;
        onChanged();
        return this;
      }
      /**
       * <pre>
       * If support was indicated in the request, URL of a page informing the user
       * about the buyer's targeting activity.
       * Implemented in 1.2
       * </pre>
       *
       * <code>optional string privacy = 9;</code>
       * @return This builder for chaining.
       */
      public Builder clearPrivacy() {
        bitField0_ = (bitField0_ & ~0x00000100);
        privacy_ = getDefaultInstance().getPrivacy();
        onChanged();
        return this;
      }
      /**
       * <pre>
       * If support was indicated in the request, URL of a page informing the user
       * about the buyer's targeting activity.
       * Implemented in 1.2
       * </pre>
       *
       * <code>optional string privacy = 9;</code>
       * @param value The bytes for privacy to set.
       * @return This builder for chaining.
       */
      public Builder setPrivacyBytes(
          com.google.protobuf.ByteString value) {
        if (value == null) {
    throw new NullPointerException();
  }
  bitField0_ |= 0x00000100;
        privacy_ = value;
        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:com.iabtechlab.openrtb.v2.NativeResponse)
    }

    // @@protoc_insertion_point(class_scope:com.iabtechlab.openrtb.v2.NativeResponse)
    private static final com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse DEFAULT_INSTANCE;
    static {
      DEFAULT_INSTANCE = new com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse();
    }

    public static com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse getDefaultInstance() {
      return DEFAULT_INSTANCE;
    }

    @java.lang.Deprecated public static final com.google.protobuf.Parser<NativeResponse>
        PARSER = new com.google.protobuf.AbstractParser<NativeResponse>() {
      @java.lang.Override
      public NativeResponse parsePartialFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return new NativeResponse(input, extensionRegistry);
      }
    };

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

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

    @java.lang.Override
    public com.iabtechlab.openrtb.v2.OpenRtb.NativeResponse getDefaultInstanceForType() {
      return DEFAULT_INSTANCE;
    }

  }

  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Source_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_Source_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Metric_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Metric_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Banner_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Banner_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Banner_Format_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Banner_Format_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Video_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Video_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Video_CompanionAd_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Video_CompanionAd_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Audio_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Audio_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Native_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Native_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Qty_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Qty_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Refresh_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Refresh_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Refresh_RefSettings_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Refresh_RefSettings_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Pmp_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Pmp_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Pmp_Deal_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Pmp_Deal_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Site_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_Site_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_App_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_App_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Dooh_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_Dooh_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Publisher_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_Publisher_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Content_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_Content_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Producer_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_Producer_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Network_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_Network_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Channel_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_Channel_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Device_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_Device_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Geo_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_Geo_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_UserAgent_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_UserAgent_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_BrandVersion_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_BrandVersion_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_User_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_User_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Data_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_Data_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Data_Segment_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_Data_Segment_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Regs_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_Regs_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_BidResponse_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_BidResponse_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_BidResponse_SeatBid_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_BidResponse_SeatBid_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_BidResponse_SeatBid_Bid_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_BidResponse_SeatBid_Bid_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_NativeRequest_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_NativeRequest_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_NativeRequest_Asset_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_NativeRequest_Asset_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_NativeRequest_Asset_Title_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_NativeRequest_Asset_Title_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_NativeRequest_Asset_Image_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_NativeRequest_Asset_Image_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_NativeRequest_Asset_Data_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_NativeRequest_Asset_Data_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_NativeRequest_EventTrackers_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_NativeRequest_EventTrackers_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_NativeResponse_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_NativeResponse_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Link_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Link_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_Title_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_Title_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_Image_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_Image_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_Data_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_Data_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_Video_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_Video_fieldAccessorTable;
  private static final com.google.protobuf.Descriptors.Descriptor
    internal_static_com_iabtechlab_openrtb_v2_NativeResponse_EventTracker_descriptor;
  private static final 
    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
      internal_static_com_iabtechlab_openrtb_v2_NativeResponse_EventTracker_fieldAccessorTable;

  public static com.google.protobuf.Descriptors.FileDescriptor
      getDescriptor() {
    return descriptor;
  }
  private static  com.google.protobuf.Descriptors.FileDescriptor
      descriptor;
  static {
    java.lang.String[] descriptorData = {
      "\n\ropenrtb.proto\022\031com.iabtechlab.openrtb." +
      "v2\"\205=\n\nBidRequest\022\n\n\002id\030\001 \002(\t\0226\n\003imp\030\002 \003" +
      "(\0132).com.iabtechlab.openrtb.v2.BidReques" +
      "t.Imp\022:\n\004site\030\003 \001(\0132*.com.iabtechlab.ope" +
      "nrtb.v2.BidRequest.SiteH\000\0228\n\003app\030\004 \001(\0132)" +
      ".com.iabtechlab.openrtb.v2.BidRequest.Ap" +
      "pH\000\022:\n\004dooh\030\026 \001(\0132*.com.iabtechlab.openr" +
      "tb.v2.BidRequest.DoohH\000\022<\n\006device\030\005 \001(\0132" +
      ",.com.iabtechlab.openrtb.v2.BidRequest.D" +
      "evice\0228\n\004regs\030\016 \001(\0132*.com.iabtechlab.ope" +
      "nrtb.v2.BidRequest.Regs\0228\n\004user\030\006 \001(\0132*." +
      "com.iabtechlab.openrtb.v2.BidRequest.Use" +
      "r\022\r\n\002at\030\007 \001(\005:\0012\022\014\n\004tmax\030\010 \001(\005\022\r\n\005wseat\030" +
      "\t \003(\t\022\026\n\007allimps\030\n \001(\010:\005false\022\013\n\003cur\030\013 \003" +
      "(\t\022\014\n\004bcat\030\014 \003(\t\022\021\n\006cattax\030\025 \001(\005:\0011\022\014\n\004b" +
      "adv\030\r \003(\t\022\014\n\004bapp\030\020 \003(\t\022\023\n\004test\030\017 \001(\010:\005f" +
      "alse\022\r\n\005bseat\030\021 \003(\t\022\r\n\005wlang\030\022 \003(\t\022\016\n\006wl" +
      "angb\030\024 \003(\t\022<\n\006source\030\023 \001(\0132,.com.iabtech" +
      "lab.openrtb.v2.BidRequest.Source\0328\n\006Sour" +
      "ce\022\n\n\002fd\030\001 \001(\010\022\013\n\003tid\030\002 \001(\t\022\016\n\006pchain\030\003 " +
      "\001(\t*\005\010d\020\220N\032\242\032\n\003Imp\022\n\n\002id\030\001 \002(\t\022@\n\006banner" +
      "\030\002 \001(\01320.com.iabtechlab.openrtb.v2.BidRe" +
      "quest.Imp.Banner\022>\n\005video\030\003 \001(\0132/.com.ia" +
      "btechlab.openrtb.v2.BidRequest.Imp.Video" +
      "\022>\n\005audio\030\017 \001(\0132/.com.iabtechlab.openrtb" +
      ".v2.BidRequest.Imp.Audio\022\026\n\016displaymanag" +
      "er\030\004 \001(\t\022\031\n\021displaymanagerver\030\005 \001(\t\022\r\n\005i" +
      "nstl\030\006 \001(\010\022\r\n\005tagid\030\007 \001(\t\022\023\n\010bidfloor\030\010 " +
      "\001(\001:\0010\022\030\n\013bidfloorcur\030\t \001(\t:\003USD\022\024\n\014clic" +
      "kbrowser\030\020 \001(\010\022\016\n\006secure\030\014 \001(\010\022\024\n\014iframe" +
      "buster\030\n \003(\t\022\023\n\004rwdd\030\022 \001(\010:\005false\022\017\n\004ssa" +
      "i\030\023 \001(\005:\0010\022:\n\003pmp\030\013 \001(\0132-.com.iabtechlab" +
      ".openrtb.v2.BidRequest.Imp.Pmp\022@\n\006native" +
      "\030\r \001(\01320.com.iabtechlab.openrtb.v2.BidRe" +
      "quest.Imp.Native\022\013\n\003exp\030\016 \001(\005\022@\n\006metric\030" +
      "\021 \003(\01320.com.iabtechlab.openrtb.v2.BidReq" +
      "uest.Imp.Metric\022:\n\003qty\030\024 \001(\0132-.com.iabte" +
      "chlab.openrtb.v2.BidRequest.Imp.Qty\022\n\n\002d" +
      "t\030\025 \001(\001\022B\n\007refresh\030\026 \001(\01321.com.iabtechla" +
      "b.openrtb.v2.BidRequest.Imp.Refresh\032<\n\006M" +
      "etric\022\014\n\004type\030\001 \001(\t\022\r\n\005value\030\002 \001(\001\022\016\n\006ve" +
      "ndor\030\003 \001(\t*\005\010d\020\220N\032\235\003\n\006Banner\022\t\n\001w\030\001 \001(\005\022" +
      "\t\n\001h\030\002 \001(\005\022G\n\006format\030\017 \003(\01327.com.iabtech" +
      "lab.openrtb.v2.BidRequest.Imp.Banner.For" +
      "mat\022\020\n\004wmax\030\013 \001(\005B\002\030\001\022\020\n\004hmax\030\014 \001(\005B\002\030\001\022" +
      "\020\n\004wmin\030\r \001(\005B\002\030\001\022\020\n\004hmin\030\016 \001(\005B\002\030\001\022\n\n\002i" +
      "d\030\003 \001(\t\022\013\n\003pos\030\004 \001(\005\022\021\n\005btype\030\005 \003(\005B\002\020\001\022" +
      "\021\n\005battr\030\006 \003(\005B\002\020\001\022\r\n\005mimes\030\007 \003(\t\022\020\n\010top" +
      "frame\030\010 \001(\010\022\022\n\006expdir\030\t \003(\005B\002\020\001\022\017\n\003api\030\n" +
      " \003(\005B\002\020\001\022\013\n\003vcm\030\020 \001(\010\032S\n\006Format\022\t\n\001w\030\001 \001" +
      "(\005\022\t\n\001h\030\002 \001(\005\022\016\n\006wratio\030\003 \001(\005\022\016\n\006hratio\030" +
      "\004 \001(\005\022\014\n\004wmin\030\005 \001(\005*\005\010d\020\220N*\005\010d\020\220N\032\212\007\n\005Vi" +
      "deo\022\r\n\005mimes\030\001 \003(\t\022\021\n\tlinearity\030\002 \001(\005\022\023\n" +
      "\013minduration\030\003 \001(\005\022\023\n\013maxduration\030\004 \001(\005\022" +
      "\024\n\010protocol\030\005 \001(\005B\002\030\001\022\025\n\tprotocols\030\025 \003(\005" +
      "B\002\020\001\022\t\n\001w\030\006 \001(\005\022\t\n\001h\030\007 \001(\005\022\022\n\nstartdelay" +
      "\030\010 \001(\005\022\016\n\006maxseq\030\034 \001(\005\022\016\n\006poddur\030\035 \001(\005\022\014" +
      "\n\004skip\030\027 \001(\010\022\017\n\007skipmin\030\030 \001(\005\022\021\n\tskipaft" +
      "er\030\031 \001(\005\022\027\n\010sequence\030\t \001(\005:\0011B\002\030\001\022\024\n\tslo" +
      "tinpod\030! \001(\005:\0010\022\024\n\014mincpmpersec\030\" \001(\001\022\021\n" +
      "\005battr\030\n \003(\005B\002\020\001\022\023\n\013maxextended\030\013 \001(\005\022\022\n" +
      "\nminbitrate\030\014 \001(\005\022\022\n\nmaxbitrate\030\r \001(\005\022\033\n" +
      "\rboxingallowed\030\016 \001(\010:\004true\022\032\n\016playbackme" +
      "thod\030\017 \003(\005B\002\020\001\022\024\n\010delivery\030\020 \003(\005B\002\020\001\022\013\n\003" +
      "pos\030\021 \001(\005\022E\n\013companionad\030\022 \003(\01320.com.iab" +
      "techlab.openrtb.v2.BidRequest.Imp.Banner" +
      "\022W\n\016companionad_21\030\026 \001(\0132;.com.iabtechla" +
      "b.openrtb.v2.BidRequest.Imp.Video.Compan" +
      "ionAdB\002\030\001\022\017\n\003api\030\023 \003(\005B\002\020\001\022\031\n\rcompaniont" +
      "ype\030\024 \003(\005B\002\020\001\022\r\n\005podid\030\036 \001(\t\022\021\n\006podseq\030\037" +
      " \001(\005:\0010\022\023\n\007rqddurs\030  \003(\005B\002\020\001\022\025\n\tplacemen" +
      "t\030\032 \001(\005B\002\030\001\022\r\n\005plcmt\030# \001(\005\022\023\n\013playbacken" +
      "d\030\033 \001(\005\032V\n\013CompanionAd\022@\n\006banner\030\001 \003(\01320" +
      ".com.iabtechlab.openrtb.v2.BidRequest.Im" +
      "p.Banner*\005\010d\020\220N*\005\010d\020\220N\032\225\004\n\005Audio\022\r\n\005mime" +
      "s\030\001 \003(\t\022\023\n\013minduration\030\002 \001(\005\022\023\n\013maxdurat" +
      "ion\030\003 \001(\005\022\016\n\006poddur\030\031 \001(\005\022\025\n\tprotocols\030\004" +
      " \003(\005B\002\020\001\022\022\n\nstartdelay\030\005 \001(\005\022\023\n\007rqddurs\030" +
      "\032 \003(\005B\002\020\001\022\r\n\005podid\030\033 \001(\t\022\021\n\006podseq\030\034 \001(\005" +
      ":\0010\022\027\n\010sequence\030\006 \001(\005:\0011B\002\030\001\022\024\n\tslotinpo" +
      "d\030\035 \001(\005:\0010\022\024\n\014mincpmpersec\030\036 \001(\001\022\021\n\005batt" +
      "r\030\007 \003(\005B\002\020\001\022\023\n\013maxextended\030\010 \001(\005\022\022\n\nminb" +
      "itrate\030\t \001(\005\022\022\n\nmaxbitrate\030\n \001(\005\022\024\n\010deli" +
      "very\030\013 \003(\005B\002\020\001\022E\n\013companionad\030\014 \003(\01320.co" +
      "m.iabtechlab.openrtb.v2.BidRequest.Imp.B" +
      "anner\022\017\n\003api\030\r \003(\005B\002\020\001\022\031\n\rcompaniontype\030" +
      "\024 \003(\005B\002\020\001\022\016\n\006maxseq\030\025 \001(\005\022\014\n\004feed\030\026 \001(\005\022" +
      "\020\n\010stitched\030\027 \001(\010\022\014\n\004nvol\030\030 \001(\005*\005\010d\020\220N\032\250" +
      "\001\n\006Native\022\021\n\007request\030\001 \001(\tH\000\022B\n\016request_" +
      "native\0302 \001(\0132(.com.iabtechlab.openrtb.v2" +
      ".NativeRequestH\000\022\013\n\003ver\030\002 \001(\t\022\017\n\003api\030\003 \003" +
      "(\005B\002\020\001\022\021\n\005battr\030\004 \003(\005B\002\020\001*\005\010d\020\220NB\017\n\rrequ" +
      "est_oneof\032D\n\003Qty\022\022\n\nmultiplier\030\001 \001(\001\022\022\n\n" +
      "sourcetype\030\002 \001(\005\022\016\n\006vendor\030\003 \001(\t*\005\010d\020\220N\032" +
      "\255\001\n\007Refresh\022R\n\013refsettings\030\001 \003(\0132=.com.i" +
      "abtechlab.openrtb.v2.BidRequest.Imp.Refr" +
      "esh.RefSettings\022\r\n\005count\030\002 \001(\005\0328\n\013RefSet" +
      "tings\022\022\n\007reftype\030\001 \001(\005:\0010\022\016\n\006minint\030\002 \001(" +
      "\005*\005\010d\020\220N*\005\010d\020\220N\032\346\001\n\003Pmp\022\036\n\017private_aucti" +
      "on\030\001 \001(\010:\005false\022A\n\005deals\030\002 \003(\01322.com.iab" +
      "techlab.openrtb.v2.BidRequest.Imp.Pmp.De" +
      "al\032u\n\004Deal\022\n\n\002id\030\001 \002(\t\022\023\n\010bidfloor\030\002 \001(\001" +
      ":\0010\022\030\n\013bidfloorcur\030\003 \001(\t:\003USD\022\r\n\005wseat\030\004" +
      " \003(\t\022\020\n\010wadomain\030\005 \003(\t\022\n\n\002at\030\006 \001(\005*\005\010d\020\220" +
      "N*\005\010d\020\220N*\005\010d\020\220N\032\344\002\n\004Site\022\n\n\002id\030\001 \001(\t\022\014\n\004" +
      "name\030\002 \001(\t\022\016\n\006domain\030\003 \001(\t\022\021\n\006cattax\030\020 \001" +
      "(\005:\0011\022\013\n\003cat\030\004 \003(\t\022\022\n\nsectioncat\030\005 \003(\t\022\017" +
      "\n\007pagecat\030\006 \003(\t\022\014\n\004page\030\007 \001(\t\022\025\n\rprivacy" +
      "policy\030\010 \001(\010\022\013\n\003ref\030\t \001(\t\022\016\n\006search\030\n \001(" +
      "\t\022B\n\tpublisher\030\013 \001(\0132/.com.iabtechlab.op" +
      "enrtb.v2.BidRequest.Publisher\022>\n\007content" +
      "\030\014 \001(\0132-.com.iabtechlab.openrtb.v2.BidRe" +
      "quest.Content\022\020\n\010keywords\030\r \001(\t\022\016\n\006mobil" +
      "e\030\017 \001(\010*\005\010d\020\220N\032\345\002\n\003App\022\n\n\002id\030\001 \001(\t\022\014\n\004na" +
      "me\030\002 \001(\t\022\016\n\006domain\030\003 \001(\t\022\021\n\006cattax\030\021 \001(\005" +
      ":\0011\022\013\n\003cat\030\004 \003(\t\022\022\n\nsectioncat\030\005 \003(\t\022\017\n\007" +
      "pagecat\030\006 \003(\t\022\013\n\003ver\030\007 \001(\t\022\016\n\006bundle\030\010 \001" +
      "(\t\022\025\n\rprivacypolicy\030\t \001(\010\022\014\n\004paid\030\n \001(\010\022" +
      "B\n\tpublisher\030\013 \001(\0132/.com.iabtechlab.open" +
      "rtb.v2.BidRequest.Publisher\022>\n\007content\030\014" +
      " \001(\0132-.com.iabtechlab.openrtb.v2.BidRequ" +
      "est.Content\022\020\n\010keywords\030\r \001(\t\022\020\n\010storeur" +
      "l\030\020 \001(\t*\005\010d\020\220N\032\371\001\n\004Dooh\022\n\n\002id\030\001 \001(\t\022\014\n\004n" +
      "ame\030\002 \001(\t\022\021\n\tvenuetype\030\003 \003(\t\022\027\n\014venuetyp" +
      "etax\030\004 \001(\005:\0011\022B\n\tpublisher\030\005 \001(\0132/.com.i" +
      "abtechlab.openrtb.v2.BidRequest.Publishe" +
      "r\022\016\n\006domain\030\006 \001(\t\022\020\n\010keywords\030\007 \001(\t\022>\n\007c" +
      "ontent\030\010 \001(\0132-.com.iabtechlab.openrtb.v2" +
      ".BidRequest.Content*\005\010d\020\220N\032\\\n\tPublisher\022" +
      "\n\n\002id\030\001 \001(\t\022\014\n\004name\030\002 \001(\t\022\021\n\006cattax\030\005 \001(" +
      "\005:\0011\022\013\n\003cat\030\003 \003(\t\022\016\n\006domain\030\004 \001(\t*\005\010d\020\220N" +
      "\032\334\005\n\007Content\022\n\n\002id\030\001 \001(\t\022\017\n\007episode\030\002 \001(" +
      "\005\022\r\n\005title\030\003 \001(\t\022\016\n\006series\030\004 \001(\t\022\016\n\006seas" +
      "on\030\005 \001(\t\022\016\n\006artist\030\025 \001(\t\022\r\n\005genre\030\026 \001(\t\022" +
      "\r\n\005album\030\027 \001(\t\022\014\n\004isrc\030\030 \001(\t\022\013\n\003url\030\006 \001(" +
      "\t\022\021\n\006cattax\030\033 \001(\005:\0011\022\013\n\003cat\030\007 \003(\t\022\r\n\005pro" +
      "dq\030\031 \001(\005\022\030\n\014videoquality\030\010 \001(\005B\002\030\001\022\020\n\010ke" +
      "ywords\030\t \001(\t\022\025\n\rcontentrating\030\n \001(\t\022\022\n\nu" +
      "serrating\030\013 \001(\t\022\017\n\007context\030\024 \001(\005\022\022\n\ncont" +
      "ext_22\030\014 \001(\t\022\022\n\nlivestream\030\r \001(\010\022\032\n\022sour" +
      "cerelationship\030\016 \001(\010\022@\n\010producer\030\017 \001(\0132." +
      ".com.iabtechlab.openrtb.v2.BidRequest.Pr" +
      "oducer\022\013\n\003len\030\020 \001(\005\022\026\n\016qagmediarating\030\021 " +
      "\001(\005\022\022\n\nembeddable\030\022 \001(\010\022\020\n\010language\030\023 \001(" +
      "\t\022\r\n\005langb\030\035 \001(\t\0228\n\004data\030\034 \003(\0132*.com.iab" +
      "techlab.openrtb.v2.BidRequest.Data\022>\n\007ne" +
      "twork\030\036 \001(\0132-.com.iabtechlab.openrtb.v2." +
      "BidRequest.Network\022>\n\007channel\030\037 \001(\0132-.co" +
      "m.iabtechlab.openrtb.v2.BidRequest.Chann" +
      "el*\005\010d\020\220NJ\004\010\032\020\033\032[\n\010Producer\022\n\n\002id\030\001 \001(\t\022" +
      "\014\n\004name\030\002 \001(\t\022\021\n\006cattax\030\005 \001(\005:\0011\022\013\n\003cat\030" +
      "\003 \003(\t\022\016\n\006domain\030\004 \001(\t*\005\010d\020\220N\032:\n\007Network\022" +
      "\n\n\002id\030\001 \001(\t\022\014\n\004name\030\002 \001(\t\022\016\n\006domain\030\003 \001(" +
      "\t*\005\010d\020\220N\032:\n\007Channel\022\n\n\002id\030\001 \001(\t\022\014\n\004name\030" +
      "\002 \001(\t\022\016\n\006domain\030\003 \001(\t*\005\010d\020\220N\032\314\004\n\006Device\022" +
      "\013\n\003dnt\030\001 \001(\010\022\n\n\002ua\030\002 \001(\t\022\n\n\002ip\030\003 \001(\t\0226\n\003" +
      "geo\030\004 \001(\0132).com.iabtechlab.openrtb.v2.Bi" +
      "dRequest.Geo\022\017\n\007didsha1\030\005 \001(\t\022\016\n\006didmd5\030" +
      "\006 \001(\t\022\020\n\010dpidsha1\030\007 \001(\t\022\017\n\007dpidmd5\030\010 \001(\t" +
      "\022\014\n\004ipv6\030\t \001(\t\022\017\n\007carrier\030\n \001(\t\022\020\n\010langu" +
      "age\030\013 \001(\t\022\r\n\005langb\030  \001(\t\022\014\n\004make\030\014 \001(\t\022\r" +
      "\n\005model\030\r \001(\t\022\n\n\002os\030\016 \001(\t\022\013\n\003osv\030\017 \001(\t\022\013" +
      "\n\003hwv\030\030 \001(\t\022\t\n\001w\030\031 \001(\005\022\t\n\001h\030\032 \001(\005\022\013\n\003ppi" +
      "\030\033 \001(\005\022\017\n\007pxratio\030\034 \001(\001\022\n\n\002js\030\020 \001(\010\022\020\n\010g" +
      "eofetch\030\035 \001(\010\022\026\n\016connectiontype\030\021 \001(\005\022\022\n" +
      "\ndevicetype\030\022 \001(\005\022\020\n\010flashver\030\023 \001(\t\022\013\n\003i" +
      "fa\030\024 \001(\t\022\017\n\007macsha1\030\025 \001(\t\022\016\n\006macmd5\030\026 \001(" +
      "\t\022\013\n\003lmt\030\027 \001(\010\022\016\n\006mccmnc\030\036 \001(\t\022<\n\003sua\030\037 " +
      "\001(\0132/.com.iabtechlab.openrtb.v2.BidReque" +
      "st.UserAgent*\005\010d\020\220N\032\337\001\n\003Geo\022\013\n\003lat\030\001 \001(\001" +
      "\022\013\n\003lon\030\002 \001(\001\022\017\n\007country\030\003 \001(\t\022\016\n\006region" +
      "\030\004 \001(\t\022\025\n\rregionfips104\030\005 \001(\t\022\r\n\005metro\030\006" +
      " \001(\t\022\014\n\004city\030\007 \001(\t\022\013\n\003zip\030\010 \001(\t\022\014\n\004type\030" +
      "\t \001(\005\022\020\n\010accuracy\030\013 \001(\005\022\017\n\007lastfix\030\014 \001(\005" +
      "\022\021\n\tipservice\030\r \001(\005\022\021\n\tutcoffset\030\n \001(\005*\005" +
      "\010d\020\220N\032\367\001\n\tUserAgent\022D\n\010browsers\030\001 \003(\01322." +
      "com.iabtechlab.openrtb.v2.BidRequest.Bra" +
      "ndVersion\022D\n\010platform\030\002 \001(\01322.com.iabtec" +
      "hlab.openrtb.v2.BidRequest.BrandVersion\022" +
      "\016\n\006mobile\030\003 \001(\010\022\024\n\014architecture\030\004 \001(\t\022\017\n" +
      "\007bitness\030\005 \001(\t\022\r\n\005model\030\006 \001(\t\022\021\n\006source\030" +
      "\007 \001(\005:\0010*\005\010d\020\220N\0325\n\014BrandVersion\022\r\n\005brand" +
      "\030\001 \001(\t\022\017\n\007version\030\002 \003(\t*\005\010d\020\220N\032\361\001\n\004User\022" +
      "\n\n\002id\030\001 \001(\t\022\020\n\010buyeruid\030\002 \001(\t\022\013\n\003yob\030\003 \001" +
      "(\005\022\016\n\006gender\030\004 \001(\t\022\020\n\010keywords\030\005 \001(\t\022\022\n\n" +
      "customdata\030\006 \001(\t\0226\n\003geo\030\007 \001(\0132).com.iabt" +
      "echlab.openrtb.v2.BidRequest.Geo\0228\n\004data" +
      "\030\010 \003(\0132*.com.iabtechlab.openrtb.v2.BidRe" +
      "quest.Data\022\017\n\007consent\030\n \001(\t*\005\010d\020\220N\032\247\001\n\004D" +
      "ata\022\n\n\002id\030\001 \001(\t\022\014\n\004name\030\002 \001(\t\022C\n\007segment" +
      "\030\003 \003(\01322.com.iabtechlab.openrtb.v2.BidRe" +
      "quest.Data.Segment\0329\n\007Segment\022\n\n\002id\030\001 \001(" +
      "\t\022\014\n\004name\030\002 \001(\t\022\r\n\005value\030\003 \001(\t*\005\010d\020\220N*\005\010" +
      "d\020\220N\032`\n\004Regs\022\r\n\005coppa\030\001 \001(\010\022\013\n\003gpp\030\002 \001(\t" +
      "\022\023\n\007gpp_sid\030\003 \003(\005B\002\020\001\022\014\n\004gdpr\030\004 \001(\010\022\022\n\nu" +
      "s_privacy\030\005 \001(\t*\005\010d\020\220N*\005\010d\020\220NB\033\n\031distrib" +
      "utionchannel_oneof\"\343\006\n\013BidResponse\022\n\n\002id" +
      "\030\001 \002(\t\022?\n\007seatbid\030\002 \003(\0132..com.iabtechlab" +
      ".openrtb.v2.BidResponse.SeatBid\022\r\n\005bidid" +
      "\030\003 \001(\t\022\013\n\003cur\030\004 \001(\t\022\022\n\ncustomdata\030\005 \001(\t\022" +
      "\013\n\003nbr\030\006 \001(\005\032\302\005\n\007SeatBid\022?\n\003bid\030\001 \003(\01322." +
      "com.iabtechlab.openrtb.v2.BidResponse.Se" +
      "atBid.Bid\022\014\n\004seat\030\002 \001(\t\022\024\n\005group\030\003 \001(\010:\005" +
      "false\032\312\004\n\003Bid\022\n\n\002id\030\001 \002(\t\022\r\n\005impid\030\002 \002(\t" +
      "\022\r\n\005price\030\003 \002(\001\022\014\n\004adid\030\004 \001(\t\022\014\n\004nurl\030\005 " +
      "\001(\t\022\r\n\003adm\030\006 \001(\tH\000\022?\n\nadm_native\0302 \001(\0132)" +
      ".com.iabtechlab.openrtb.v2.NativeRespons" +
      "eH\000\022\017\n\007adomain\030\007 \003(\t\022\016\n\006bundle\030\016 \001(\t\022\014\n\004" +
      "iurl\030\010 \001(\t\022\013\n\003cid\030\t \001(\t\022\014\n\004crid\030\n \001(\t\022\021\n" +
      "\006cattax\030\036 \001(\005:\0011\022\013\n\003cat\030\017 \003(\t\022\020\n\004attr\030\013 " +
      "\003(\005B\002\020\001\022\020\n\004apis\030\037 \003(\005B\002\020\001\022\017\n\003api\030\022 \001(\005B\002" +
      "\030\001\022\020\n\010protocol\030\023 \001(\005\022\026\n\016qagmediarating\030\024" +
      " \001(\005\022\016\n\006dealid\030\r \001(\t\022\t\n\001w\030\020 \001(\005\022\t\n\001h\030\021 \001" +
      "(\005\022\013\n\003exp\030\025 \001(\005\022\014\n\004burl\030\026 \001(\t\022\014\n\004lurl\030\027 " +
      "\001(\t\022\016\n\006tactic\030\030 \001(\t\022\020\n\010language\030\031 \001(\t\022\r\n" +
      "\005langb\030\035 \001(\t\022\016\n\006wratio\030\032 \001(\005\022\016\n\006hratio\030\033" +
      " \001(\005\022\013\n\003dur\030  \001(\005\022\r\n\005mtype\030! \001(\005\022\024\n\tslot" +
      "inpod\030\034 \001(\005:\0010*\005\010d\020\220NB\013\n\tadm_oneof*\005\010d\020\220" +
      "N*\005\010d\020\220N\"\244\007\n\rNativeRequest\022\013\n\003ver\030\001 \001(\t\022" +
      "\016\n\006layout\030\002 \001(\005\022\016\n\006adunit\030\003 \001(\005\022\017\n\007conte" +
      "xt\030\007 \001(\005\022\026\n\016contextsubtype\030\010 \001(\005\022\021\n\tplcm" +
      "ttype\030\t \001(\005\022\023\n\010plcmtcnt\030\004 \001(\005:\0011\022\016\n\003seq\030" +
      "\005 \001(\005:\0010\022>\n\006assets\030\006 \003(\0132..com.iabtechla" +
      "b.openrtb.v2.NativeRequest.Asset\022\023\n\013aurl" +
      "support\030\013 \001(\010\022\023\n\013durlsupport\030\014 \001(\010\022M\n\rev" +
      "enttrackers\030\r \003(\01326.com.iabtechlab.openr" +
      "tb.v2.NativeRequest.EventTrackers\022\017\n\007pri" +
      "vacy\030\016 \001(\010\032\373\003\n\005Asset\022\n\n\002id\030\001 \002(\005\022\027\n\010requ" +
      "ired\030\002 \001(\010:\005false\022E\n\005title\030\003 \001(\01324.com.i" +
      "abtechlab.openrtb.v2.NativeRequest.Asset" +
      ".TitleH\000\022C\n\003img\030\004 \001(\01324.com.iabtechlab.o" +
      "penrtb.v2.NativeRequest.Asset.ImageH\000\022@\n" +
      "\005video\030\005 \001(\0132/.com.iabtechlab.openrtb.v2" +
      ".BidRequest.Imp.VideoH\000\022C\n\004data\030\006 \001(\01323." +
      "com.iabtechlab.openrtb.v2.NativeRequest." +
      "Asset.DataH\000\032\033\n\005Title\022\013\n\003len\030\001 \002(\005*\005\010d\020\220" +
      "N\032]\n\005Image\022\014\n\004type\030\001 \001(\005\022\t\n\001w\030\002 \001(\005\022\t\n\001h" +
      "\030\003 \001(\005\022\014\n\004wmin\030\004 \001(\005\022\014\n\004hmin\030\005 \001(\005\022\r\n\005mi" +
      "mes\030\006 \003(\t*\005\010d\020\220N\032(\n\004Data\022\014\n\004type\030\001 \002(\005\022\013" +
      "\n\003len\030\002 \001(\005*\005\010d\020\220N*\005\010d\020\220NB\r\n\013asset_oneof" +
      "\0326\n\rEventTrackers\022\r\n\005event\030\001 \002(\005\022\017\n\007meth" +
      "ods\030\002 \003(\005*\005\010d\020\220N*\005\010d\020\220N\"\312\010\n\016NativeRespon" +
      "se\022\013\n\003ver\030\001 \001(\t\022?\n\006assets\030\002 \003(\0132/.com.ia" +
      "btechlab.openrtb.v2.NativeResponse.Asset" +
      "\022\021\n\tassetsurl\030\006 \001(\t\022\016\n\006dcourl\030\007 \001(\t\022<\n\004l" +
      "ink\030\003 \002(\0132..com.iabtechlab.openrtb.v2.Na" +
      "tiveResponse.Link\022\023\n\013imptrackers\030\004 \003(\t\022\021" +
      "\n\tjstracker\030\005 \001(\t\022M\n\reventtrackers\030\010 \003(\013" +
      "26.com.iabtechlab.openrtb.v2.NativeRespo" +
      "nse.EventTracker\022\017\n\007privacy\030\t \001(\t\032C\n\004Lin" +
      "k\022\013\n\003url\030\001 \002(\t\022\025\n\rclicktrackers\030\002 \003(\t\022\020\n" +
      "\010fallback\030\003 \001(\t*\005\010d\020\220N\032\361\004\n\005Asset\022\n\n\002id\030\001" +
      " \002(\005\022\027\n\010required\030\002 \001(\010:\005false\022F\n\005title\030\003" +
      " \001(\01325.com.iabtechlab.openrtb.v2.NativeR" +
      "esponse.Asset.TitleH\000\022D\n\003img\030\004 \001(\01325.com" +
      ".iabtechlab.openrtb.v2.NativeResponse.As" +
      "set.ImageH\000\022F\n\005video\030\005 \001(\01325.com.iabtech" +
      "lab.openrtb.v2.NativeResponse.Asset.Vide" +
      "oH\000\022D\n\004data\030\006 \001(\01324.com.iabtechlab.openr" +
      "tb.v2.NativeResponse.Asset.DataH\000\022<\n\004lin" +
      "k\030\007 \001(\0132..com.iabtechlab.openrtb.v2.Nati" +
      "veResponse.Link\032)\n\005Title\022\014\n\004text\030\001 \002(\t\022\013" +
      "\n\003len\030\002 \001(\005*\005\010d\020\220N\032?\n\005Image\022\014\n\004type\030\004 \001(" +
      "\005\022\013\n\003url\030\001 \002(\t\022\t\n\001w\030\002 \001(\005\022\t\n\001h\030\003 \001(\005*\005\010d" +
      "\020\220N\032F\n\004Data\022\014\n\004type\030\003 \001(\005\022\013\n\003len\030\004 \001(\005\022\r" +
      "\n\005label\030\001 \001(\t\022\r\n\005value\030\002 \002(\t*\005\010d\020\220N\032\037\n\005V" +
      "ideo\022\017\n\007vasttag\030\001 \002(\t*\005\010d\020\220N*\005\010d\020\220NB\r\n\013a" +
      "sset_oneof\032A\n\014EventTracker\022\r\n\005event\030\001 \001(" +
      "\005\022\016\n\006method\030\002 \002(\005\022\013\n\003url\030\003 \001(\t*\005\010d\020\220N*\005\010" +
      "d\020\220N*U\n\014BannerAdType\022\021\n\rXHTML_TEXT_AD\020\001\022" +
      "\023\n\017XHTML_BANNER_AD\020\002\022\021\n\rJAVASCRIPT_AD\020\003\022" +
      "\n\n\006IFRAME\020\004*t\n\010LayoutId\022\020\n\014CONTENT_WALL\020" +
      "\001\022\014\n\010APP_WALL\020\002\022\r\n\tNEWS_FEED\020\003\022\r\n\tCHAT_L" +
      "IST\020\004\022\014\n\010CAROUSEL\020\005\022\022\n\016CONTENT_STREAM\020\006\022" +
      "\010\n\004GRID\020\007*|\n\010AdUnitId\022\024\n\020PAID_SEARCH_UNI" +
      "T\020\001\022\031\n\025RECOMMENDATION_WIDGET\020\002\022\024\n\020PROMOT" +
      "ED_LISTING\020\003\022\024\n\020IAB_IN_AD_NATIVE\020\004\022\023\n\017AD" +
      "UNITID_CUSTOM\020\005*3\n\013ContextType\022\013\n\007CONTEN" +
      "T\020\001\022\n\n\006SOCIAL\020\002\022\013\n\007PRODUCT\020\003B\tB\007OpenRtb"
    };
    descriptor = com.google.protobuf.Descriptors.FileDescriptor
      .internalBuildGeneratedFileFrom(descriptorData,
        new com.google.protobuf.Descriptors.FileDescriptor[] {
        });
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_descriptor =
      getDescriptor().getMessageTypes().get(0);
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_BidRequest_descriptor,
        new java.lang.String[] { "Id", "Imp", "Site", "App", "Dooh", "Device", "Regs", "User", "At", "Tmax", "Wseat", "Allimps", "Cur", "Bcat", "Cattax", "Badv", "Bapp", "Test", "Bseat", "Wlang", "Wlangb", "Source", "DistributionchannelOneof", });
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Source_descriptor =
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_descriptor.getNestedTypes().get(0);
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Source_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_BidRequest_Source_descriptor,
        new java.lang.String[] { "Fd", "Tid", "Pchain", });
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_descriptor =
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_descriptor.getNestedTypes().get(1);
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_descriptor,
        new java.lang.String[] { "Id", "Banner", "Video", "Audio", "Displaymanager", "Displaymanagerver", "Instl", "Tagid", "Bidfloor", "Bidfloorcur", "Clickbrowser", "Secure", "Iframebuster", "Rwdd", "Ssai", "Pmp", "Native", "Exp", "Metric", "Qty", "Dt", "Refresh", });
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Metric_descriptor =
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_descriptor.getNestedTypes().get(0);
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Metric_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Metric_descriptor,
        new java.lang.String[] { "Type", "Value", "Vendor", });
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Banner_descriptor =
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_descriptor.getNestedTypes().get(1);
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Banner_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Banner_descriptor,
        new java.lang.String[] { "W", "H", "Format", "Wmax", "Hmax", "Wmin", "Hmin", "Id", "Pos", "Btype", "Battr", "Mimes", "Topframe", "Expdir", "Api", "Vcm", });
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Banner_Format_descriptor =
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Banner_descriptor.getNestedTypes().get(0);
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Banner_Format_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Banner_Format_descriptor,
        new java.lang.String[] { "W", "H", "Wratio", "Hratio", "Wmin", });
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Video_descriptor =
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_descriptor.getNestedTypes().get(2);
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Video_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Video_descriptor,
        new java.lang.String[] { "Mimes", "Linearity", "Minduration", "Maxduration", "Protocol", "Protocols", "W", "H", "Startdelay", "Maxseq", "Poddur", "Skip", "Skipmin", "Skipafter", "Sequence", "Slotinpod", "Mincpmpersec", "Battr", "Maxextended", "Minbitrate", "Maxbitrate", "Boxingallowed", "Playbackmethod", "Delivery", "Pos", "Companionad", "Companionad21", "Api", "Companiontype", "Podid", "Podseq", "Rqddurs", "Placement", "Plcmt", "Playbackend", });
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Video_CompanionAd_descriptor =
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Video_descriptor.getNestedTypes().get(0);
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Video_CompanionAd_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Video_CompanionAd_descriptor,
        new java.lang.String[] { "Banner", });
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Audio_descriptor =
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_descriptor.getNestedTypes().get(3);
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Audio_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Audio_descriptor,
        new java.lang.String[] { "Mimes", "Minduration", "Maxduration", "Poddur", "Protocols", "Startdelay", "Rqddurs", "Podid", "Podseq", "Sequence", "Slotinpod", "Mincpmpersec", "Battr", "Maxextended", "Minbitrate", "Maxbitrate", "Delivery", "Companionad", "Api", "Companiontype", "Maxseq", "Feed", "Stitched", "Nvol", });
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Native_descriptor =
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_descriptor.getNestedTypes().get(4);
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Native_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Native_descriptor,
        new java.lang.String[] { "Request", "RequestNative", "Ver", "Api", "Battr", "RequestOneof", });
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Qty_descriptor =
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_descriptor.getNestedTypes().get(5);
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Qty_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Qty_descriptor,
        new java.lang.String[] { "Multiplier", "Sourcetype", "Vendor", });
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Refresh_descriptor =
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_descriptor.getNestedTypes().get(6);
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Refresh_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Refresh_descriptor,
        new java.lang.String[] { "Refsettings", "Count", });
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Refresh_RefSettings_descriptor =
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Refresh_descriptor.getNestedTypes().get(0);
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Refresh_RefSettings_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Refresh_RefSettings_descriptor,
        new java.lang.String[] { "Reftype", "Minint", });
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Pmp_descriptor =
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_descriptor.getNestedTypes().get(7);
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Pmp_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Pmp_descriptor,
        new java.lang.String[] { "PrivateAuction", "Deals", });
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Pmp_Deal_descriptor =
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Pmp_descriptor.getNestedTypes().get(0);
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Pmp_Deal_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_BidRequest_Imp_Pmp_Deal_descriptor,
        new java.lang.String[] { "Id", "Bidfloor", "Bidfloorcur", "Wseat", "Wadomain", "At", });
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Site_descriptor =
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_descriptor.getNestedTypes().get(2);
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Site_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_BidRequest_Site_descriptor,
        new java.lang.String[] { "Id", "Name", "Domain", "Cattax", "Cat", "Sectioncat", "Pagecat", "Page", "Privacypolicy", "Ref", "Search", "Publisher", "Content", "Keywords", "Mobile", });
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_App_descriptor =
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_descriptor.getNestedTypes().get(3);
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_App_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_BidRequest_App_descriptor,
        new java.lang.String[] { "Id", "Name", "Domain", "Cattax", "Cat", "Sectioncat", "Pagecat", "Ver", "Bundle", "Privacypolicy", "Paid", "Publisher", "Content", "Keywords", "Storeurl", });
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Dooh_descriptor =
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_descriptor.getNestedTypes().get(4);
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Dooh_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_BidRequest_Dooh_descriptor,
        new java.lang.String[] { "Id", "Name", "Venuetype", "Venuetypetax", "Publisher", "Domain", "Keywords", "Content", });
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Publisher_descriptor =
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_descriptor.getNestedTypes().get(5);
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Publisher_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_BidRequest_Publisher_descriptor,
        new java.lang.String[] { "Id", "Name", "Cattax", "Cat", "Domain", });
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Content_descriptor =
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_descriptor.getNestedTypes().get(6);
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Content_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_BidRequest_Content_descriptor,
        new java.lang.String[] { "Id", "Episode", "Title", "Series", "Season", "Artist", "Genre", "Album", "Isrc", "Url", "Cattax", "Cat", "Prodq", "Videoquality", "Keywords", "Contentrating", "Userrating", "Context", "Context22", "Livestream", "Sourcerelationship", "Producer", "Len", "Qagmediarating", "Embeddable", "Language", "Langb", "Data", "Network", "Channel", });
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Producer_descriptor =
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_descriptor.getNestedTypes().get(7);
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Producer_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_BidRequest_Producer_descriptor,
        new java.lang.String[] { "Id", "Name", "Cattax", "Cat", "Domain", });
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Network_descriptor =
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_descriptor.getNestedTypes().get(8);
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Network_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_BidRequest_Network_descriptor,
        new java.lang.String[] { "Id", "Name", "Domain", });
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Channel_descriptor =
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_descriptor.getNestedTypes().get(9);
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Channel_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_BidRequest_Channel_descriptor,
        new java.lang.String[] { "Id", "Name", "Domain", });
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Device_descriptor =
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_descriptor.getNestedTypes().get(10);
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Device_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_BidRequest_Device_descriptor,
        new java.lang.String[] { "Dnt", "Ua", "Ip", "Geo", "Didsha1", "Didmd5", "Dpidsha1", "Dpidmd5", "Ipv6", "Carrier", "Language", "Langb", "Make", "Model", "Os", "Osv", "Hwv", "W", "H", "Ppi", "Pxratio", "Js", "Geofetch", "Connectiontype", "Devicetype", "Flashver", "Ifa", "Macsha1", "Macmd5", "Lmt", "Mccmnc", "Sua", });
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Geo_descriptor =
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_descriptor.getNestedTypes().get(11);
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Geo_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_BidRequest_Geo_descriptor,
        new java.lang.String[] { "Lat", "Lon", "Country", "Region", "Regionfips104", "Metro", "City", "Zip", "Type", "Accuracy", "Lastfix", "Ipservice", "Utcoffset", });
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_UserAgent_descriptor =
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_descriptor.getNestedTypes().get(12);
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_UserAgent_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_BidRequest_UserAgent_descriptor,
        new java.lang.String[] { "Browsers", "Platform", "Mobile", "Architecture", "Bitness", "Model", "Source", });
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_BrandVersion_descriptor =
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_descriptor.getNestedTypes().get(13);
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_BrandVersion_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_BidRequest_BrandVersion_descriptor,
        new java.lang.String[] { "Brand", "Version", });
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_User_descriptor =
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_descriptor.getNestedTypes().get(14);
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_User_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_BidRequest_User_descriptor,
        new java.lang.String[] { "Id", "Buyeruid", "Yob", "Gender", "Keywords", "Customdata", "Geo", "Data", "Consent", });
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Data_descriptor =
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_descriptor.getNestedTypes().get(15);
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Data_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_BidRequest_Data_descriptor,
        new java.lang.String[] { "Id", "Name", "Segment", });
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Data_Segment_descriptor =
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_Data_descriptor.getNestedTypes().get(0);
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Data_Segment_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_BidRequest_Data_Segment_descriptor,
        new java.lang.String[] { "Id", "Name", "Value", });
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Regs_descriptor =
      internal_static_com_iabtechlab_openrtb_v2_BidRequest_descriptor.getNestedTypes().get(16);
    internal_static_com_iabtechlab_openrtb_v2_BidRequest_Regs_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_BidRequest_Regs_descriptor,
        new java.lang.String[] { "Coppa", "Gpp", "GppSid", "Gdpr", "UsPrivacy", });
    internal_static_com_iabtechlab_openrtb_v2_BidResponse_descriptor =
      getDescriptor().getMessageTypes().get(1);
    internal_static_com_iabtechlab_openrtb_v2_BidResponse_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_BidResponse_descriptor,
        new java.lang.String[] { "Id", "Seatbid", "Bidid", "Cur", "Customdata", "Nbr", });
    internal_static_com_iabtechlab_openrtb_v2_BidResponse_SeatBid_descriptor =
      internal_static_com_iabtechlab_openrtb_v2_BidResponse_descriptor.getNestedTypes().get(0);
    internal_static_com_iabtechlab_openrtb_v2_BidResponse_SeatBid_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_BidResponse_SeatBid_descriptor,
        new java.lang.String[] { "Bid", "Seat", "Group", });
    internal_static_com_iabtechlab_openrtb_v2_BidResponse_SeatBid_Bid_descriptor =
      internal_static_com_iabtechlab_openrtb_v2_BidResponse_SeatBid_descriptor.getNestedTypes().get(0);
    internal_static_com_iabtechlab_openrtb_v2_BidResponse_SeatBid_Bid_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_BidResponse_SeatBid_Bid_descriptor,
        new java.lang.String[] { "Id", "Impid", "Price", "Adid", "Nurl", "Adm", "AdmNative", "Adomain", "Bundle", "Iurl", "Cid", "Crid", "Cattax", "Cat", "Attr", "Apis", "Api", "Protocol", "Qagmediarating", "Dealid", "W", "H", "Exp", "Burl", "Lurl", "Tactic", "Language", "Langb", "Wratio", "Hratio", "Dur", "Mtype", "Slotinpod", "AdmOneof", });
    internal_static_com_iabtechlab_openrtb_v2_NativeRequest_descriptor =
      getDescriptor().getMessageTypes().get(2);
    internal_static_com_iabtechlab_openrtb_v2_NativeRequest_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_NativeRequest_descriptor,
        new java.lang.String[] { "Ver", "Layout", "Adunit", "Context", "Contextsubtype", "Plcmttype", "Plcmtcnt", "Seq", "Assets", "Aurlsupport", "Durlsupport", "Eventtrackers", "Privacy", });
    internal_static_com_iabtechlab_openrtb_v2_NativeRequest_Asset_descriptor =
      internal_static_com_iabtechlab_openrtb_v2_NativeRequest_descriptor.getNestedTypes().get(0);
    internal_static_com_iabtechlab_openrtb_v2_NativeRequest_Asset_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_NativeRequest_Asset_descriptor,
        new java.lang.String[] { "Id", "Required", "Title", "Img", "Video", "Data", "AssetOneof", });
    internal_static_com_iabtechlab_openrtb_v2_NativeRequest_Asset_Title_descriptor =
      internal_static_com_iabtechlab_openrtb_v2_NativeRequest_Asset_descriptor.getNestedTypes().get(0);
    internal_static_com_iabtechlab_openrtb_v2_NativeRequest_Asset_Title_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_NativeRequest_Asset_Title_descriptor,
        new java.lang.String[] { "Len", });
    internal_static_com_iabtechlab_openrtb_v2_NativeRequest_Asset_Image_descriptor =
      internal_static_com_iabtechlab_openrtb_v2_NativeRequest_Asset_descriptor.getNestedTypes().get(1);
    internal_static_com_iabtechlab_openrtb_v2_NativeRequest_Asset_Image_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_NativeRequest_Asset_Image_descriptor,
        new java.lang.String[] { "Type", "W", "H", "Wmin", "Hmin", "Mimes", });
    internal_static_com_iabtechlab_openrtb_v2_NativeRequest_Asset_Data_descriptor =
      internal_static_com_iabtechlab_openrtb_v2_NativeRequest_Asset_descriptor.getNestedTypes().get(2);
    internal_static_com_iabtechlab_openrtb_v2_NativeRequest_Asset_Data_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_NativeRequest_Asset_Data_descriptor,
        new java.lang.String[] { "Type", "Len", });
    internal_static_com_iabtechlab_openrtb_v2_NativeRequest_EventTrackers_descriptor =
      internal_static_com_iabtechlab_openrtb_v2_NativeRequest_descriptor.getNestedTypes().get(1);
    internal_static_com_iabtechlab_openrtb_v2_NativeRequest_EventTrackers_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_NativeRequest_EventTrackers_descriptor,
        new java.lang.String[] { "Event", "Methods", });
    internal_static_com_iabtechlab_openrtb_v2_NativeResponse_descriptor =
      getDescriptor().getMessageTypes().get(3);
    internal_static_com_iabtechlab_openrtb_v2_NativeResponse_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_NativeResponse_descriptor,
        new java.lang.String[] { "Ver", "Assets", "Assetsurl", "Dcourl", "Link", "Imptrackers", "Jstracker", "Eventtrackers", "Privacy", });
    internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Link_descriptor =
      internal_static_com_iabtechlab_openrtb_v2_NativeResponse_descriptor.getNestedTypes().get(0);
    internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Link_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Link_descriptor,
        new java.lang.String[] { "Url", "Clicktrackers", "Fallback", });
    internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_descriptor =
      internal_static_com_iabtechlab_openrtb_v2_NativeResponse_descriptor.getNestedTypes().get(1);
    internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_descriptor,
        new java.lang.String[] { "Id", "Required", "Title", "Img", "Video", "Data", "Link", "AssetOneof", });
    internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_Title_descriptor =
      internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_descriptor.getNestedTypes().get(0);
    internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_Title_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_Title_descriptor,
        new java.lang.String[] { "Text", "Len", });
    internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_Image_descriptor =
      internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_descriptor.getNestedTypes().get(1);
    internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_Image_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_Image_descriptor,
        new java.lang.String[] { "Type", "Url", "W", "H", });
    internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_Data_descriptor =
      internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_descriptor.getNestedTypes().get(2);
    internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_Data_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_Data_descriptor,
        new java.lang.String[] { "Type", "Len", "Label", "Value", });
    internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_Video_descriptor =
      internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_descriptor.getNestedTypes().get(3);
    internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_Video_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_NativeResponse_Asset_Video_descriptor,
        new java.lang.String[] { "Vasttag", });
    internal_static_com_iabtechlab_openrtb_v2_NativeResponse_EventTracker_descriptor =
      internal_static_com_iabtechlab_openrtb_v2_NativeResponse_descriptor.getNestedTypes().get(2);
    internal_static_com_iabtechlab_openrtb_v2_NativeResponse_EventTracker_fieldAccessorTable = new
      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
        internal_static_com_iabtechlab_openrtb_v2_NativeResponse_EventTracker_descriptor,
        new java.lang.String[] { "Event", "Method", "Url", });
  }

  // @@protoc_insertion_point(outer_class_scope)
}
